Eclipse是一个非怼U的集成开发环境,q个在IBM支持下的开放源码项目经q一D|期的发展完善Q已lؓq大Java开发者所熟悉。Eclipse的出玎ͼ为Java开发者提供了免费使用强大的Java IDE的机会,通过集成大量的pluginQEclipse的功能可以不断扩展,以支持各U不同的应用?/FONT>
Lomboz是一个免费的Eclipse pluginQ它很多Java应用服务器、J2EElg和Web应用开发集成到Eclipse中,可以帮助Java开发者用Eclipse建立、测试、部|J2EE应用?/FONT>
JBoss是一个开放源码、功能强大的Java应用服务器,也是目前最受Java开发者欢q的Java应用服务器,被Java World的编辑们评ؓ2002q的最佛_用服务器?003q到目前为止的下载量已经过了一百五十万ơ?/FONT>
1Q?Eclipse的下载和安装
首先需要安装JDKQ可以到Sun的网站上M载最新版本ƈ安装?/FONT>
然后?/FONT>www.eclipse.orgM载Eclipse的最新版本,目前的最新版本是2.1。下载以后解压到自己惌的目录中Q比如D:\EclipseQ直接运行eclipse.exeQ第一ơ运行的时候会自动LJDKq完成相应的配置Q然后就q入了Eclipse的主界面。关于Eclipse的基本用方法,developerWorksQEclipse的网站以及Eclipse的随机文档上都有详细Cl,q里不详l描qC?/FONT>
2Q?Jboss的下载、安?/FONT>
JBoss目前的最新版本是3.2.1Q不q我觉得q个版本有一些问题,启动服务器的时候会有一些jar包找不到Q导致WARN和ERROR的发生。所以我推荐下蝲3.0.7Q也可以下蝲集成了Tomcat 4.1.24的JBoss 3.0.7版本?/FONT>
下蝲后解压,我们假设JBOSS_HOME为JBoss的主目录Q执行JBOSS_HOME/bin/run.batQ就启动了JBoss服务器。一般会?分钟左右启动完毕?/FONT>
3Q?Lomboz的下载、安装和配置
Lomboz目前的最新版本是2.1Q我们假设Eclipse的主目录为ECLIPSE_HOMEQ下载以后将其解压到ECLIPSE_HOME/plugins文g夹下面,q样在这个文件夹下面多了一个com.objectlearn.jdt.j2ee文g夏V?/FONT>
然后启动Eclipse, 会自动出现Customize Perspective的对话框Q如果没有出现的话,也可以通过菜单"Window->Customize Perspective"来显C个对话框Q如下图所C:
展开File->NewQ选择所有与Lomboz相关的选项Q?/FONT>
展开Window->Show ViewQ选择Lomboz J2EE View;
展开OtherQ选择Lomboz Actions?/FONT>
认OK?/FONT>
下面要进行Lomboz的配|:
首先Q打开属性对话框Q确保Java->New Project中的讄Q?/FONT>
接着在Lomboz属性中Q确保如下设|:
最后,讄服务器属性?/FONT>
Lomboz预先定义了一些常用的Java服务器的讄Q这些配|文件放在ECLIPSE_HOME/plugins/com.objectlearn.jdt.j2ee/servers 文g夹下面,你可以用文本~辑器手工修改(除非你所用的服务器不在Lomboz默认的服务器中,否则我不推荐你这么做Q,也可以在Eclipse的属性对话框中设|,讄的过E非常简单,如下图所C:
记得每次修改以后Q都要点击Apply?/FONT>
上图是Properties标签下的讄QClasspath标签下一般不需要做M改动Q注意:如果你没有听我文章开始部分的劝告Q用了JBoss3.2.0以上的版本,可能需要手工加入多了个jar包,q是体力z,有些ȝ。我不知道这是不是JBoss的问题,具体操作我在下面会提一下)?/FONT>
通过以上三个步骤Q就完成了Lomboz对J2EE开发的支持和JBoss的配|。你可以q入文章的第二部?使用Eclipse开发Web应用"了?/FONT>
注意事项Q?/FONT>
aQ如果服务器不在默认服务器之列;
在ECLIPSE_HOME/plugins/com.objectlearn.jdt.j2ee/servers 文g夹下新徏一个后~名ؓserver的文Ӟ然后Ҏ已有的server文g为模版,用文本编辑器~辑server文g。徏立了一个新的server文g以后Q也可以在Lomboz的属性页中进行相应的讄?/FONT>
bQ?如果使用了JBoss3.2.0版本?/FONT>
打开Window>Preferences>Lomboz>ServerDefinitionsQ选择你的服务器,然后选择classpath标签Q将如下的jar包加入到server library中:
JBOSS_HOME\lib\concurrent.jar JBOSS_HOME \lib\boss-system.jar JBOSS_HOME \server\default\lib\jboss.jar JBOSS_HOME \server\default\lib\jpl-pattern.jar JBOSS_HOME \server\default\lib\jpl-util.jar JBOSS_HOME \server\default\lib\jnpserver.jar JBOSS_HOME \server\default\lib\jboss-transaction.jar
我的JBoss320.server文g中的全部内容在本文的最后部分呈现?/FONT>
首先Q打开File->New->Lomboz J2EE ProjectQ创Z个名为TestJ2EE的J2EE Project?/FONT>
点击NextQ默认各U设|,点击NextQ进入下一个对话框Q在Targeted Server中加入已l配|好的服务器Q如下图Q?/FONT>
在Web Modules和EJB Modules中分别新建Web模块和EJB模块Q在本例中,我们分别命名为MyWeb和MyEJBQ然后点击Finish。这P一个J2EE目的框架就自动生成了?/FONT>
在MyWeb模块下面Q自动生成了两个jsp文gQindex.jsp和error.jspQ以及WEB-INF文g下面的配|文件。我们可以在此基上面d自己的jsp文g和servletQ然后build project?/FONT>
在Eclipse的工h上点击Lomboz J2EE project outliner的按钮:
q样Q在Eclipse上就出现了Lomboz J2EE ViewQ如下图所C:
׃我事先已l部|了另一个Web服务器:TomcatQ所以在MyWebq个模块上面出现了它所l定的这两个服务器,JBoss 3.0 All 旁边的红色标记表C它是默认的服务器。可以通过叛_Web模块选择更改默认的服务器Q如下图Q?/FONT>
选择好服务器以后Q在Lomboz J2EE View中右键单L务器Q选择q行服务器,{服务器启动好以后,右键单击Web模块Q选择Deploy ModuleQ这样就完成了Web模块在服务器上的部v。打开IE览器,键入http://127.0.0.1:8080/MyWebQ就可以看到自己开发的Web应用了?/FONT>
q里有一炚w要说明,如果采用Tomcat作ؓWeb服务器的话,如果Web模块需要重新部|Ԍ则须重新启动Tomcat服务器,JBoss则不需要这么做?/FONT>
注意事项Q?/FONT>
如果从Eclipse中启动JBoss服务器的时候,遇到了这个问题:
|
一般遇到这个问题,可能是由于JRE没有讄好,请在Eclipse中的Preference对话框中Q展开Java->Installed JREsQ查看JRE是否讄好了Q然后打开所开发的目属性对话框Q查看Java Build Path的library中是否有JRE System LibraryQ没有的话,点击Add LibraryQ添加JRE System Library?/FONT>
在第二部?使用Eclipse开发Web应用"中,我们已经在TestJ2EEq个J2EE目中添加了一个名为MyEJB的EJB模块。下面我们通过Lomboz EJB Creation Wizard向MyEJB模块中添加一个Session Bean?/FONT>
点击File->New->Lomboz EJB Creation WizardQ或者右击MyEJB模块Q选择New->Lomboz EJB Creation WizardQ显C出如下对话框:
在com.dino.testj2ee.myejbq个包下面创Z个名为MyEJB的Stateless Session Bean。完成以后,在TestJ2EE目的src文g夹下面,出现了一个名为MyEJBBean.java的文Ӟ叛_q个文gQ选择New->Lomboz EJB Method WizardQ可以给q个EJBd各种Ҏ。我d了一个helloWorldҎQ返回一个Stringcd。如下图所C:
然后Q需要把MyEJBq个Session Beand到MyEJBq个模块上面Q右击MyEJB.javaQ选择Lomboz J2EE?>Add EJB to ModuleQ选择MyEJBQOK?/FONT>
叛_MyEJB模块Q选择LombozJ2EE?>Generate EJB ClassesQ这样就在ejbsrc目录下面自动生成了下面几个文Ӟ
MyEJBHome.java MyEJBRome.java MyEJBLocalHome.java MyEJBLocal.java MyEJBSession.java (MyEJBSession extends MyEJBBean) MyEJBUtil.java
Build project以后Q自动将模块打包完毕。接着可以按照部|Web模块的步骤来部vEJB模块了?/FONT>
最后,我们建立一个应用程序来试EJB?/FONT>
通过File->New->Lomboz EJB Test Client Wizard打开一个对话框Q按下图填写Q?/FONT>
完成以后Q在src目录下面生成了TestMyEJB.javaQ在其中的testBeanҎ中加入测试代码:
|
如果目前JBoss服务器已l启动,而且MyEJB模块已经部v的话Q执行TestMyEJBQ就会在ConsoleH口上显C出Q?/FONT>
|
通过以上的介l,我们了解刎ͼLomboz使Eclipse开发J2EE应用变得非常便,而且Eclipse, Lomboz, JBossq些工具都是免费和开放源码的目Q所以这Ll合对Java开发者来说更有吸引力?/FONT>
对于开发复杂的J2EE应用来说Q上面的介绍可能q不够全面,希望大家在做目的过E中体会Q再ȝ出来的经验放到developerWorks上来分n?/FONT>
姜巍巍,是联想集团Y件设计中心的开发工E师Q热衷于J2EE和Web服务技术。闲暇时Q喜Ƣ阅读计机书籍Qƈ频繁光顾各个Java论坛Q周末的晚上Q一般会乖乖的在电视机前面观看意甲直播。地址Q北京市上地信息产业基地开拓\7号先锋大?邮编Q?00085 。您可以通过E-mail: jiangww@lenovo.com 与他取得联系?/FONT>
|
说明Q阅L文需要一定的Struts基础?BR>注:文中写的action不一定代表具体的Struts Actionc,有时也指作ؓ一个整体的action mapping?/FONT>
[1] 完整的action
<action path="/aFullAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="someJSP.jsp"/>
<forward name="failed" path="someOtherJSP.jsp"/>
</action>
首先QStruts的ActionServlet接收C个请求,然后Ҏstruts-config.xml的配|定位到相应的mappingQ映)Q接下来如果form的范围是request或者在定义的范围中找不到这个formQ创Z个新的form实例Q取得form实例以后Q调用其reset()ҎQ然后将表单中的参数攑օformQ如果validate属性不为falseQ调用validate()ҎQ如果validate()q回非空的ActionErrorsQ将会被转到input属性指定的URIQ如果返回空的ActionErrorsQ那么执行Action的execute()ҎQ根据返回的ActionForward定目标URI?/FONT>
q样做的效果是:execute()仅当validate()成功以后才执行;input属性指定的是一个URI?/FONT>
[2] 仅有Form的action
<action path="/aFormOnlyAction"
type="org.apache.struts.actions.ForwardAction"
name="someForm"
input="someJSP.jsp"
parameter="someOtherJSP.jsp"
/>
首先QStruts会在定义的scope搜寻someFormQ如果找到则重用Q如果找不到则新Z个实例;取得form实例以后Q调用其reset()ҎQ然后将表单中的参数攑օformQ如果validate属性不为falseQ调用validate()ҎQ如果validate()q回非空的ActionErrorsQ将会被转到input属性指定的URIQ如果返回空的ActionErrorsQ那么{到parameter属性指定的目标URI?/FONT>
q样做的效果是:没有actioncd以存放我们的业务逻辑Q所以所有需要写入的逻辑都只能写到form的reset()或者validate()Ҏ中。validate()的作用是验证和访问业务层。因里的action映射不包括forwardQ也没有意义Q,所以不能重定向Q只能用默认的那个forward。这U仅有form的action可以用来处理数据获取qforward到另一个JSP来显C?/FONT>
[3] 仅有Action的action
<action path="/anActionOnlyAction"
type="somePackage.someActionClass">
input="someJSP.jsp"
<forward name="successful" path="someJSP.jsp"/>
<forward name="failed" path="someOtherJSP.jsp"/>
</action>
首先QActionServlet接收到请求后Q取得actioncd例,调用execute()ҎQ然后根据返回的ActionForward在配|中找forwardQforward到指定的URI或action?/FONT>
q样做的效果是:没有form实例被传入execute()ҎQ于是execute()必须自己从请求中获取参数。Action可以被forward或者重定向。这Uaction不能处理通过HTML FORM提交的请求,只能处理链接式的h?/FONT>
[4] 仅有JSP的action
<action path="/aJSPOnlyAction"
type="org.apache.struts.actions.ForwardAction"
parameter="someOtherJSP.jsp"
/>
首先QActionServlet接到h后调用ForwardAction的execute()ҎQexecute()Ҏ配置的parameter属性值来forward到那个URI?/FONT>
q样做的效果是:没有Mform被实例化Q比较现实的情Ş可能是form在request更高U别的范围中定义Q或者这个action被用作在应用E序~译好后充当pȝ参数Q只需要更改这个配|文件而不需要重新编译系l?/FONT>
[5] 两个action对应一个form
<action path="/anAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="/anotherAction.do"/>
</action>
<action path="/anotherAction"
type="somePackage.someOtherActionClass">
name="someForm"
input="someOtherJSP.jsp"
<forward name="successful" path="someResultJSP.jsp"/>
</action>
每个单独的action来讲Q处理上q没有和完整的action有什么实质的区别。这个组合模式可以被用来传递命令对象(formQ。需要注意的是在后一个action中同样会调用form的reset()和validate()ҎQ因此我们必ȝ保form中的信息不被重写?/FONT>
处理的方式大致分ZU:a) 在request中放入一个指C器表明前一个action有意向后一个action传递formQ从而在后一个action可以保留那个form中的|q一方式只能在用forward时用。b) 当用redirect而不是forwardӞ可以把指C器攑֜session或更高的U别Q在命o铄最后一环将q个指示器清除?/FONT>
[6] 两个action对应两个form
<action path="/anAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="/anotherAction.do" redirect="true"/>
</action>
<action path="/anotherAction"
type="somePackage.someOtherActionClass">"
name="someOtherForm"
input="someOtherJSP.jsp"
<forward name="successful" path="someResultJSP.jsp"/>
</action>
q个l合方式跟前一U在程上没有太大区别,只是我们现在对于两个action分别提供了formQ于是代码看上去更加清晰。于是我们可以分别处理WEB应用E序的输入和输出。值得注意的是Q后一个action同样会尝试往form中写入那些参敎ͼ不过我们可以q样处理Qa) 在后一个form中用另一套属性名Qb) 只提供getter而不提供setter?/FONT>
大致的处理是q样Q?BR>前一个action接收输入、验证、然后将数据写入业务层或持久层,重定向到后一个actionQ后一个action手动的从业务?持久层取出数据,写入formQ通过其他方式Q,交给前台JSP昄?/FONT>
q样做的好处是不必保留输入form中的|因此可以使用redirect而不是forward。这样就降低了两个action之间的耦合度,同时也避免了不必要的重复提交?BR>