﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-永远的船长-随笔分类-开源相关</title><link>http://www.blogjava.net/buaacaptain/category/11575.html</link><description>只有偏执狂才能生存</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 18:45:49 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 18:45:49 GMT</pubDate><ttl>60</ttl><item><title>转:appfuse结合eclipse开发流程</title><link>http://www.blogjava.net/buaacaptain/archive/2006/07/02/56171.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Sun, 02 Jul 2006 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/07/02/56171.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/56171.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/07/02/56171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/56171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/56171.html</trackback:ping><description><![CDATA[Appfuse应用的核心在于ant build任务的灵活应用和xdoclet模板的修改与使用。重要的工具是其提供的appgen，通过对ant build任务和appgen xdocet模板的修改将appfuse与自己的项目进行融合、与IDE进行融合。所以要用appfuse，学习ant工具和xdoclet是必不可少的第一步。<br />前提所需的软件<br />jdk1.4.2.6<br />tomcat5.0.28<br />ant1.6.2<br />appfuse1.82<br />mysql4.x
<p>以上软件请访问<br /><a href="http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseQuickStart_zh">http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseQuickStart_zh</a><br />根据相关提示下载<br />同时对以上变量，都设置相关的HOME变量及路径。</p><p>下面开始一步步操作完成appfuse的布署工作</p><p>1，解压appfuse1.8.2（或更高版本），会产生一个appfuse的目录。<br />2，打开eclipse3.0或eclipse3.1，选择菜单，“新建工程”--&gt;"Java Project"----&gt;工程名"appfuse"后，指定一个工程目录后，完成。<br />3，先复制第一步中appfuse目录下所有文件，然后右键点击"appfuse"工程名，选择“粘贴”，把appfuse的所有的文件导入到appfuse工程中。<br />4，在eclipse下选择"windows"菜单---&gt;"Preference"菜单---&gt;"ant"---&gt;"Runtime"----&gt;点“ant      home”按钮,设备ant-home目录，同时复制junit.jar到ant安装目录下的lib目录里<br />5,在安装mysql服务器后，如果设置了密码的话，要点，windows菜单---&gt;show views---&gt; ant 。出现ant工具界面，在界面上，点add buildfiles图标，把appfuse工程根目录下的build.xml文件中附加进来，然后再打开properties.xml文件，修改里面的root用户的密码为你的mysql数据库访问时的密码。然后在ant菜单界面中展开target列表，选择，setup目录安装所有装备工作，<br />详细ant任务可以参照<a href="http://www.kingbit.com/appfuse/index.php">http://www.kingbit.com/appfuse/index.php</a>上所描述的ant任务详解。<br />运行ant setup-tomcat 然后再运行，ant start-tomcat<br />然后在浏览器中打<a href="http://localhost:8080/appfuse">http://localhost:8080/appfuse</a><br />看看有没有出现界面<br />操作用户名及密码是tomcat tomcat<br />6,当上面都配置正确后，我们就来开始写一个新的操作了，先写个dao类下的model类<br />在eclipse下，展开src/dao文档结构，在org.appfuse.model下面，建个Person.java文件，<br />内容如下图：</p><p>/*<br /> * Created on 2006-5-22<br /> *<br /> * TODO To change the template for this generated file go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />package org.appfuse.model;</p><p>/**<br /> * @author Administrator<br /> *<br /> * TODO To change the template for this generated type comment go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> * @hibernate.class table="person"<br /> */<br />public class Person  extends BaseObject{<br /> private Long id;<br /> private String first_name;<br /> <br /> /**<br />  * @return Returns the id.<br />  * @hibernate.id column="id"  generator-class="increment"<br />     *               <br />  */<br /> public Long getId() {<br />  return id;<br /> }<br /> /**<br />  * @param id The id to set.<br />  */<br /> public void setId(Long id) {<br />  this.id = id;<br /> }<br /> /* (non-Javadoc)<br />  * @see org.appfuse.model.BaseObject#toString()<br />  */<br /> <br /> public String toString() {<br />  // TODO Auto-generated method stub<br />  return null;<br /> }<br /> /* (non-Javadoc)<br />  * @see org.appfuse.model.BaseObject#equals(java.lang.Object)<br />  */<br /> public boolean equals(Object o) {<br />  // TODO Auto-generated method stub<br />  return false;<br /> }<br /> /* (non-Javadoc)<br />  * @see org.appfuse.model.BaseObject#hashCode()<br />  */<br /> public int hashCode() {<br />  // TODO Auto-generated method stub<br />  return 0;<br /> }<br /> <br /> /**<br />  * @return Returns the first_name.<br />  * @hibernate.property column="first_name" not-null="true"<br />  */<br /> public String getFirst_name() {<br />  return first_name;<br /> }<br /> /**<br />  * @param first_name The first_name to set.<br />  * @spring.validator type="required" //该字段需要验证，用Spring的校验机制<br />  */<br /> public void setFirst_name(String first_name) {<br />  this.first_name = first_name;<br /> }<br />}</p><p><br />在以上代码中注释javadoc区域中添加上xdoclet在生成hibernate所用到的XML文件的一些O/R映射信息。</p><p>建好上以Person.java后，我们就开始利用xdoclet工具，配合ant任务，生成我们所需用到了数据库表结构了，<br />点ant db-create 后，可以在控制台下看到一系列建表的语句，同时可以到mysql控制台查看到相关信息.<br />表建好后，我们就开始利用appgen自动生成appfuse所需要的其它dao操作类，manage业务类，controller控制器类及Person.hbm.xml等相关文件<br />。操作过程如下，到dos命令行模式下，找到工程所在的根目录下\extras\appgen目录，点运行ant install-detailed<br />会根据提示，建Person及person相关文件。Build成功后，再回到eclipse下，右键点工程文件名appfuse,选择Refresh ,再运行ant deploy命令，再重新启TOMCAT,这样一个Person的添加，删除操作功能模块就完成了，开发就是这么easy and fast!!^_^<br />@spring.validator type="required" 是另外附</p><p>appgen生成的类文件如下：</p><p>PersonDAO接口类<br />PersonDAOHibernate接口实现类<br />PersonManager业务接口类<br />PersonManagerImpl.java业务接口实现类<br />PersonController.java控制器类(根据客户端提交的请求，显示的是信息列表)<br />PersonFormController页面控制器类（根据客户端提交的请求，修改，添加，删除操作控制类）</p><p><br />注意在生成dao接口类的时候，appgen会根据Person类中的hibernate的注释标记，生成对应的Person.hbm.xml文件<br />修改org.appfuse.dao.hibernate.applicationContext-hibernate.xml文件，<br />追加<br /> &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />        &lt;property name="mappingResources"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;org/appfuse/model/Role.hbm.xml&lt;/value&gt;<br />                &lt;value&gt;org/appfuse/model/User.hbm.xml&lt;/value&gt;<br />                &lt;value&gt;org/appfuse/model/UserCookie.hbm.xml&lt;/value&gt;<br />                &lt;value&gt;org/appfuse/model/Person.hbm.xml&lt;/value&gt;<br />  &lt;value&gt;org/appfuse/model/Book.hbm.xml&lt;/value&gt;    <br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />        &lt;!-- The property below is commented out b/c it doesn't work when run via<br />             Ant in Eclipse.  It works fine for individual JUnit tests and in IDEA ??<br />        &lt;property name="mappingJarLocations"&gt;<br />            &lt;list&gt;&lt;value&gt;file:dist/appfuse-dao.jar&lt;/value&gt;&lt;/list&gt;<br />        &lt;/property&gt;<br />        --&gt;<br />        &lt;property name="hibernateProperties"&gt;<br />        &lt;props&gt;<br />            &lt;prop key="hibernate.dialect"&gt;@HIBERNATE-DIALECT@&lt;/prop&gt;<br />            &lt;!-- Create/update the database tables automatically when the JVM starts up<br />            &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt; --&gt;<br />            &lt;!-- Turn batching off for better error messages under PostgreSQL <br />            &lt;prop key="hibernate.jdbc.batch_size"&gt;0&lt;/prop&gt; --&gt;<br />        &lt;/props&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    同时指定动态指定接口的实现类<br />&lt;!--Person-START--&gt;<br />    &lt;bean id="personDAO" class="org.appfuse.dao.hibernate.PersonDAOHibernate" autowire="byName"/&gt;<br />    &lt;!--Person-END--&gt;<br />注意在业务接口类操作时，要运用SPRING的IOC进行对业务逻辑的处理，<br />修改org.appfuse.service目录下的，applicationContext-service.xml文件</p><p>追加以下配置</p><p>&lt;!--Person-START--&gt;<br />    &lt;bean id="personManager" parent="txProxyTemplate"&gt;<br />        &lt;property name="target"&gt;<br />            &lt;bean class="org.appfuse.service.impl.PersonManagerImpl" autowire="byName"/&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    &lt;!--Person-END--&gt;<br />在personManagerImpl.java文件中装PersonDao接口的Instance注入到personManager容器中。</p><p> </p><p>PersonDAO接口类</p><p><br />package org.appfuse.dao;</p><p>import java.util.List;</p><p>import org.appfuse.model.Person;</p><p>public interface PersonDAO extends DAO {</p><p>    /**<br />     * Retrieves all of the persons<br />     */<br />    public List getPersons(Person person);</p><p>    /**<br />     * Gets person's information based on primary key. An<br />     * ObjectRetrievalFailureException Runtime Exception is thrown if <br />     * nothing is found.<br />     * <br />     * @param id the person's id<br />     * @return person populated person object<br />     */<br />    public Person getPerson(final Long id);</p><p>    /**<br />     * Saves a person's information<br />     * @param person the object to be saved<br />     */ <br />    public void savePerson(Person person);</p><p> /**<br />     * Removes a person from the database by id<br />     * @param id the person's id<br />     */<br />    public void removePerson(final Long id);<br />}</p><p>PersonDAOHibernate接口实现类</p><p><br />package org.appfuse.dao.hibernate;</p><p>import java.util.List;</p><p>import org.appfuse.model.Person;<br />import org.appfuse.dao.PersonDAO;</p><p>import org.springframework.orm.ObjectRetrievalFailureException;</p><p>public class PersonDAOHibernate extends BaseDAOHibernate implements PersonDAO {</p><p>    /**<br />     * @see org.appfuse.dao.PersonDAO#getPersons(org.appfuse.model.Person)<br />     */<br />    public List getPersons(final Person person) {<br />        return getHibernateTemplate().find("from Person");</p><p>        /* Remove the line above and uncomment this code block if you want <br />           to use Hibernate's Query by Example API.<br />        if (person == null) {<br />            return getHibernateTemplate().find("from Person");<br />        } else {<br />            // filter on properties set in the person<br />            HibernateCallback callback = new HibernateCallback() {<br />                public Object doInHibernate(Session session) throws HibernateException {<br />                    Example ex = Example.create(person).ignoreCase().enableLike(MatchMode.ANYWHERE);<br />                    return session.createCriteria(Person.class).add(ex).list();<br />                }<br />            };<br />            return (List) getHibernateTemplate().execute(callback);<br />        }*/<br />    }</p><p>    /**<br />     * @see org.appfuse.dao.PersonDAO#getPerson(Long id)<br />     */<br />    public Person getPerson(final Long id) {<br />        Person person = (Person) getHibernateTemplate().get(Person.class, id);<br />        if (person == null) {<br />            log.warn("uh oh, person with id '" + id + "' not found...");<br />            throw new ObjectRetrievalFailureException(Person.class, id);<br />        }</p><p>        return person;<br />    }</p><p>    /**<br />     * @see org.appfuse.dao.PersonDAO#savePerson(Person person)<br />     */    <br />    public void savePerson(final Person person) {<br />        getHibernateTemplate().saveOrUpdate(person);<br />    }</p><p>    /**<br />     * @see org.appfuse.dao.PersonDAO#removePerson(Long id)<br />     */<br />    public void removePerson(final Long id) {<br />        getHibernateTemplate().delete(getPerson(id));<br />    }<br />}</p><p> </p><p><br />PersonManager业务接口类</p><p>package org.appfuse.service;</p><p>import java.util.List;</p><p>import org.appfuse.model.Person;<br />import org.appfuse.dao.PersonDAO;</p><p>public interface PersonManager extends Manager {</p><p>    /**<br />     * Setter for DAO, convenient for unit testing<br />     */<br />    public void setPersonDAO(PersonDAO personDAO);</p><p>    /**<br />     * Retrieves all of the persons<br />     */<br />    public List getPersons(Person person);</p><p>    /**<br />     * Gets person's information based on id.<br />     * @param id the person's id<br />     * @return person populated person object<br />     */<br />    public Person getPerson(final String id);</p><p>    /**<br />     * Saves a person's information<br />     * @param person the object to be saved<br />     */<br />    public void savePerson(Person person);</p><p>    /**<br />     * Removes a person from the database by id<br />     * @param id the person's id<br />     */<br />    public void removePerson(final String id);<br />}</p><p><br />PersonManagerImpl业务接口实现类</p><p>package org.appfuse.service.impl;</p><p>import java.util.List;</p><p>import org.appfuse.model.Person;<br />import org.appfuse.dao.PersonDAO;<br />import org.appfuse.service.PersonManager;</p><p>public class PersonManagerImpl extends BaseManager implements PersonManager {<br />    private PersonDAO dao;</p><p>    /**<br />     * Set the DAO for communication with the data layer.<br />     * @param dao<br />     */<br />    public void setPersonDAO(PersonDAO dao) {<br />        this.dao = dao;<br />    }</p><p>    /**<br />     * @see org.appfuse.service.PersonManager#getPersons(org.appfuse.model.Person)<br />     */<br />    public List getPersons(final Person person) {<br />        return dao.getPersons(person);<br />    }</p><p>    /**<br />     * @see org.appfuse.service.PersonManager#getPerson(String id)<br />     */<br />    public Person getPerson(final String id) {<br />        return dao.getPerson(new Long(id));<br />    }</p><p>    /**<br />     * @see org.appfuse.service.PersonManager#savePerson(Person person)<br />     */<br />    public void savePerson(Person person) {<br />        dao.savePerson(person);<br />    }</p><p>    /**<br />     * @see org.appfuse.service.PersonManager#removePerson(String id)<br />     */<br />    public void removePerson(final String id) {<br />        dao.removePerson(new Long(id));<br />    }<br />}</p><p><br />PersonController控制器类<br />注意在产生这个控制器类的作用是为了将PersonManager接口通过IOC注入并Instance<br />能够调用dao类取得的数据结果集返回给客户浏览器的请求。请求的mappingUrl地址又是在WEB/WEB-INF目录下action-servlet.xml<br />文件下进行配置的<br />&lt;!--Person-BEAN-START--&gt;<br />  &lt;bean id="personController" class="org.appfuse.webapp.action.PersonController" autowire="byName"/&gt;</p><p>    &lt;bean id="personFormController" class="org.appfuse.webapp.action.PersonFormController" autowire="byName"&gt;<br />        &lt;property name="commandName" value="person"/&gt;<br />        &lt;property name="commandClass" value="org.appfuse.model.Person"/&gt;<br />        &lt;property name="validator" ref="beanValidator"/&gt;<br />        &lt;property name="formView" value="personForm"/&gt;<br />        &lt;property name="successView" value="redirect:persons.html"/&gt;<br />    &lt;/bean&gt;<br />    &lt;!--Person-BEAN-END--&gt;</p><p>    &lt;!--Person-URL-START--&gt;<br />                &lt;prop key="/persons.html"&gt;personController&lt;/prop&gt;<br />                &lt;prop key="/editPerson.html"&gt;personFormController&lt;/prop&gt;<br />                &lt;!--Person-URL-END--&gt;<br />package org.appfuse.webapp.action;</p><p>import java.util.List;</p><p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p><p>import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.apache.commons.beanutils.BeanUtils;</p><p>import org.appfuse.Constants;<br />import org.appfuse.model.Person;<br />import org.appfuse.service.PersonManager;</p><p>import org.springframework.web.servlet.ModelAndView;<br />import org.springframework.web.servlet.mvc.Controller;</p><p>public class PersonController implements Controller {<br />    private final Log log = LogFactory.getLog(PersonController.class);<br />    private PersonManager personManager = null;</p><p>    public void setPersonManager(PersonManager personManager) {<br />        this.personManager = personManager;<br />    }</p><p>    public ModelAndView handleRequest(HttpServletRequest request,<br />                                      HttpServletResponse response)<br />    throws Exception {<br />        if (log.isDebugEnabled()) {<br />            log.debug("entering 'handleRequest' method...");<br />        }</p><p>        Person person = new Person();<br />        // populate object with request parameters<br />        BeanUtils.populate(person, request.getParameterMap());</p><p>        List persons = personManager.getPersons(person);</p><p>        return new ModelAndView("personList", Constants.PERSON_LIST, persons);<br />    }<br />}</p><p><br />PersonFormController添加修改删除操作控制器类。</p><p>package org.appfuse.webapp.action;</p><p>import java.util.Locale;</p><p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p><p>import org.apache.commons.lang.StringUtils;<br />import org.appfuse.model.Person;<br />import org.appfuse.service.PersonManager;<br />import org.springframework.validation.BindException;<br />import org.springframework.web.servlet.ModelAndView;</p><p>public class PersonFormController extends BaseFormController {<br />    private PersonManager personManager = null;</p><p>    public void setPersonManager(PersonManager personManager) {<br />        this.personManager = personManager;<br />    }</p><p>    protected Object formBackingObject(HttpServletRequest request)<br />    throws Exception {<br />        String id = request.getParameter("id");<br />        Person person = null;</p><p>        if (!StringUtils.isEmpty(id)) {<br />            person = personManager.getPerson(id);<br />        } else {<br />            person = new Person();<br />        }</p><p>        return person;<br />    }</p><p>    public ModelAndView onSubmit(HttpServletRequest request,<br />                                 HttpServletResponse response, Object command,<br />                                 BindException errors)<br />    throws Exception {<br />        if (log.isDebugEnabled()) {<br />            log.debug("entering 'onSubmit' method...");<br />        }</p><p>        Person person = (Person) command;<br />        boolean isNew = (person.getId() == null);<br />        Locale locale = request.getLocale();</p><p>        if (request.getParameter("delete") != null) {<br />            personManager.removePerson(person.getId().toString());</p><p>            saveMessage(request, getText("person.deleted", locale));<br />        } else {<br />            personManager.savePerson(person);</p><p>            String key = (isNew) ? "person.added" : "person.updated";<br />            saveMessage(request, getText(key, locale));</p><p>            if (!isNew) {<br />             return new ModelAndView("redirect:editPerson.html", "id", person.getId());<br />            }<br />        }</p><p>        return new ModelAndView(getSuccessView());<br />    }<br />}</p><p><br />在布署公司的产品过程中，mine的WAR应用，在执行ant compile-dao过程中，会报一个，找不到org.eclipse.jta的错误，<br />这是由于ant找不到eclipse的关于jta的插件的原因！解决办法是，在ant架包中，把eclipse 安装目录下的plugns目录下的org.eclipse.jdt.core_3.0.<br />（E:\eclipse\plugins\org.eclipse.jdt.core_3.0.0\）目录中两个jar文件加入到ant的lib目录下！</p><p>xdoclet在执行ant的deploy的任务时，有时候生成的XML文件格式会出现小小的问题，解决的办法是修改相关的JAVA文件，然后运行deploy脚本重新利用<br />xdoclet来生成相关的xml文件！直至成功！</p><p>首页登录在调用loginServlet时候，login.jsp页面能正确显示出来，但是提交到服务器的/authorize的action映射找不到，也就是找不到服务，<br />这是由于tomcat是启动在8080端口的服务，而程序中，用户登录的校验是根据properties.xml文件中，配置的<br />&lt;property name="http.port" value="8080"/&gt;这个端口号，默认的是80端口，可以通过把TOMCAT启动时监听80端口或，修改properties.xml文件中<br />http.port的value="8080",就可以找到服务器响应。注意，这里/authorize的映射,不是通过spring的IOC操作的，而是通过在web.xml文件中加入一个<br /> &lt;filter&gt;<br />  &lt;filter-name&gt;securityFilter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />- &lt;init-param&gt;<br />  &lt;param-name&gt;targetClass&lt;/param-name&gt; <br />  &lt;param-value&gt;net.sf.acegisecurity.util.FilterChainProxy&lt;/param-value&gt; <br />  &lt;/init-param&gt;<br />  &lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />  &lt;filter-name&gt;securityFilter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/j_security_check&lt;/url-pattern&gt; <br />  &lt;/filter-mapping&gt;</p><p>来实现的</p><p>但是一定要记得，文件net.sf.acegisecurity.util.FilterChainProxy是在acegi-security-x.x.x.jar包里面的，调用前一定要记得放在应用的WEB-INF/lib/目录下才能正常使用。</p><p>当系统启动时会自动加载spring配置文件中所声明的类，在appfuse中这一声明是放在action-servlet.xml中的，因此必须将这个文件同其他的applicationContext.xml一起在web.xml中声明为contextConfigLocation的内容，如下：</p><p>   &lt;context-param&gt;<br />  &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; <br />  &lt;param-value&gt;classpath*:META-INF/applicationContext-*.xml /WEB-INF/applicationContext-*.xml /WEB-INF/schedulingContext-timer.xml&lt;/param-value&gt; <br />  &lt;/context-param&gt;</p><p> </p><p>在action-servlet.xml中定义如下（这个文件必须符合spring-beans.dtd的规范）：</p><p>&lt;beans&gt;    <br />    <br />    &lt;bean id="userAction" class="com.mywap.webwork.action.UserAction" singleton="false"&gt;<br />        &lt;property name="userManager"&gt;&lt;ref bean="userManager"/&gt;&lt;/property&gt;<br />    &lt;/bean&gt;<br />    <br />    &lt;!-- Add additional actions here --&gt;<br />&lt;/beans&gt;</p><p> </p><p><br />acegi出了0.8,改动还真不少，原先0.7的应用，改了一个多小时才完全升级成功。备忘一下：</p><p>1 最贴心的改变莫过于 filter chains可以放在spring 容器中加载了，再也不用在Web.XML中声明长长的一串filter了。例如：</p><p> &lt;bean id="filterChainProxy" class="net.sf.aceGISecurity.util.FilterChainProxy"&gt;<br />      &lt;property name="filterInvocationDefinitionSource"&gt;<br />         &lt;value&gt;<br />         CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />          PATTERN_TYPE_APACHE_ANT<br />            /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,......<br />         &lt;/value&gt;<br />      &lt;/property&gt;<br />    &lt;/bean&gt;</p><p>2 HttpSessionIntegrationFilter 已经消失，使用net.sf.acegisecurity.context.HttpSessionContextIntegrationFilter取而代之，如：<br />    &lt;bean id="httpSessionContextIntegrationFilter" class="net.sf.acegisecurity.context.HttpSessionContextIntegrationFilter"&gt;<br />      &lt;property name="context"&gt;&lt;value&gt;net.sf.acegisecurity.context.security.SecureContextImpl&lt;/value&gt;&lt;/property&gt;<br />    &lt;/bean&gt;</p><p>这个"context"属性不可不设哟。</p><p>3 新增了一个功能，可以在web.xml中声明一个HttpSessionEventPublisher context listener,想想Spring的现在还不很成熟的消息发布机制(AOP),主要是用来记日志。我暂时还没用到这个功能。</p><p> </p><p>mine在通过ant deploy任务到TOMCAT下,会把hibernate的表映射文件,连同持久化的类文件,打包成一个,mine-dao.jar架包,放到web-inf/lib私有目录下<br /></p><img src ="http://www.blogjava.net/buaacaptain/aggbug/56171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-07-02 17:35 <a href="http://www.blogjava.net/buaacaptain/archive/2006/07/02/56171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：应用AXIS开始Web 服务之旅</title><link>http://www.blogjava.net/buaacaptain/archive/2006/06/07/51080.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Wed, 07 Jun 2006 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/06/07/51080.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/51080.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/06/07/51080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/51080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/51080.html</trackback:ping><description><![CDATA[
		<p>
				<a name="1">
						<span class="atitle">
								<font face="Arial" size="4">一． 介绍</font>
						</span>
				</a>
		</p>
		<p>
				<br />本文并不是想介绍Web服务的原理、系统架构等，我们假设您已经了解了关于Web服务的一些基本的概念、原理等知识。本文主要是针对那些已经了解Web服务概念，但是还没有亲身体会Web服务所带来令人欢欣鼓舞的特征的开发人员。在此我们认为你已经具备了Java、XML等基础知识，如果你还有其他开发环境的经验例如VB、VC那是再好不过的了。 </p>
		<p>
				<a name="N1004B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1．Web服务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<br />虽然我们并不想详细讲述Web服务的体系结构，但是大概的介绍一下还是有必要的。Web服务是一种新型的Web应用程序。不同于其他Web应用程序，它是自适应、自我描述、模块化的应用程序，并可以跨越Web进行发布、定位以及调用。简单的Web服务可以提供例如天气预报或者航班信息的服务。一旦部署了Web服务，其他的应用程序就可以发现和调用所部署的服务。 </p>
		<p>
				<a name="N10056">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2．AXIS项目</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<br />Axis框架来自 Apache 开放源代码组织，它是基于JAVA语言的最新的 SOAP 规范（SOAP 1.2）和 SOAP with Attachments 规范（来自 Apache Group ）的开放源代码实现。有很多流行的开发工具都使用AXIS作为其实现支持Web服务的功能，例如JBuilder以及著名的Eclipse J2EE插件Lomboz。AXIS的最新版本是1.1，可以从 <a href="http://ws.apache.org/axis/index.html" target="_blank"><font color="#5c81a7">http://ws.apache.org/axis/index.html</font></a>下载。下图是AXIS核心引擎的体系结构图： </p>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/1_axis_engine.jpg" />
		<br />
		<p>
				<b>图1</b>
		</p>
		<p>整个AXIS项目包括以下几个部分：</p>
		<ol>
				<li>消息流子系统 <br />消息流子系统提供了灵活的消息传递框架，这个消息传递框架包括处理程序、链、序列化程序和反序列化程序。处理程序是一个处理请求、响应和故障流的对象。处理程序可被组合在一起成为链，而且可以使用一个灵活的部署描述符来配置这些处理程序的顺序。 
