|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。 计划方针
客户反应体系作为公司与客户交换的平台,几近为一切的企业所使用,比来,公司让我卖力客户反应体系的开辟。因为,公司与外洋客户的营业必要,该体系必需完成中,英,日三国言语的切换(国际化请求)。在接就任务以后,我便决意实验利用今朝开源社区对照盛行的ApacheBeehive(蜂巢)和下一代EJB,EJB3.0等手艺来完成这个体系。
开辟情况
选择平台,开辟工具
为了撑持EJB3.0和Beehive,我们选择JBoss4.0.3使用服务器作为运转平台,它也是今朝独一供应EJB3.0容器的使用服务器。
下载和安装JBoss4.0.3服务器及EJB3.0容器http://www.jboss.com/downloads/index
数据库选用MySql5.0,因为我们没有针对特定命据库编码,因而数据库的移植也长短常便利的。
下载MySql5.0http://dev.mysql.com/downloads/mysql/5.0.html
因为要开辟EJB3.0和Beehive使用,选择Ecllipse这个IDE,
下载EcllipseSDK3.1http://eclipse.org/downloads/
为了撑持EJB3.0的开辟,下载JbossEcllipseIDE这个Ecllipse插件
http://www.jboss.com/products/jbosside/downloads
Pollinate是另外一个Ecllipse插件,它也是今朝独一撑持Beehive项目开辟的IDE,固然它远不及WebLogic的Workshop云云壮大,但在具有必定BEAWorkshop开辟履历的条件下,利用pollinate其实不会有太年夜的成绩。
下载并安装Pollinate插件http://www.eclipse.org/pollinate/
Beehive简介
在体系计划之前,选择一个优异的体系框架长短常主要的。Beehive是Apahce的开放源代码项目。自2004年5月份,BEA体系公司公布将WebLogicPlatform中一系列居于中心位置的运转时框架(RuntimeFramework)开放源代码并奉献给Apache项目后,这个Beehive的框架就一向成为开源社区存眷的核心之一。
Beehive的方针是使J2EE开辟加倍复杂,它是一个可扩大的Java使用程序框架,该框架具有针对Web服务,Web使用程序和资本会见的集成元数据驱动的编程模子。该框架使用了JDK1.5的最新立异,出格是JSR175元数据注解,能够削减开辟职员的编码,从而进步开辟效力。今朝,Beehive项目包含Java控件,NetUI,JavaWeb服务元数据,可以匡助Java开辟职员开辟出基于组件和尺度的JAVA使用。
EJB3.0简介
在客户反应体系中,实验利用最新的EJB3.0来完成耐久层的开辟。尽人皆知,因为EJB的庞大性使其在J2EE架构中的体现一向不是很好。EJB也许是J2EE架构中独一一个没有兑现其可以复杂开辟并进步临盆力的组件。而EJB3.0标准在这方面作出勉力以加重其开辟的庞大性。EJB3.0作废或最小化了良多(之前这些是必需完成)回调办法的完成,而且下降了实体Bean及O/R映照模子的庞大性,从而年夜年夜加重了开辟职员举行底层开辟的事情量。
EJB3.0中两个主要的改善分离是:利用了Java5中的元数据注解功效和基于Hibernate的O/R映照模子,在EJB3.0中,任何范例的企业级Bean只是一个加了得当正文的复杂Java对象(POJO)。正文能够用于界说bean的营业接口、O/R映照信息、资本援用信息,效果与在EJB2.1中界说部署形貌符和接口是一样的。在EJB3.0中部署形貌符不再是必需的了;home接口也没有了,你也不用完成营业接口(容器能够为你完成这些事变)。
EJB3.0的设置
JBossEJB3.0创建在Hibernate3.0之上。设置数据源,实体bean必要创立hibernate. Properties设置文件。在EJB3.0部署包下有一个默许的hibernate设置文件ejb3.deployer/META-INF/hibernate.properties。修正这个文件,使实体Bean利用MySql数据源,修正后的设置文件以下:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.connection.release_mode=after_statement
hibernate.transaction.flush_before_completion=false
hibernate.transaction.auto_close_session=false
hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory
在SessionFactory创立后,主动输入schema创立语句到数据库,利用update能够创立和更新本来的schema,而不影响本来数据库中的数据
hibernate.hbm2ddl.auto=update
#hibernate.hbm2ddl.auto=create
hibernate.show_sql=true
hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider
#ClusteredcachewithTreeCache
#hibernate.cache.provider_class=org.jboss.ejb3.entity.TreeCacheProviderHook
#hibernate.treecache.mbean.object_name=jboss.cache:service=EJB3EntityTreeCache
修正蓝色字体部分使其默许数据源改成MySqlDS(JBOSS的数据源设置参考JBOSS相干文档)。
hibernate.connection.datasource=java:/MySqlDS
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
hibernate.jndi.java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
耐久层计划
创立Ejb3.0项目
起首利用JbossIDE,创立一个EJB3.0项目,选择new->project->EJB3.0project,
选择Next按钮,在projectname中输出项目称号:feedback,点击next,
接着选择JBoss4.0.3Server作为项目默许的服务器。单击完成按钮,如许就天生了一个EJB3.0的项目,其根目次下的jndi.property文件指了然JBoss服务器称号服务的一些设置。
数据耐久层
利用EJB3.0的实体Bean来完成体系的数据耐久层.EJB3.0的实体bean也是一个加了正文的复杂Java对象(POJO)。一旦它被EntityManager会见它就成了一个耐久化对象,而且成了耐久化高低文(context)的一部分。一个耐久化高低文与一个事件高低文是松耦合的;严厉的讲,它隐含的与一个事件会话共存。在EJB3.0中开辟实体Bean十分复杂,能够像开辟一样平常的javabean一样编程,只需做大批的正文来界说实体干系,O/R映照等,而在EJB2.1中这些都要经由过程开辟职员本人的计划形式大概别的手艺来完成的(好比,自增加主键战略)。以下界说了一个Item实体bean暗示客户倡议的一个主题:- //声明该类为一个实体Bean对象,暗示客户倡议的一个主题publicclassItemimplementsSerializable{privatestaticfinallongserialVersionUID=-3318132295818643572L;privateintitemId;privateCollectionfeedBacks;privateUseruser;……//此处界说了实体Bean的一对一干系(optional=false)(name="userId",unique=false,nullable=false)publicUsergetUser(){returnuser;}//声明实体Bean的主键及增加战略(generate=GeneratorType.AUTO)(name="itemId")publicintgetItemId(){returnitemId;}//声明主题实体与反应实体之间的的一对多干系,而且制订级联及猎取体例等(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="item")(name="itemId")publicCollectiongetFeedBacks(){returnfeedBacks;}publicvoidsetFeedBacks(CollectionfeedBacks){this.feedBacks=feedBacks;}……}
复制代码 上例中,蓝色部分即是JDK1.5的元数据注解功效,如便指名该类是一个EJB3.0实体Bean,如许在编译后便发生了EJB3.0的实体Bean,在部署时,Jboss的EJB3.0容器可以辨认EJB3.0的实体Bean,并将其映照到对应的数据库表中。详细请参考EJB3.0相干手艺文档。
营业逻辑层
在客户反应体系中利用无形态会话Bean来完成体系的营业逻辑层,在EJB3.0标准中,写一个无形态回话bean(SLSB)只必要一个复杂的Java文件并在类层加上正文就能够了。这个bean能够扩大javax.ejb.SessionBean接口,但这些不是必需的。一个SLSB不再必要home接口,没有哪类EJB再必要它了。Bean类能够完成营业接口也能够不完成它。假如没有完成任何营业接口,营业接口会由恣意public的办法发生。假如只要几个营业办法会被表露在营业接口中,这些办法可使用正文。缺省情形下一切发生的接口都是local(当地)接口,你也能够利用正文来声明这个接口为remote(远程)接口。
利用JBossIDE创立会话Bean非常便利,选择new->others->EJB3.0->SessionBean,翻开会话Bean创立导游,如图所示
SessionBeanType当选择Stateless,标明要创立一个无形态会bean。在BeanName中输出要创立的SessionBean的称号,这里我们创立一个处置客户反应的无形态会话Bean:FeedBacks。点击finish按钮后,分离发生了会话Bean的接口文件和完成文件:FeedBacks,无形态会话Bean的营业接口:
- publicinterfaceFeedBacks{publicFeedBackaddFeedBack(intitemId,Stringtitle,Stringcontent,intuserId,CollectionfeedBackFiles);publicvoiddeleteFeedBack(intfeedBackId);……}
复制代码 在会话Bean的营业接口中,增加会话Bean的接口。个中声明该Bean完成会话Bean的Remote接口
无形态会话Bean的完成:
- publicclassFeedBacksBeanimplementsFeedBacks{publicFeedBackaddFeedBack(intitemId,Stringtitle,Stringcontent,intuserId,CollectionfeedBackFiles){//此处增加完成代码……}……}
- 在完成中完成。
复制代码- 在完成中完成一切的营业逻辑编码。个中声明该Bean是一个无形态会话Bean。
复制代码- [b] WEB[/b][b]层计划[/b]
- [b]
- 创立Beehive项目[/b]
- 起首创立一个Beehive项目,选择new->project->Beehiveproject,翻开BeehiveProject创立导游,如图所示:
- [align=center]
-
- [/align]
- 在name中输出,使用的称号:feedbackApp。下一步中能够选择以界说的使用模板。完成上述步骤后,便天生了一个beehiveproject,重生成的项目已增加了一切必要的Beehive资本。接着就能够开辟页面流和Java控件了。
- [b] 使用[/b][b]JavaControl[/b][b]在[/b][b]Beehive[/b][b]中利用[/b][b]Ejb3.0[/b]
- Beehive供应了EJBControl用于猎取EJB实例,但不撑持EJB3.0,因而在客户反应体系中思索利用JavaControl手艺编写一个由EJB3.0实例的JNDI称号来猎取EJB实例的控件。
- Java控件(Control)架构是一个基于JavaBeans的轻量级组件架构,它公然了用于会见各类J2EE资本范例复杂而分歧的客户机模子。该框架供应了大批的函数,个中包含:基于JSR-175元数据和内部设置数据的设置,主动资本办理,高低文服务和用于创立新控件范例的可扩大计划模子。
- 开辟Java控件,起首将EJB3.0项目引进以后beehive项目中,能够在project->property->buildpath中设置。接着编写一个名为EjbFinder的JavaControl来完成Ejb3.0实列的猎取。
- JavaControl的开辟分为两个步骤,起首要界说JavaControl的接口以下所示:
- [code]//指明该接口是控件EjbFinder的接口部分publicinterfaceEjbFinder{publicObjectgetEjb(StringejbName);} 然后界说JavaControl的完成部分,
- //指明该类是控件EjbFinder的完成部分publicclassEjbFinderImplimplementsEjbFinder,java.io.Serializable{//完成营业接口中的办法publicObjectgetEjb(StringejbName){try{Contextcontext=newInitialContext();//依据JNDI称号猎取ejb3.0实例,并前往该实例return(context.lookup(ejbName));}catch(NamingExceptione){e.printStackTrace();returnnull;}}}
复制代码 Java控件是一种能够在平台使用程序中的任何地位利用的可重用组件。下面的javacontrol用于由ejb实例的JNDI称号,在全部Context中查找,并前往该ejb实例。接着我们即可以在BeehiveWeb使用中的PageFlow(页面流)中利用这个Java控件来猎取ejb3.0实例了:
在必要利用ejb3.0实例的PageFlow页面流把持文件中增加以下代码,声明利用该控件
.apache.beehive.controls.api.bean.Control()
protectedEjbFinder_ejbFinderControl;
接着我们即可以利用这个EjbFinder控件来猎取所需的ejb3.0实例了
feedbacksBean=(FeedBacks)_ejbFinderControl.getEjb(FeedBacks.class.getName());
因为Pollinate中尚不供应控件的视图,为了申明JavaControl与Pageflow(页面流)之间的干系,能够参照下面这张BeaWorkshop中javacontrol的参考视图,图中的主体是一个pageflow(页面流),而右边users就是在该页面流中利用的一个名为users的java控件。
开辟NetUI页面流
NetUIPageFlow(页面流)是一个基于ApacheSruts的Web使用程序框架,具有易于利用,基于JSR-175元数据的单文件编程模子。该页面流构建在模子/视图/把持器元素的中心Struts分别的基本之上,好比主动形态办理和与控件,XMLBeans和JavaServerFaces的一流集成。
页面流利用一种专门计划的讲明和办法把持Web使用程序举动的Java类,称为“把持器(controller)”类。在包括把持器类的目次中,也包括了页面流中利用的JavaServerPage(JSP)。一个JSP要成为页面流的一部分,它必需位于页面流目次中。JSP文件利用的特别标志有助于绑定到数据和营业逻辑操纵。把持器文件中的操纵办法所完成的代码能够招致站点导航、数据传送或经由过程控件挪用后端营业逻辑。并且把持器类中的营业逻辑与JSP文件中界说的暗示代码互相自力,使得全部Web使用的开辟和保护加倍明晰高效。
在Pollinate中创立页面流,选择new->other->PageFlowWizard如图所示
单击next,在弹出框中输出页面流的称号。这里我们创立一个处置客户反应主题的页面流topics,点击完成以后,便天生了一个基本的页面流,翻开页面流地点的文件夹,双击页面流的把持文件Controller.java,点击flow页翻开页面流计划视图,以下所示
它由一个beginAction和一个index.jsp页面构成。左边是计划组件,包含Action,Page,增加所需的页面和Action到页面流中。
在页面流把持文件中增加举措处置代码:- //页面流的把持文件,声明流转的方针.Controller(multipartHandler=Jpf.MultipartHandler.memory,forwards={.Forward(name="showTopics",path="topicList.jsp"),.Forward(name="addTopicAccessories",path="accessories.jsp"),.Forward(name="showLinkmen",path="linkmanList.jsp"),.Forward(name="detailTopic",path="detailTopic.jsp"),.Forward(name="newTopic",path="newTopic.jsp")})publicclassControllerextendsPageFlowController{//在页面流中声明利用的控件.apache.beehive.controls.api.bean.Control()protectedEjbFinder_ejbFinderControl;.apache.beehive.controls.api.bean.Control()protectedFileControl_fileControl;……//每一个Action都对应一次页面流转的举措,以下action对应一个增加反应主题的举措.Action()publicForwardaddTopic(){this.topicForm=null;this.topicForm=newTopicForm();topicForm.setFileList(newArrayList());this.loadLinkman();returnnewForward("newTopic");}……
复制代码 在页面文件中可使用netui标志,完成绑定命据,资本声明,模板利用等功效,如许在页面文件中能够最年夜限制的削减java编码,使得页面更简单保护和办理。以下是一个显现主题列表的页面topicList.jsp:- <netui-template:templatetemplatePage="../web/template/template.jsp"><netui-template:sectionname="leftCol"><jsp:includepage="newTopicNav.jsp"/></netui-template:section><netui-template:sectionname="centerCol"><ejar-ui:windowwidth="70%"title=""><netui:formaction="/newTopic"><%file="../web/template/errors.jspf"%><table><tr><td><netui:spanvalue=""></netui:span></td><td><netui:selectdataSource="pageFlow.topicForm.receiverName"optionsDataSource=""></netui:select></td></tr><tr><td><netui:spanvalue=""></netui:span></td><td><netui:textBoxdataSource="pageFlow.topicForm.title"></netui:textBox></td></tr><tr><td><netui:spanvalue=""></netui:span></td><td><netui:textBoxdataSource="pageFlow.topicForm.deadline"></netui:textBox><netui:spanvalue=""></netui:span></td></tr><tr><td><netui:spanvalue=""></netui:span></td><td><netui-data:repeaterdataSource="pageFlow.topicForm.fileList"><netui-data:repeaterItem><netui:imagesrc="http://www.webjx.com/htmldata/resources/images/i.p.attach.gif"></netui:image><netui:spanvalue=""/></netui-data:repeaterItem></netui-data:repeater></td></tr><tr><td><netui:spanvalue=""></netui:span></td><td><netui:textAreadataSource="pageFlow.topicForm.content"cols="50"rows="10"></netui:textArea></td></tr><tr><tdcolspan="2"height="40"><netui:buttonvalue=""type="submit"action="/saveTopicForm"></netui:button><netui:buttontype="submit"value=""></netui:button></td></tr></table></netui:form><br></ejar-ui:window></netui-template:section></netui-template:template>
复制代码 终极的页面流文件在Pollinate中对应的计划视图以下所示:
在对全部工程举行Build以后,页面流把持文件被编译为一个class文件和一个对应的设置文件WEB-INF.pageflow-struts-generatedjpf-struts-config-[页面流称号].xml,该设置文件界说了一系列把持文件中正文所对应的设置,以下为个中一部分:- <struts-config><form-beans><form-beanname="uploadFileForm"type="org.form.UploadFileForm"className="org.apache.beehive.netui.pageflow.config.PageFlowActionFormBean"><set-propertyproperty="actualType"value="org.form.UploadFileForm"/></form-bean></form-beans><global-exceptions/><global-forwards><forwardname="showTopics"path="/topicList.jsp"/><forwardname="addFeedBackAccessories"path="/feedBackAccessories.jsp"/></global-forwards><action-mappings><actionpath="/addAccessories"name="uploadFileForm"type="org.apache.beehive.netui.pageflow.internal.FlowControllerAction"input="addTopicAccessories"
- parameter="topics.Controller"scope="request"validate="true"><forwardname="newTopic"path="/newTopic.jsp"/><!--forward"addTopicAccessories"(validationErrorForward)--><forwardname="addTopicAccessories"path="/accessories.jsp"/></action>……<message-resourceskey="_defaultValidationMessages"parameter="org.apache.beehive.netui.pageflow.validation.defaultMessages"null="true"/></struts-config>
复制代码 因为篇幅所限,没法具体论述pollinate的利用,读者能够参考相干文章:用Pollinate可视化开辟页面流(JPF)http://dev2dev.bea.com.cn/techdoc/200504503.html
完成国际化
因为要完成中英日文的显现,接纳以下步骤:
开辟和编译代码时指定字符集为UTF-8。Eclipse能够在项目属性中设置。利用过滤器,假如一切哀求都经由一个Servlet把持分派器,那末利用Servlet的filter实行语句,将一切来自扫瞄器的哀求(request)转换为UTF-8,由于扫瞄器发过去的哀求包依据扫瞄器地点的操纵体系编码,多是各类情势编码。request.setCharacterEncoding("UTF-8")。必要设置web.xml激该死Filter。在JSP头部声明:
<%@pagecontentType="text/html;charset=UTF-8"%>。
在Jsp的html代码中,声明UTF-8:
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
设定命据库毗连体例是UTF-8。比方毗连MYSQL时设置URL以下:
jdbc:mysql://localhost:3306/feedback_db?useUnicode=true&characterEncoding=UTF-8
其他和外界交互时可以设定编码时就设定UTF-8,比方读取文件,操纵XML等。
分歧时区工夫显现
因为客户端大概处于分歧的时区,因而应当显现分歧服务器工夫。因为与客户端有关,因而需使用一段javaScript代码,从客户端猎取其地点的时区偏移量。该偏移量是针对GMT工夫而言的,也就是格林威治工夫,以分钟为单元。- functiongetTimezone(){ vard=newDate();document[getNetuiTagName("loginForm",this)][getNetuiTagName("timezone",this)].value=d.getTimezoneOffset();}
复制代码 猎取以后将他传回服务器端并保留在session中。显现工夫时依据这个偏移量来盘算显现的工夫。
总结
手艺
EJB3.0基于Hibernate3.0,年夜年夜简化了开辟的难度与庞大度,使得开辟职员可以疾速高效的举行开辟,Beehive作为Apache的开源项目,取得了Bea的鼎力撑持,使开辟职员完成基于JAVA组件的开辟,是开源项目中构建SOA的幻想选择。
工具
EclipsePollinate作为独一撑持Beehive开辟的工具,能够疾速创立Beehive项目,可是开辟过程当中,代码与计划视图的同步对应仍旧存在一些成绩,好比在.Controller中界说的.Forward,在计划视图中就不克不及被辨认。因而与BEA的Workshop比拟,Pollinate仍旧任重而道远。因而关于年夜型使用的开辟来讲,BeaWorkshop仍旧是不贰选择,关于那些初学者来讲,也能够先利用BEA的Workshop并分离其自带匡助体系,来进修pageflow,javacontrol,javawebservice,包含流派,集成使用等初级手艺。在对这些手艺有了必定的了解以后,进修Beehive的开辟会加倍疾速无效。
本文经由过程一个实例,先容了怎样分离EJB3.0与Beehive疾速开辟J2EE使用。因为接纳了一些新的手艺,因而文中不免有疏漏及毛病的地方,接待人人加以改正。同时十分感激KevinKevman在手艺方面的匡助。
[/code]
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。 |
|