JAVA编程:J2EE MVC形式JSF与Struts的异同
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。j2ee|js Struts和JSF/Tapestry都属于体现层框架,这两种分属分歧性子的框架,后者是一种事务驱动型的组件模子,而Struts只是纯真的MVC形式框架,老外老是急吼吼说事务驱动型就比MVC形式框架好,何故见得,我们上面举行具体剖析对照一下究竟是怎样回事?起首事务是指从客户端页面(扫瞄器)由用户操纵触发的事务,Struts利用Action来承受扫瞄器表单提交的事务,这里利用了Command形式,每一个承继Action的子类都必需完成一个办法execute。
在struts中,实践是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实践是一个表单只能对应一个事务,struts这类事务体例称为applicationevent,applicationevent和componentevent比拟是一种粗粒度的事务。
struts主要的表单对象ActionForm是一种对象,它代表了一种使用,这个对象中最少包括几个字段,这些字段是Jsp页面表单中的input字段,由于一个表单对应一个事务,以是,当我们必要将事务粒度细化到表单中这些字段时,也就是说,一个字段对应一个事务时,纯真利用Struts就不太大概,固然经由过程分离JavaScript也是能够转弯完成的。
而这类情形利用JSF就能够便利完成,
<h:inputTextid="userId"value="#{login.userId}">
<f:valueChangeListenertype="logindemo.UserLoginChanged"/>
</h:inputText>
#{login.userId}暗示从名为login的JavaBean的getUserId取得的了局,这个功效利用struts也能够完成,name="login"property="userId"
关头是第二行,这里暗示假如userId的值改动而且断定提交后,将触发挪用类UserLoginChanged的processValueChanged(...)办法。
JSF能够为组件供应两种事务:ValueChanged和Action.前者我们已在上节见地过用途,后者就相称于struts中表单提交Action机制,它的JSF写法以下:
<h:commandButtonid="login"commandName="login">
<f:actionListenertype=”logindemo.LoginActionListener”/>
</h:commandButton>
从代码能够看出,这两种事务是经由过程Listerner如许察看者形式贴在详细组件字段上的,而Struts此类事务是原始的一种表单提交Submit触发机制。假如说前者对照言语化(编程言语习气做法相似Swing编程);后者是属于WEB化,由于它是来自Html表单,假如你起步是从Perl/PHP入手下手,反而简单承受Struts这类作风。
基础设置
Struts和JSF都是一种框架,JSF必需必要两种包JSF中心包、JSTL包(标签库),别的,JSF还将利用到Apache项目标一些commons包,这些Apache包只需部署在你的服务器中既可。
JSF包下载地点:http://java.sun.com/j2ee/javaserverfaces/download.html选择个中ReferenceImplementation。
JSTL包下载在http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
以是,从JSF的驱动包构成看,其开源基因也占有很年夜的比重,JSF是一个SUN同伴们产业尺度和开源之间的一个混血儿。
上述两个地点下载的jar兼并在一同就是JSF所必要的全体驱动包了。与Struts的驱动包一样,这些驱动包必需位于Web项目标WEB-INF/lib,和Struts一样的是也必需在web.xml中有以下设置:
<web-app>
<servlet>
<servlet-name>FacesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
</web-app>
这里和Struts的web.xml设置何其类似,几乎千篇一律。
正如Struts的struts-config.xml一样,JSF也有相似的faces-config.xml设置文件:
<faces-config>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
</navigation-rule> <managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>com.corejsf.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
在Struts-config.xml中有ActionFormAction和Jsp之间的流程干系,在faces-config.xml中,也有如许的流程,我们详细注释一下Navigation:
在index.jsp中有一个事务:
<h:commandButtonlabel="Login"action="login"/>
action的值必需婚配form-outcome值,上述Navigation设置暗示:假如在index.jsp中有一个login事务,那末事务触发后下一个页面将是welcome.jsp
JSF有一个自力的事务产生和页面导航的流程布置,这个思绪比struts要十分明晰。
managed-bean相似Struts的ActionForm,正如能够在struts-config.xml中界说ActionForm的scope一样,这里也界说了managed-bean的scope为session。
可是假如你只觉得JSF的managed-bean就这点功效就错了,JSF融进了新的Ioc形式/依附性打针等手艺。
Ioc形式
关于Userbean如许一个managed-bean,其代码以下:
publicclassUserBean{
privateStringname;
privateStringpassword;
//PROPERTY:name
publicStringgetName(){returnname;}
publicvoidsetName(StringnewValue){name=newValue;}
//PROPERTY:password
publicStringgetPassword(){returnpassword;}
publicvoidsetPassword(StringnewValue){password=newValue;}
}
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>com.corejsf.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>name</property-name>
<value>me</value>
</managed-property>
<managed-property>
<property-name>password</property-name>
<value>secret</value>
</managed-property>
</managed-bean>
faces-config.xml这段设置实际上是将"me"赋值给name,将secret赋值给password,这是接纳Ioc形式中的Setter打针体例。
BackingBeans
关于一个webform,我们可使用一个bean包括其触及的一切组件,这个bean就称为BackingBean,BackingBean的长处是:一个单个类能够封装相干一系列功效的数据和逻辑。
说白了,就是一个Javabean里包括其他Javabean,相互挪用,属于Facade形式或Adapter形式。
关于一个BackingBeans来讲,个中包括了几个managed-bean,managed-bean必定是有scope的,那末这个中的几个managed-beans怎样设置它们的scope呢?
<managed-bean>
...
<managed-property>
<property-name>visit</property-name>
<value>#{sessionScope.visit}</value>
</managed-property>
这里设置了一个BackingBeans中有一个setVisit办法,将这个visit赋值为session中的visit,如许今后在程序中我们尽管会见visit对象,从中猎取我们但愿的数据(如用户上岸注册信息),而visit是保留在session仍是application或request只必要设置既可。
UI界面
JSF和Struts一样,除JavaBeans类以外,另有页面体现元素,都是是利用标签完成的,Struts也供应了struts-faces.tld标签库向JSF过渡。
利用Struts标签库编程庞大页面时,一个最年夜成绩是会大批利用logic标签,这个logic好像if语句,一旦写起来,弄的JSP页面象俄罗斯方块一样,可是利用JSF标签就简便幽美:
<jia:navigatorItemname="inbox"label="InBox"
icon="/images/inbox.gif"
action="inbox"
disabled="#{!authenticationBean.inboxAuthorized}"/>
假如authenticationBean中inboxAuthorized前往是假,那末这一行标签就不必显现,多洁净利索!
先写到这里,我会持续对JSF深切对照下往,假如研讨过Jdon框架的人,大概会发明,Jdon框架的jdonframework.xml中service设置和managed-bean一样都利用了依附打针,看来对Javabean的依附打针已敏捷地成为一种新手艺意味,假如你还不懂得Ioc形式,赶忙补课。
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
页:
[1]