</li>
				<li>传输框架子系统 <br />提供了一个传输框架，这个传输框架可以帮助您创建自己的可插式传输发送器和传输侦听器。 
</li>
				<li>数据编码子系统 <br />AXIS完全按照 XML Schema 规范提供各种数据类型的自动序列化，并且提供功能扩展接口来使用您自己定制的序列化器和反序列化器。 
</li>
				<li>其他 <br />AXIS完全支持 WSDL 以及日志记录、出错以及故障处理机制。它同时提供一些工具用来讲WSDL文档转换成客户端的调用框架以及根据类来产生WSDL定义文档。 </li>
		</ol>
		<p>AXIS目前版本支持的标准是：W3C SOAP 1.1 和 1.2；WSDL 1.1；SAAJ 1.1（SUN公司：SOAP with Attachments API for Java）；JAX-RPC（SUN公司：Java API for XML-Based RPC）1.0。 </p>
		<p>除了前面介绍的AXIS外，本文中还将会用到TOMCAT，这里不再另行介绍。另外为了演示Web服务真正与开发环境无关以及AXIS产生的是标准的、符合规范的Web服务，我们还将用到微软公司的SOAP TOOLKIT以及微软的开发环境VB和VC来做为Web服务的客户端。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">
								<font face="Arial" size="4">二. 环境搭建</font>
						</span>
				</a>
		</p>
		<p>
				<br />由于AXIS本身是基于JAVA语言开发的项目，并且是以Web应用形式发布的，因此它运行时需要一个应用服务器作为支撑。为了方便我们这里选用的是Tomcat。由于AXIS本身需要用到处理XML信息的包，所以我们建议使用JDK1.4并安装Tomcat 4.1.24。下面是环境搭建步骤，读取根据自身情况进行安装。 </p>
		<ol>
				<li>安装JDK1.4.1 
</li>
				<li>安装Tomcat 4.1.24到C:\Tomcat并验证安装是否成功 
</li>
				<li>下载AXIS项目打包文件axis-1_1.zip解压缩后将目录中的webapps目录下的axis子目录拷贝到C:\Tomcat\webapps下。 
</li>
				<li>验证AXIS的安装：重新启动Tomcat服务器后打开浏览器输入网址http://localhost:8080/axis 后应该出现如下图所示页面，点击链接"Validate"来验证Axis所需的几个JAVA包是否齐全。 </li>
		</ol>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/2_axis_home.jpg" />
		<br />
		<p>
				<b>图2</b>
		</p>
		<p>点击超链接Validate后，AXIS会自动检查所需的每一个JAVA组件，这协组件分为：必需组件以及可选组件，必须保证所有必需组件都存在，如下图所示即为验证成功。 </p>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/3_axis_verify.jpg" />
		<br />
		<p>
				<b>图3</b>
		</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">
								<font face="Arial" size="4">三． Web Service服务端开发</font>
						</span>
				</a>
		</p>
		<p>
				<br />经过了前两步之后我们就可以开始Web服务之旅了！大多数人在学习一种编程语言的第一步都是从Hello world程序开始的，我们也不例外。我们将提供这样一个Web服务，通过给它传入姓名，服务返回：你好[姓名]，欢迎来到Web服务的世界。这就是我们的需求。我们将马上根据AXIS的要求完成我们的需求，你就会发现原来Web服务可以这么简单！ </p>
		<p>编写JAVA类Hello.java，内容如下：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">public class Hello{
 public String hello(String name){
  if(name==null)
   name = "";
  return "你好"+name+"，欢迎来到Web服务的世界！";
}
}
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>仅此而已，无需编译，将该文件改名为Hello.jws并拷贝到AXIS应用目录C:\Tomcat\webapps\axis下。 </p>
		<p>下面我们就可以测试该Web服务了，打开浏览器并输入刚刚创建的文件名对应的URL地址 <a href="http://localhost:8080/axis/Hello.jws" target="_blank"><font color="#5c81a7">http://localhost:8080/axis/Hello.jws</font></a> 浏览器显示如下结果： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">There is a Web Service here

        
        </font>
														<a href="http://localhost:8080/axis/Hello.jws?wsdl" target="_blank">
																<font face="Lucida Console" color="#5c81a7">Click to see the WSDL </font>
														</a>
														<font face="Lucida Console">
														</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>点击页面上的链接查看该Web服务对应的WSDL信息如下所示（我们将在下一小节简单介绍WSDL） </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
-&lt;wsdl:definitions
 targetNamespace="http://localhost:8080/axis/Hello.jws"
 xmlns="http://schemas.xmlsoap.org/wsdl/"
 xmlns="http://www.w3.org/2000/xmlns/"
 xmlns:apachesoap="http://xml.apache.org/xml-soap" 
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:impl="http://localhost:8080/axis/Hello.jws" 
 xmlns:intf="http://localhost:8080/axis/Hello.jws"
 xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"&gt;
 - &lt;wsdl:message name="helloRequest"&gt;
 &lt;wsdl:part name="name" type="xsd:string" /&gt; 
 &lt;/wsdl:message&gt;
 + &lt;wsdl:message name="helloResponse"&gt;
 - &lt;wsdl:portType name="Hello"&gt;
 - &lt;wsdl:operation name="hello" parameterOrder="name"&gt;
 &lt;wsdl:input name="helloRequest" message="intf:helloRequest" /&gt; 
 &lt;wsdl:output name="helloResponse" message="intf:helloResponse" /&gt;
 &lt;/wsdl:operation&gt; 
 &lt;/wsdl:portType&gt;
 - &lt;wsdl:binding name="HelloSoapBinding" type="intf:Hello"&gt; 
 &lt;wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /&gt;
 - &lt;wsdl:operation name="hello"&gt; 
 &lt;wsdlsoap:operation soapAction="" /&gt;
 - &lt;wsdl:input name="helloRequest"&gt;
 &lt;wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
  namespace="http://DefaultNamespace" /&gt;  
 &lt;/wsdl:input&gt;- &lt;wsdl:output name="helloResponse"&gt;  
 &lt;wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  namespace="http://localhost:8080/axis/Hello.jws" /&gt;   
 &lt;/wsdl:output&gt; 
 &lt;/wsdl:operation&gt; 
 &lt;/wsdl:binding&gt;
 - &lt;wsdl:service name="HelloService"&gt;
 - &lt;wsdl:port name="Hello" binding="intf:HelloSoapBinding"&gt;
 &lt;wsdlsoap:address location="http://localhost:8080/axis/Hello.jws" /&gt; 
 &lt;/wsdl:port&gt;  
 &lt;/wsdl:service&gt; 
 &lt;/wsdl:definitions&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>到此我们已经完成了hello的Web服务了，那我们怎么告诉用户如何来使用该服务呢？我们只需要告诉用户我们的Web服务的URL地址： <a href="http://localhost:8080/axis/Hello.jws?wsdl" target="_blank"><font color="#5c81a7">http://localhost:8080/axis/Hello.jws?wsdl</font></a> 就可以了！下一节我们将介绍如何通过这个地址来访问对应的Web服务。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">
								<font face="Arial" size="4">四． Web Service客户端开发</font>
						</span>
				</a>
		</p>
		<p>
				<br />在这一节中我们将使用三种不同的语言来访问刚刚创建的Web服务，分别是JAVA、VB、VC。为了使用VB和VC访问Web服务，我们需要安装微软公司的Soap Toolkit 开发工具包，这个工具包可以从微软公司的主页 </p>
		<p>
				<a href="http://download.microsoft.com/download/xml/soap/2.0/W98NT42KMe/EN-US/SoapToolkit20.exe" target="_blank">
						<font color="#5c81a7">http://download.microsoft.com/download/xml/soap/2.0/W98NT42KMe/EN-US/SoapToolkit20.exe</font>
				</a>
		</p>
		<p>下载，下载该软件包并使用默认方式安装即可。 </p>
		<p>在开始客户端开发之前有两个概念我们必须先粗略的介绍一下。 </p>
		<p>SOAP：简单对象访问协议。这是一种在松散的、分布的环境中使用XML对等地交换结构化的和类型化的信息提供了一个简单且轻量级的机制，它是一个基于XML的协议。它包括四个部分：SOAP封装（envelop），封装定义了一个描述消息中的内容是什么，是谁发送的，谁应当接受并处理它以及如何处理它们的框架；SOAP编码规则（encoding rules），用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation)，表示远程过程调用和应答的协定;SOAP绑定（binding），使用底层协议交换信息。 </p>
		<p>虽然这四个部分都作为SOAP的一部分，作为一个整体定义的，但他们在功能上是相交的、彼此独立的。特别的，信封和编码规则是被定义在不同的XML命名空间(namespace)中，这样使得定义更加简单。 </p>
		<p>SOAP的主要设计目标是简明性和可扩展性。这就意味着有一些传统消息系统或分布式对象系统中的特性将不包含在SOAP的核心规范中。这些特性包括：分布式垃圾收集；批量消息传输/处理；对象引用；对象激活。 </p>
		<p>WSDL：Web Service描述语言。使用了WSDL，我们就可以通过这种跨平台和跨语言的方法使Web Service代理的产生自动化。就像COM和CORBA的IDL文件，WSDL文件由客户和服务器约定。由于WSDL设计成可以绑定除SOAP以外的其他协议，这里我们主要关注WSDL在HTTP上和SOAP的关系。同样，由于SOAP目前主要用来调用远程的过程和函数，WSDL支持SOAP传输的文档规范。 </p>
		<p>WSDL文档可以分为两部分。顶部分由抽象定义组成，而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息，它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务，截然不同的网站都可以实现。 </p>
		<p>
				<a name="N1013F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1. JAVA客户端</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<br />使用AXIS的工具将使Web服务的访问和我们之前介绍的创建一个Web服务一样的简单。我们前面安装的AXIS环境中已经包含着这样的工具，它是一个JAVA类，类名为：org.apache.axis.wsdl.WSDL2Java。打开命令行窗口，转到AXIS目录下的WEB-INF子目录。确保Tomcat服务已经处于启动状态，键入命令 ： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws，该目录下有四个JAVA源文件，它们分别是： </p>
		<p>Hello.java 定义了Web服务接口，此例中只有一个hello方法。 </p>
		<p>HelloService.java 定义了用于获取Web服务接口的方法。 </p>
		<p>HelloServiceLocator.java 接口HelloService的具体实现。 </p>
		<p>HelloSoapBindingStub.java Web服务客户端桩，通过该类与服务器交互。 </p>
		<p>这四个JAVA类帮我们处理了大部分的逻辑，我们需要的仅仅是把这些类加到我们的项目然后创建一个我们自己的类来调用它们即可。为此我们新加一个类Main.java，为了方便，让这个类与刚产生的四个类都在同一个包下。内容如下： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">//Main.java
package localhost.axis.Hello_jws;
public class Main{
public static void main(String[] args) throws Exception{
 HelloService service = new HelloServiceLocator();
 Hello hello = service.getHello(); 
 System.out.println("Response:"+hello.hello("罐头")); 
 }
}
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>使用以下命令进行编译： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">javac -classpath lib\axis.jar;lib\jaxrpc.jar localhost\axis\Hello_jws\*.java
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果编译没有问题的话执行该测试程序：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//运行结果：Response:你好罐头，欢迎来到Web服务的世界！
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在WSDL2Java工具自动产生的几个类中，类HelloServiceLocator中保存这一些跟服务器相关的信息，例如URL地址等，当服务器的地址更改后但是服务并没有改动的时候直接修改该文件中的字符串定义，而无需重新生成这几个类。具体需要修改的内容，打开该文件便可一目了然。 </p>
		<p>
				<a name="N10175">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2. VB客户端</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<br />有了微软SOAP toolkit，用VB调用Web服务也是一件令人愉快的事情。 </p>
		<p>打开VB开发环境新建一个标准EXE项目，打开工程(Project)菜单并选择引用打开组件引用对话框如下图所示：找到并选中Microsoft Soap Type Library。 </p>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/image008.jpg" />
		<br />
		<p>
				<b>图 4</b>
		</p>
		<p>新建并编辑窗体如下图所示：</p>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/4_vbclient.jpg" />
		<br />
		<p>
				<b>图 5</b>
		</p>
		<p>编辑按钮Call的点击事件处理程序如下：（注意窗体的控件名称要与程序中的名称对应）</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">Private Sub callBtn_Click()    
'这种做法需要在工程中引用Soap Type Library  
'Dim soap As MSSOAPLib.SoapClient  
'Set soap = New MSSOAPLib.SoapClient
Dim soap  
Set soap = CreateObject("MSSOAP.SoapClient")   
On Error Resume Next
'soap.mssoapinit urlText.Text 
Call soap.mssoapinit(urlText.Text)   
If Err &lt;&gt; 0 Then   
 MsgBox "初始化SOAP失败： " + Err.Description       
 urlText.SetFocus 
Else       
 If Len(Trim(nameText.Text)) = 0 Then       
  MsgBox "请输入您的姓名！"          
  nameText.SetFocus    
 Else          
  responseText.Text = soap.hello(nameText.Text) 
 End If 
 End If
End Sub
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>保存项目并运行，输入姓名并点击按钮Call。 </p>
		<p>
				<a name="N101BA">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3. VC客户端</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<br />打开VC开发环境，新建项目HelloClient，项目类型为 Win32 Console Application的空项目。新建C++ Source File文件名为：HelloSoap.cpp，编辑文件内容如下： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">//#include "stdafx.h"
#include &lt;stdio.h&gt;
#import "msxml3.dll"
using namespace MSXML2;
//根据自己机器的情况修改下面语句中指定的路径

#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap1.dll" \ 
 exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \ 
 "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib;

void Hello(){ 
 ISoapSerializerPtr Serializer;
 ISoapReaderPtr Reader; 
 ISoapConnectorPtr Connector;
 // Connect to the service 
 Connector.CreateInstance(__uuidof(HttpConnector));
 Connector-&gt;Property["EndPointURL"] = "http://localhost:8080/axis/Hello.jws?wsdl";
 Connector-&gt;Connect(); 
 // Begin message
 Connector-&gt;BeginMessage(); 
 // Create the SoapSerializer 
 Serializer.CreateInstance(__uuidof(SoapSerializer)); 
 // Connect the serializer to the input stream of the connector
 Serializer-&gt;Init(_variant_t((IUnknown*)Connector-&gt;InputStream)); 

 // Build the SOAP Message 

 Serializer-&gt;startEnvelope("","",""); 
 Serializer-&gt;startBody(""); 
 Serializer-&gt;startElement("hello","","",""); 
 Serializer-&gt;startElement("name","","","");
 Serializer-&gt;writeString("罐头"); 
 Serializer-&gt;endElement(); 
 Serializer-&gt;endElement();
 Serializer-&gt;endBody(); 
 Serializer-&gt;endEnvelope();  
 
 // Send the message to the web service 
 Connector-&gt;EndMessage();   
 
 // Let us read the response
 Reader.CreateInstance(__uuidof(SoapReader)); 
 // Connect the reader to the output stream of the connector
 Reader-&gt;Load(_variant_t((IUnknown*)Connector-&gt;OutputStream), ""); 

 // Display the result 
 printf("Response: %s\n", (const char*)Reader-&gt;RPCResult-&gt;text);  
}

int main()
{
 CoInitialize(NULL);
 Hello(); 
 CoUninitialize(); 
 
 return 0; 
}
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>编译并运行该项目。</p>
		<p>本节只是为了演示如果通过VC来访问使用AXIS创建的Web服务，至于Soap toolkit的具体使用请参照soap toolkit的帮助手册，其他语言的访问请查阅相关的文档。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">
								<font face="Arial" size="4">五. AXIS集成</font>
						</span>
				</a>
		</p>
		<p>
				<font face="Arial" size="4">
				</font>
		</p>
		<p>为了让我们的WEB应用程序支持Web服务功能，我们需要将AXIS集成到我们的应用程序中。集成AXIS很简单，首先需要拷贝AXIS用到的几个JAR包文件，这些文件都在[AXIS]\WEB-INF\lib目录下，将这些文件拷贝到我们自己的应用目录下的WEB-INF\lib。另外如果你用的不是TOMCAT服务器那就需要拷贝activation.jar，这个JAR文件可以在[TOMCAT]\common\lib目录下找到！ </p>
		<p>拷贝完JAR文件后就是web.xml的配置了，只需要把AXIS中的web.xml中的配置信息添加到我们自己应用程序中的web.xml中即可。最重要的是下面的内容： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;servlet&gt;  
 &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;  
 &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;   
 &lt;servlet-class&gt; 
  org.apache.axis.transport.http.AxisServlet  
 &lt;/servlet-class&gt;
&lt;/servlet&gt;

&lt;servlet-mapping&gt;   
 &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;  
 &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;mime-mapping&gt;    
 &lt;extension&gt;wsdl&lt;/extension&gt;  
 &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
&lt;/mime-mapping&gt;

&lt;mime-mapping&gt;   
 &lt;extension&gt;xsd&lt;/extension&gt;   
 &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
&lt;/mime-mapping&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console">
																				<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">
								<font face="Arial" size="4">六 总结</font>
						</span>
				</a>
		</p>
		<p>
				<br />到此文章告一段落，通过以上的演练，我相信你已经对Web服务有一个感性的认识，但是这个仅仅是开始，我们也只是很简单的介绍了Web服务的一些基本概念并演示了一个无法再简单的例子。Web服务还有很多其他高级的内容例如复杂类型、数据安全等没有涉及到，不过没有关系，万事开头难，希望本文能够促进大家理解和应用下一代的应用模式并给还没有动手试验的开发人员开一个好头。 </p>
<img src ="http://www.blogjava.net/buaacaptain/aggbug/51080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-06-07 12:22 <a href="http://www.blogjava.net/buaacaptain/archive/2006/06/07/51080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Subversion快速入门教程</title><link>http://www.blogjava.net/buaacaptain/archive/2006/05/29/48751.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Mon, 29 May 2006 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/05/29/48751.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/48751.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/05/29/48751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/48751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/48751.html</trackback:ping><description><![CDATA[迄今为止看过的相关最好的教程了：<a href="http://www.subversion.org.cn/content/view/18/1/">http://www.subversion.org.cn/content/view/18/1/</a><br />如何快速建立Subversion服务器，并且在项目中使用起来，这是大家最关心的问题，与CVS相比，Subversion有更多的选择，也更加的容易，几个命令就可以建立一套服务器环境，可以使用起来，这里配套有<a href="http://www.subversion.org.cn/media/all.swf" target="_self">动画教程</a>。<br /><br />本文是使用Subversion最快速的教程，在最短的时间里帮助您建立起一套可用的服务器环境，只需略加调整就可以应用到实际项目当中。<br /><br /><br />本教程分为以下几个部门，不仅仅是快速入门，最后我们还有一些高级功能的说明，为了说明简单，教程是在windows下使用的方式，以方便资源有限的项目使用，对于UNIX环境下，区别并不大。<br /><br /><ol><li>软件下载 
</li><li>服务器和客户端安装<br /></li><li>建立版本库（Repository） 
</li><li>配置用户和权限<br /></li><li>运行独立服务器 
</li><li>初始化导入 
</li><li>基本客户端操作 </li></ol><strong>1，软件下载<br /><br /></strong><ul><li>下载Subversion服务器程序。 </li></ul>到<a href="http://subversion.tigris.org/" target="_self">官方网站</a> 的下载二进制安装文件，来到<a href="http://subversion.tigris.org/project_packages.html#binary-packages" target="_self">二进制包下载部分</a>  ，找到 Windows NT, 2000, XP and 2003部分，然后选择"<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">this directory</a>"，这样我们可以看到许多下载的内容，目前可以下栽<a onclick="return launch(this.href, 1)" href="http://subversion.tigris.org/files/documents/15/25364/svn-1.2.3-setup.exe"> svn-1.2.3-setup.exe</a>。<br /><br /><ul><li>下载Subversion的Windows客户端TortoiseSVN。 </li></ul>TortoiseSVN是扩展Windows Shell的一套工具，可以看作Windows资源管理器的插件，安装之后Windows就可以识别Subversion的工作目录。<br />官方网站是<a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a>，下载方式和前面的svn服务器类似，在<a href="http://tortoisesvn.tigris.org/download.html">Download</a>页面的我们选择Official version for Win2k/XP or higher的版本，然后在sourceforge的<a href="http://sourceforge.net/project/showfiles.php?group_id=138498&amp;package_id=151948" target="_self">下载页面</a>选择目前的最高稳定版本的安装文件<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.2.4.4479-svn-1.2.3.msi?download">TortoiseSVN-1.2.4.4479-svn-1.2.3.msi</a>。<br /><br /><br /><strong>2，服务器和客户端安装<br /><br /></strong><ul><li>服务器安装，直接运行<a onclick="return launch(this.href, 1)" href="http://subversion.tigris.org/files/documents/15/25364/svn-1.2.3-setup.exe">svn-1.2.3-setup.exe</a>，根据提示安装即可，这样我们就有了一套服务器可以运行的环境。 
</li><li>安装TortoiseSVN，同样直接运行<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.2.4.4479-svn-1.2.3.msi?download">TortoiseSVN-1.2.4.4479-svn-1.2.3.msi</a>按照提示安装即可，不过最后完成后会提示是否重启，其实重启只是使svn工作拷贝在windows中的特殊样式生效，与所有的实际功能无关，这里为了立刻看到好的效果，还是重新启动机器。 </li></ul><br /><br /><strong>3，建立版本库（Repository）<br /><br /></strong>运行Subversion服务器需要首先要建立一个版本库（Repository），可以看作服务器上存放数据的数据库，在安装了Subversion服务器之后，可以直接运行，如：<strong><br /></strong><blockquote><pre>svnadmin create E:\svndemo\repository<br /></pre></blockquote><div align="left"><pre>就会在目录E:\svndemo\repository下创建一个版本库。<br /><br />我们也可以使用TortoiseSVN图形化的完成这一步：<br /></pre><blockquote>在目录E:\svndemo\repository下"右键-&gt;TortoiseSVN-&gt;Create Repository here...“， 然后可以选择版本库模式， 这里使用默认即可， 然后就创建了一系列目录和文件。<br /></blockquote></div><strong>4，配置用户和权限<br /><br /></strong>来到E:\svndemo\repository\conf目录，修改svnserve.conf：<br /><blockquote># [general]<br /># password-db = passwd<br /></blockquote>改为：<br /><blockquote>[general]<br />password-db = passwd</blockquote>然后修改同目录的passwd文件，去掉下面三行的注释：<br /><blockquote># [users]<br /># harry = harryssecret<br /># sally = sallyssecret<br /></blockquote>最后变成：<br /><blockquote>[users]<br />harry = harryssecret<br />sally = sallyssecret<br /></blockquote><strong><br />5，运行独立服务器<br /><br /></strong>在任意目录下运行：<br /><blockquote>svnserve -d -r E:\svndemo\repository </blockquote>我们的服务器程序就已经启动了。<br /><br /><br /><strong>6，初始化导入<br /><br /></strong>来到我们想要导入的项目根目录，在这个例子里是E:\svndemo\initproject，目录下有一个readme.txt文件：<br /><ol><li>右键-&gt;TortoiseSVN-&gt;Import... 
</li><li>URL of repository输入“svn://localhost/trunk” 
</li><li>ok </li></ol>完成之后目录没有任何变化，如果没有报错，数据就已经全部导入到了我们刚才定义的版本库中。<br /><br /><br /><strong>7，基本客户端操作</strong><br /><strong><br /></strong>取出版本库到一个工作拷贝：<br /><blockquote>来到任意空目录下，在本例中是E:\svndemo\wc1，运行右键-&gt;Checkout，在URL of repository中输入svn://localhost/trunk，这样我们就得到了一份工作拷贝。<br /></blockquote>在工作拷贝中作出修改并提交：<br /><blockquote>打开readme.txt，作出修改，然后右键-&gt;Commit...，这样我们就把修改提交到了版本库，我们可以运行。<br /></blockquote>察看所作的修改：<br /><blockquote>readme.txt上右键-&gt;TortoiseSVN-&gt;Show Log，这样我们就可以看到我们对这个文件所有的提交。在版本1上右键-&gt;Compare with working copy，我们可以比较工作拷贝的文件和版本1的区别。<br /></blockquote><br />最后，所有的内容都已经录制为<a href="http://www.subversion.org.cn/media/all.swf" target="_self">动画文件</a>，大家可以参考。<br /><img src ="http://www.blogjava.net/buaacaptain/aggbug/48751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-05-29 14:58 <a href="http://www.blogjava.net/buaacaptain/archive/2006/05/29/48751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 用 JDOM 简化 XML 编程 </title><link>http://www.blogjava.net/buaacaptain/archive/2006/05/27/48528.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Sat, 27 May 2006 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/05/27/48528.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/48528.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/05/27/48528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/48528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/48528.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近有个项目的权限部分设计到对xml的维护,找了些jdom的资料.PS:其实最好的例子还是jdom包里面自带的sample转自:http://www.fesge.com/wzjx/0305/jxml9.htm JDOM 是一种使用 XML 的独特 Java 工具包，用于快速开发 XML 应用程序。它的设计包含 Java 语言的语法乃至语义。但是它是否比现有的 -- 更标准的 -- XML API ...&nbsp;&nbsp;<a href='http://www.blogjava.net/buaacaptain/archive/2006/05/27/48528.html'>阅读全文</a><img src ="http://www.blogjava.net/buaacaptain/aggbug/48528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-05-27 21:56 <a href="http://www.blogjava.net/buaacaptain/archive/2006/05/27/48528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EasyJF开源团队协同开发实用指南 </title><link>http://www.blogjava.net/buaacaptain/archive/2006/05/27/48462.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Sat, 27 May 2006 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/05/27/48462.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/48462.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/05/27/48462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/48462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/48462.html</trackback:ping><description><![CDATA[嘿嘿，盼新新盼月亮，终于盼来了一个赞助团队的专用配置管理服务器。EasyJF团队配置管理组特别是成员WilliamRaym的努力下，终于完成了团队配置服务器的初始搭建工作。这应该算是EasyJF开源团队万里长征中所迈出的一小步吧，请大家帮忙放点鞭炮来庆祝一下。 
<div><br />　　在配置管理服务器的搭建过程中，团队成员WilliamRaym，加班加点，连续奋战了三天三夜，总共(24-4.5)*3＝58.5小时，做出了非常大的贡献。另外配置管理组的会飞(huifei)以及团队中的negod、天意、天一、船长、大峡等很多成员为此也做了大量的调研及协助工作。在此，为了表示对以上团队成员的谢意，欢迎大家有鲜花扔鲜花，没鲜花就给点掌声也不错。哈哈！</div><div>　　废话不多说，下面进入正题吧！</div><div><br /><strong>一、 EasyJF协同开发客户端软件</strong></div><div><br />　　EasyJF开源团队当前的配置管理服务器系统软件使用的是Subversion。因此，在使用相关协同开发及版本控制等功能之前需要下载并安装Subversion客户端软件。<br />　　当前EasyJF团队的协同开发工作主要涉及到两个软件，1个是TortoiseSVN，用于在Windows操作系统的资源管理器中直接使用协同功能。另外一个是Subversion的Eclipse插件，用于在Eclipse开发环境中使用Subversion进行协同开发及版本控制。<br />　　当然，还有针对其它开发工具的开发插件以及Linux下的客户端。由于当前成员多半是在Windows平台下做开发，在此就不作过多介绍。</div><div> </div><div><strong>二、 通过资源管理器进行协同开发</strong></div><div><br />　　<strong>1、下载Subversion的客户端TortoiseSVN</strong><br />　　EasyJF中映像地址：<a href="http://dl.easyjf.com/downloads/TortoiseSVN-1.3.3.6219-svn-1.3.1.msi">http://dl.easyjf.com/downloads/TortoiseSVN-1.3.3.6219-svn-1.3.1.msi</a></div><div>　　或：<a href="http://www.easyjf.com/download/tools/TortoiseSVN-1.3.3.6219-svn-1.3.1.zip">http://www.easyjf.com/download/tools/TortoiseSVN-1.3.3.6219-svn-1.3.1.zip</a><br />　　TortoiseSVN官网下载：<a href="http://tortoisesvn.sourceforge.net/" target="_blank">http://tortoisesvn.sourceforge.net/</a></div><div> </div><div>　　<strong>2、安装TortoiseSVN<br /></strong>　　下载完成后，直接双击点安装即可，如下图所示：</div><div><br /><img height="381" src="http://www.easyjf.com/upfile/20060527/11486847438881157793070.JPG" width="495" /></div><div> </div><div>　　安装成功后，在开始菜单中的结果如下图所示：</div><div><img height="148" src="http://www.easyjf.com/upfile/20060527/11486848009351157793070.JPG" width="349" /></div><div><br />　　若执行TortoiseSVN，我们会得到下面的结果：</div><div><img height="118" src="http://www.easyjf.com/upfile/20060527/11486848133571157793070.JPG" width="553" /><br /> <br />　　这个对话框告诉我们，TortoiseSVN是一个Shell扩展，我们直接在Windows的资源管理器中直接使用TortoiseSVN的相关功能。</div><div>　　下面我们打开资源管理器，点击一下鼠标右键，会看到类似如下的图：<br /> </div><div><img height="548" src="http://www.easyjf.com/upfile/20060527/11486848269661157793070.JPG" width="684" /><br />　　上图中，右键快键菜单中我了一个SVN Checkout…选项及TortoiseSVN选项，这样即表示客户端软件已经安装完成了。下面即可直接通过资源管理器进行团队项目文件的管理协同管理等操作。</div><div> </div><div>　　<strong>3、导出(下载)EasyJF开源团队的项目源码</strong><br />　　我们随便建一个空的目录比如：E:\easyjf，在资源管理器中打开该文件夹。点“右键”－&gt;”SVN Checkout…”，然后在弹出对话框中输入EasyJF开源项目的库路径(URL)以及本地目录，如下所示：</div><div><img height="460" src="http://www.easyjf.com/upfile/20060527/11486848478251157793070.JPG" width="534" /><br /> </div><div>　　然后点击“OK”按钮，即会提示输入用户名及密码（团队成员请使用由EasyJF配置管理组发放的帐号及密码，游客请使用easyjf作用户名及密码），如下图所示：</div><div><img height="290" src="http://www.easyjf.com/upfile/20060527/11486848693721157793070.JPG" width="551" /><br /> </div><div>　　登录成功后，即可进入项目文件的导出（下载）。如下图所示：</div><div> </div><div><img height="292" src="http://www.easyjf.com/upfile/20060527/11486848848721157793070.JPG" width="550" /><br /> </div><div>　　“导出”完成后点OK，然后在资源管理器即可见到如下图所示内容：<br /> </div><div><img height="292" src="http://www.easyjf.com/upfile/20060527/11486848993721157793070.JPG" width="550" /><br /></div><div> </div><div>　　其中看到项目文件及目录的前面都有一个 标识，这是Subversion的，表示我们这个文件已经受到了版本控制。</div><div> </div><div><img height="287" src="http://www.easyjf.com/upfile/20060527/11486849315291157793070.JPG" width="560" /></div><div> </div><div> </div><div>　　<strong>4、修改项目文件及内容</strong></div><div><br />　　在资源管理器中，对项目文件的操作跟我们平时的操作没有任何区别，比如我们直接双击“目录及文件文明.txt”这个文件，即会调用记事本来编辑文件。我们修改文件中的一些内容，然后点保存，即会出些一个标识该文件已修改过的图标，如下图所示：</div><div><br /> <img height="291" src="http://www.easyjf.com/upfile/20060527/11486849432941157793070.JPG" width="427" /><br />　　上图中的 图标表示该文件已经修改。当所有修改工作完成后，我们需要把本地修改的内容提交到远程配置管理服务器中。直接选中修改过的文件或文件夹，然后点右键，选择其中的“SVN Commit…”命令，如下图：</div><div> </div><div><img height="229" src="http://www.easyjf.com/upfile/20060527/11486849665131157793070.JPG" width="352" /><br /> <br />　　我们会看到弹出一个对话框，并显示出已经修改过的文件，这里我们可以有选择性的选择一些要提交的文件，并在recent message对话框中填写本次修改的相关说明信息等。如下图所示：</div><div> </div><div><img height="479" src="http://www.easyjf.com/upfile/20060527/11486849798721157793070.JPG" width="459" /><br /> </div><div>　　然后点“OK”，此时若刚才没有保存用户名即密码，或者用户权限不够的话。会再次弹出用户登录框，在这里输入自己的用户名（注：游客帐号easyjf不具备修改项目文件的权限），然后点“OK”即可，如下图所示：</div><div><img height="295" src="http://www.easyjf.com/upfile/20060527/11486849969971157793070.JPG" width="557" /><br /> </div><div>　　提交成功后显示如下图所示的信息：<br /> </div><div><img height="294" src="http://www.easyjf.com/upfile/20060527/11486852419501157793070.JPG" width="546" /></div><div><br /> </div><div><strong>　　5、增加文件<br /></strong>　　假如我们在项目中加入了文件，在提交到服务器的时候，需要先执行add操作把新增文件加到更新列表中，然后再执行“SVN Commit…”的时候，才能提交。如下图所示：</div><div><img height="289" src="http://www.easyjf.com/upfile/20060527/11486853018251157793070.JPG" width="487" /><br /> </div><div> </div><div>　　<strong>6、删除项目中的文件<br /></strong>　　在资源管理中选中要删除的内容，然后点右键，选择delete(删除)操作，然后再执行SVN　Commit(提交)即可。如下图所示：<br />  </div><div> </div><div> </div><div>　　<strong>7、其它操作</strong><br />　　当然，Subversion的功能是比较强大的，除了上面的这些基本操作，还有很多其它项目协同方面的功能，如版本标识、文件合并、锁定、解锁等等。请团队成员在具体使用的过程中认真体会。</div><div> </div><div><img height="540" src="http://www.easyjf.com/upfile/20060527/11486974928721157793070.JPG" width="543" /></div><div><strong>三、 在Eclipse中使用Subversion</strong></div><div><strong></strong><br />　　前面介绍了如何在资源管理器中直接使用Subversion进行协同功能，然而在实际的开发工作中，我们更多的时候需要直接在开发工具中使用协同及版本控制功能。下面简单介绍如何在Eclipse中使用Subversion进行协同开发。</div><div> </div><div>　　<strong>1、下载Subversion的Eclipse插件<br /></strong>　　下载地址：<a href="http://dl.easyjf.com/downloads/subversion_eclipse.zip">http://dl.easyjf.com/downloads/subversion_eclipse.zip</a></div><div>　　或：<a href="http://www.easyjf.com/download/tools/subversion_eclipse.zip">http://www.easyjf.com/download/tools/subversion_eclipse.zip</a></div><div>　　<strong> 2、安装插件</strong><br />　　跟其它的Eclipse插件一样，我们直接把下载后的文件解压，并拷贝到的Eclipse主目录即可（当然，更好的做法是使用links目录安装）。插件文件如下图所示：</div><div><br /> <img height="90" src="http://www.easyjf.com/upfile/20060527/11486854134821157793070.JPG" width="510" /></div><div>　</div><div>　　<strong>3、配置</strong><br />　　进入Eclipse系统，若插件安装成功后，我们打开Eclipse的preference面板，在Team组中会看到除了CVS以外，还多了一项SVN。点开该选项，我们可以设置SVN的一些属性（默认情况下不需要任何设置）。如下图所示：</div><div><img height="520" src="http://www.easyjf.com/upfile/20060527/11486853329501157793070.JPG" width="583" /><br /> </div><div>　　进入Eclipse的“windows”-&gt;“show view”-&gt;“other”，我们会看到如下的SVN项：</div><div> </div><div><img height="412" src="http://www.easyjf.com/upfile/20060527/11486854259041157793070.JPG" width="298" /><br /> </div><div> </div><div>　　<strong>4、查看配置服务器中的项目文件</strong><br />　　打开SVN资源库视图，点击添加资源库，我们可以设置配置EasyJF团队开源项目库。并查询项目文件，如下图所示：</div><div><img height="468" src="http://www.easyjf.com/upfile/20060527/11486854388721157793070.JPG" width="717" /><br /> </div><div> </div><div>　　<strong>5、从配置管理服务器中取出项目文件到本地<br /></strong>　　在SVN资源库中点击右键，然后执行“取出为”操作。即可把配置管理服务器中的项目取出到本地。</div><div><img height="264" src="http://www.easyjf.com/upfile/20060527/11486855273411157793070.JPG" width="711" /><br /> </div><div>　　输入用户名及密码后，即可出现项目相关的对话框。通过这些引导对话框，可以快速实现从把远程的项目直接导入本地文件中，交自动建立起与配置服务器中项目的相关关联。如下所示：</div><div><img height="403" src="http://www.easyjf.com/upfile/20060527/11486855742941157793070.JPG" width="529" /><br /> </div><div> </div><div><strong>6、本地项目与配置管理器的项目关联<br /></strong>　　当然，也可以直接把本地已经建好的项目与配置管理服务器中的项目建立关联。使用SVN的协同开发及版本控制功能。直接选中相关的项目名称，点鼠标右键，然后选择“Team”－“Share Project”，然后在对话框中选择“SVN”，接着选择或填写相关的配置参数即可。如下图所示：</div><div> </div><div><img height="159" src="http://www.easyjf.com/upfile/20060527/11486856307791157793070.JPG" width="561" /><br /> </div><div> </div><div>　　<strong>7、使用项目协同及版本控制功能</strong><br />　　在建立好本地项目与远程项目的关联后，我们即可在Eclipse中应用Subversion的各种协同开发及版本控制功能。如下图所示：<br /> <br />　　 <img height="640" src="http://www.easyjf.com/upfile/20060527/11486856549041157793070.JPG" width="766" /><br />　　</div><div> </div><div>　　<strong>由于EasyJF开源项目中的源码只有正式成员才能修改及维护，因此关于团队成员具体的协同开发、版本控制规范等这里不不作详细介绍，我们会在团队的工作文档中以及日常培训中给予介绍。</strong></div><div> </div><div><strong>四、 EasyJF团队开源项目库简介</strong></div><div><strong></strong> </div><div>　　以下是当前EasyJF团队已有开源项目名称及对应SVN地址，游客访问用户即密码皆为easyjf。<br />　　? EasyDBO/  <a href="http://svn.easyjf.com/repository/easyjf/easydbo/" target="_blank">http://svn.easyjf.com/repository/easyjf/easydbo/</a><br />　　? EasyJWeb/ <a href="http://svn.easyjf.com/repository/easyjf/easyjweb/" target="_blank">http://svn.easyjf.com/repository/easyjf/easyjweb/</a><br />　　? EasyJSite建站系统 / <a href="http://svn.easyjf.com/repository/easyjf/easyjsite/" target="_blank">http://svn.easyjf.com/repository/easyjf/easyjsite/</a><br />　　? 简易Java订销管理系统/ <a href="http://svn.easyjf.com/repository/easyjf/easyerp/" target="_blank">http://svn.easyjf.com/repository/easyjf/easyerp/</a><br />　　? EasyJF论坛系统/ <a href="http://svn.easyjf.com/repository/easyjf/easyjfbbs/" target="_blank">http://svn.easyjf.com/repository/easyjf/easyjfbbs/</a><br />　　? EasyJF Blog系统/ <a href="http://svn.easyjf.com/repository/easyjf/easyjfblog/" target="_blank">http://svn.easyjf.com/repository/easyjf/easyjfblog/</a><br />　　? Java知识测评系统/ <a href="http://svn.easyjf.com/repository/easyjf/easyjfexam/" target="_blank">http://svn.easyjf.com/repository/easyjf/easyjfexam/</a><br />　　? Meybo Mail Web开源简化版/ <a href="http://svn.easyjf.com/repository/easyjf/meybomailweb/" target="_blank">http://svn.easyjf.com/repository/easyjf/meybomailweb/</a><br />　　? 简易Java网上商城系统/ <a href="http://svn.easyjf.com/repository/easyjf/easyshop/">http://svn.easyjf.com/repository/easyjf/easyshop/</a><br />　　。。。。。。<br />　　更多的最新EasyJF国产Java开源项目的SVN地址，请随时查看EasyJF开源团队官网。</div><div> </div><div><br /><strong>五、 Subversion简介</strong></div><div><strong></strong><br />　　Subversion是一个GPL版本控制软件，Subversion(SVN, <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a>)项目开始于2000年2月。通过Subversion我们实现在团队中的项目协同开发及版本控制功能。<br />　　Subversion主要有以下功能：<br />　　代码版本的存储与维护;<br />　　代码版本的追踪回溯;<br />　　代码版本的分合控制;<br />　　团队成员多人合作开发专案;<br />　　代码远端管理维护;<br />　　代码匿名截取;<br />　　目录版本控制，目录更名;<br />　　文件的分支与标记等。</div><img src ="http://www.blogjava.net/buaacaptain/aggbug/48462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-05-27 11:27 <a href="http://www.blogjava.net/buaacaptain/archive/2006/05/27/48462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse快速上手指南之使用CVS</title><link>http://www.blogjava.net/buaacaptain/archive/2006/05/26/48276.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Fri, 26 May 2006 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/05/26/48276.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/48276.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/05/26/48276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/48276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/48276.html</trackback:ping><description><![CDATA[本文转自:http://www.yesky.com/239/1904239.shtml<br /><br />版本控制在团队开发中是必不可少的。CVS是优秀的开源版本<a class="bluekey" href="http://www.yesky.com/key/3077/568077.html" target="_blank">控制软件</a>，<a class="bluekey" href="http://www.yesky.com/key/65/5065.html" target="_blank">Eclipse</a>本身就内置了对CVS的支持，只需简单配置，即可使用CVS。<br /><br />　　首先我们要正确安装并配置好CVS服务器，通常Linux Server都自带CVS服务，不过命令行操作比较繁琐。Windows下也有简单易用的CVS服务器，这里我们推荐CVSNT，可以下载CVSNT 2.0.51a，安装并启动CVSNT：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237520.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237520.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　然后切换到Repositories面板，添加一个Repository，命名为/cvs-java，CVSNT会提示是否初始化这个Repository，选择是：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237523.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237523.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　然后在Advanced面板上选中“Pretend to be a Unix CVS version”：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237524.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237524.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　然后，在Windows账户中为每一个开发人员添加用户名和口令。<br /><br />　　现在，CVSNT的安装配置已经完成，下一步，启动Eclipse，我们可以使用原有的<a class="bluekey" href="http://www.yesky.com/key/2822/592822.html" target="_blank">Hello</a>工程，或者新建一个Project，然后选择菜单Window-&gt;Show View-&gt;Other，打开CVS-&gt;CVS Repositories：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237525.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237525.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　然后点击按钮<img onerror="this.src='http://www.yesky.com/image20010518/237534.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237534.jpg" align="center" vspace="1" border="1" />，添加一个Repository：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237531.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237531.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　注意用户名和口令直接填Windows的用户名和口令，然后选中“Validate Connection on Finish”，点击Finish完成：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237528.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237528.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　首先，我们要将一个现有的工程放到CVS服务器中，切换到Package Explorer，选中<a class="bluekey" href="http://www.yesky.com/key/3290/8290.html" target="_blank">Hello</a>工程，右键点击，选择Team-&gt;Share Project…：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237529.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237529.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　使用刚才我们添加的Repository，继续，并将所有文件都添加到CVS中，最后Eclipse提示Commit：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237557.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237557.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　填入一个简单的注释，确定，然后Eclipse会把整个工程提交到CVS服务器，可以在Package Explorer中看到图标发生了变化，Hello.java文件后面会有版本号1.1。在CVS Repositories面板中刷新，可以看到刚添加进来的工程：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237560.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237560.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　在团队开发中，当创建了一个基本的工程并提交到CVS后，别的开发人员首先要Check Out这个工程到各自的本地计算机上，这里为了演示，首先我们在Package Explorer中删除Hello工程，然后打开CVS Repositories（如果没有看到Repository就按照上面的方法添加Repository），选择Hello工程，右键点击，选择Check Out As…：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237562.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237562.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　作为一个Project签出，就可以在Package Explorer中看到签出的工程。<br /><br />　　当对某些源文件作了修改后，需要提交更改到CVS服务器。选中更改的文件或工程，右键点击，选择Team-&gt;Commit…：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/237564.jpg';" hspace="3" src="http://www.yesky.com/image20010518/237564.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　然后填入简单的注释，就可以提交到CVS服务器上了，可以看到源文件的版本号变成了1.2。<br /><br />　　以上简单介绍了如何搭建CVS服务器以及在Eclipse中如何使用CVS，可以参考CVS手册以便了解<a class="bluekey" href="http://www.yesky.com/key/4588/534588.html" target="_blank">Branch</a>、Merge等更多功能的使用。<img src ="http://www.blogjava.net/buaacaptain/aggbug/48276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-05-26 10:43 <a href="http://www.blogjava.net/buaacaptain/archive/2006/05/26/48276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何利用iText在JSP中生成PDF报表 </title><link>http://www.blogjava.net/buaacaptain/archive/2006/05/25/48089.html</link><dc:creator>船长</dc:creator><author>船长</author><pubDate>Thu, 25 May 2006 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/buaacaptain/archive/2006/05/25/48089.html</guid><wfw:comment>http://www.blogjava.net/buaacaptain/comments/48089.html</wfw:comment><comments>http://www.blogjava.net/buaacaptain/archive/2006/05/25/48089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/buaacaptain/comments/commentRss/48089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/buaacaptain/services/trackbacks/48089.html</trackback:ping><description><![CDATA[
		<span id="LblContent">转自csdn：<a href="http://kb.csdn.net/java/Articles/200309/c2b8794b-ac82-457c-af08-435d241e9f28.html">http://kb.csdn.net/java/Articles/200309/c2b8794b-ac82-457c-af08-435d241e9f28.html</a><br />1．    背景<br />2．    介绍iText<br />3．    如何利用iText在java程序中生成PDF报表<br />4．    如何利用iText在JSP中生成PDF报表<br />1）    直接在服务器上生成PDF文件<br />2）    通过jsp生成PDF文件流输出到客户端<br />3）    通过Servlet生成PDF文件流输出到客户端<br />5．    总结<br /><br /><br /><h3>1．背景</h3><br />    前不久做了一个通过JSP生成PDF报表的小项目，算得上开了一次眼界。企业的一些信息通过网络形成Html报表，虽然IE可以直接打印显示在其中的内容，但是从界面上来看，如果直接将Html的显示结果打印出来，显得不太美观。如果将它转成PDF文件再打印，则打印效果会好很多。<br /><h3>2．iText简介</h3><br />    iText是一个开放源码的Java类库，可以用来方便地生成PDF文件。大家通过访问<a href="http://sourceforge.net/project/showfiles.php?group_id=15255&amp;release_id=167948">http://sourceforge.net/project/showfiles.php?group_id=15255&amp;release_id=167948</a>下载最新版本的类库，下载完成之后会得到一个.jar包，把这个包加入JDK的classpath即可使用。如果生成的PDF文件中需要出现中文、日文、韩文字符，则还需要通过访问<a href="http://itext.sourceforge.net/downloads/iTextAsian.jar">http://itext.sourceforge.net/downloads/iTextAsian.jar</a>下载iTextAsian.jar包。<br />关于iText类库的使用，<a href="http://www.lowagie.com/iText/tutorial/index.html">http://www.lowagie.com/iText/tutorial/index.html</a>有比较详细的教程。该教程从入门开始，比较系统地介绍了在PDF文件中放入文字、图片、表格等的方法和技巧。读完这片教程，大致就可以做一些从简单到复杂的PDF文件了。不过，试图通过教程解决在生成PDF文件过程中遇到的所有困难无疑是一种奢望。所以，阅读iText的api文档显得非常重要。读者在下载类库的同时，也可以下载类库的文档。<br /><h3>3．如何利用iText在java程序中生成PDF报表</h3><br />    以下是上述教程中一个最简单的例子，这个例子刻画了通过iText生成PDF文件的一般<br />程序框架。读者只需要在document.open();和document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。该例子只在PDF文件中加了“Hello World“一行文字。<br /><div class="codeStyle"><ol><li>        <font color="#ff0000">Document</font> document = <b><font color="#0000ff">new</font></b> <font color="#ff0000">Document</font>(); 
</li><li>        <b><font color="#0000ff">try</font></b> {  
</li><li>            PdfWriter.getInstance(document, <b><font color="#0000ff">new</font></b> <font color="#ff0000">FileOutputStream</font>          (<font color="#ff33ff">"Chap0101.pdf"</font>)); 
</li><li>            document.open(); 
</li><li>            document.add(<b><font color="#0000ff">new</font></b> Paragraph(<font color="#ff33ff">"Hello World"</font>)); 
</li><li>        } 
</li><li>        <b><font color="#0000ff">catch</font></b>(DocumentException de) { 
</li><li>            <b><a href="http://kb.csdn.net/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.err.println(de.getMessage()); 
</li><li>        } 
</li><li>        <b><font color="#0000ff">catch</font></b>(<font color="#ff0000">IOException</font> ioe) { 
</li><li>            <b><a href="http://kb.csdn.net/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.err.println(ioe.getMessage()); 
</li><li>        } 
</li><li>        document.close(); </li></ol></div><br />    由以上的例子可见，程序的框架十分清楚明了。然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外，似乎还没有其它更好的方法。<br /><h3>4．如何通过JSP生成PDF报表</h3><br />    这一部分是在iText的教程中所没有的，网上的相关资料也比较少。我曾在CSDN上看过有人开帖询问实现细节，有人回复了实现的原理：先在服务器上生成PDF文件，然后用户通过点击指向PDF文件的超链接选择下载或打开。这是一个思路，或者说是思路之一。本文实现了这个思路，又给出另外一个思路并通过两种途径实现之。<br />1）直接在服务器上生成PDF文件。<br /><div class="codeStyle"><ol><li>&lt;%@ page <b><font color="#0000ff">import</font></b> =<font color="#ff33ff">"com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"</font>%&gt; 
</li><li>&lt;% 
</li><li>        <b><a href="http://kb.csdn.net/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> filename = <font color="#ff33ff">"PDF"</font>+(<b><font color="#0000ff">new</font></b> <font color="#ff0000">Random</font>()).nextInt()+<font color="#ff33ff">".pdf"</font> ; 
</li><li>        <font color="#ff0000">Document</font> document = <b><font color="#0000ff">new</font></b> <font color="#ff0000">Document</font>(PageSize.A4); 
</li><li>        ServletOutputStream out1 = response.getOutputStream(); 
</li><li> <b><font color="#0000ff">try</font></b>{ 
</li><li>            PdfWriter writer = PdfWriter.getInstance(document, <b><font color="#0000ff">new</font></b> <font color="#ff0000">FileOutputStream</font>(filename) ); 
</li><li>            document.open(); 
</li><li>            document.add(<b><font color="#0000ff">new</font></b> Paragraph(<font color="#ff33ff">"Hello World"</font>)); 
</li><li>            document.close(); 
</li><li>    } 
</li><li>            <b><font color="#0000ff">catch</font></b>(<b><a href="http://kb.csdn.net/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b> e){} 
</li><li>%&gt; </li></ol></div><br />   上面的程序在服务器上生成了一个静态的PDF文件。显然，每次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通过随机函数来命名生成的PDF文件。本程序的缺点就是，每次运行都会在服务器上产生一个PDF文件，如果不及时删除，数量会越来越大，这显然是站点维护者所不愿意看到的。<br />2）将PDF文件通过流的形式输送到客户端的缓存。这样做的好处是不会在服务器上留下任何“遗迹”。<br />i）直接通过JSP页面生成<br /><div class="codeStyle"><ol><li>&lt;%@ 
</li><li>       page <b><font color="#0000ff">import</font></b>=<font color="#ff33ff">"java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"</font>%&gt; 
</li><li>&lt;% 
</li><li>response.setContentType( <font color="#ff33ff">"application/pdf"</font> ); 
</li><li><font color="#ff0000">Document</font> document = <b><font color="#0000ff">new</font></b> <font color="#ff0000">Document</font>(); 
</li><li><font color="#ff0000">ByteArrayOutputStream</font> buffer = <b><font color="#0000ff">new</font></b> <font color="#ff0000">ByteArrayOutputStream</font>(); 
</li><li>PdfWriter writer=PdfWriter.getInstance( document, buffer ); 
</li><li>document.open(); 
</li><li>document.add(<b><font color="#0000ff">new</font></b> Paragraph(<font color="#ff33ff">"Hello World"</font>)); 
</li><li>document.close(); 
</li><li><font color="#ff0000">DataOutput</font> output = <b><font color="#0000ff">new</font></b> <font color="#ff0000">DataOutputStream</font>( response.getOutputStream() ); 
</li><li><b><font color="#0000ff">byte</font></b>[] bytes = buffer.toByteArray(); 
</li><li>response.setContentLength(bytes.<b><font color="#0000ff">length</font></b>); 
</li><li><b><font color="#0000ff">for</font></b>( <b><font color="#0000ff">int</font></b> i = 0; i &lt; bytes.<b><font color="#0000ff">length</font></b>; i++ ) { output.writeByte( bytes[i] ); } 
</li><li>%&gt; </li></ol></div>ii）通过Servlet生成<br /><div class="codeStyle"><ol><li><b><font color="#0000ff">import</font></b> java.io.*; 
</li><li><b><font color="#0000ff">import</font></b> javax.servlet.*; 
</li><li><b><font color="#0000ff">import</font></b> javax.servlet.http.*; 
</li><li><b><font color="#0000ff">import</font></b> com.lowagie.text.*; 
</li><li><b><font color="#0000ff">import</font></b> com.lowagie.text.pdf.*; 
</li><li><b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> doGet(<a href="http://kb.csdn.net/source/j2ee1.3.1/javax/servlet/http/HttpServletRequest.java.html" target="_blank"><font class="classLink"><u>HttpServletRequest</u></font></a> request, 
</li><li>                               <a href="http://kb.csdn.net/source/j2ee1.3.1/javax/servlet/http/HttpServletResponse.java.html" target="_blank"><font class="classLink"><u>HttpServletResponse</u></font></a> response) 
</li><li> <b><font color="#0000ff">throws</font></b> <b><a href="http://kb.csdn.net/source/jdk142/java/io/IOException.java.html" target="_blank"><font class="classLink"><u>IOException</u></font></a></b>,<a href="http://kb.csdn.net/source/j2ee1.3.1/javax/servlet/ServletException.java.html" target="_blank"><font class="classLink"><u>ServletException</u></font></a></li><li>{ 
</li><li>  <font color="#ff0000">Document</font> document = <b><font color="#0000ff">new</font></b> <font color="#ff0000">Document</font>(PageSize.A4, 36,36,36,36); 
</li><li>  <b><a href="http://kb.csdn.net/source/jdk142/java/io/ByteArrayOutputStream.java.html" target="_blank"><font class="classLink"><u>ByteArrayOutputStream</u></font></a></b> ba = <b><font color="#0000ff">new</font></b> <b><a href="http://kb.csdn.net/source/jdk142/java/io/ByteArrayOutputStream.java.html" target="_blank"><font class="classLink"><u>ByteArrayOutputStream</u></font></a></b>(); 
</li><li>  <b><font color="#0000ff">try</font></b></li><li>  { 
</li><li>     PdfWriter writer = PdfWriter.getInstance(document, ba); 
</li><li>     document.open(); 
</li><li>     document.add(<b><font color="#0000ff">new</font></b> Paragraph(<font color="#ff33ff">"Hello World"</font>)); 
</li><li>  } 
</li><li>  <b><font color="#0000ff">catch</font></b>(DocumentException de) 
</li><li>  { 
</li><li>    de.printStackTrace(); 
</li><li>    <b><a href="http://kb.csdn.net/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.err.println(<font color="#ff33ff">"A Document error:"</font> +de.getMessage()); 
</li><li>   } 
</li><li>  document.close(); 
</li><li>  response.setContentType(<font color="#ff33ff">"application/pdf"</font>); 
</li><li>  response.setContentLength(ba.size()); 
</li><li>  <a href="http://kb.csdn.net/source/j2ee1.3.1/javax/servlet/ServletOutputStream.java.html" target="_blank"><font class="classLink"><u>ServletOutputStream</u></font></a> out = response.getOutputStream(); 
</li><li>  ba.writeTo(out); 
</li><li>  out.flush(); 
</li><li>} </li></ol></div><br /><h3>5．结束</h3><br />  我在项目中采用的是第二种方法。本文的源码在我的tomcat4上面都是调试通过的。希望可以给大家带来方便。<br />欢迎大家采用，如需转载，请注明出处。</span>
<img src ="http://www.blogjava.net/buaacaptain/aggbug/48089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/buaacaptain/" target="_blank">船长</a> 2006-05-25 18:22 <a href="http://www.blogjava.net/buaacaptain/archive/2006/05/25/48089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>