jsfstruts:表现层框架的争 JSF和Struts框架的异同

  Struts和JSF/Tapestry都属于表现层框架这两种分属区别性质框架后者是种事件驱动型组件模型而Struts只是单纯MVC模式框架我们下面进行详细分析比较

  首先事件是指从客户端页面(浏览器)由用户操作触发事件Struts使用Action来接受浏览器表单提交事件这里使用了Command模式每个继承Action子类都必须实现个思路方法execute

  在struts中实际是个表单Form对应个Action类(或DispatchAction)句话说:在Struts中实际是个表单只能对应个事件struts这种事件方式称为application eventapplication event和component event相比是种粗粒度事件

  struts重要表单对象ActionForm是种对象它代表了种应用这个对象中至少包含几个字段这些字段是Jsp页面表单中input字段个表单对应个事件所以当我们需要将事件粒度细化到表单中这些字段时也就是说个字段对应个事件时单纯使用Struts就不太可能当然通过结合JavaScript也是可以转弯实现

  而这种情况使用JSF就可以方便实现

<h:inputText id="userId" value="#{login.userId}">
  <f:valueChangeListener type="logindemo.UserLoginChanged" />
</h:inputText>


  #{login.userId}表示从名为loginJavaBeangetUserId获得结果这个功能使用struts也可以实现name="login" property="userId"

  关键是第 2行这里表示如果userId值改变并且确定提交后将触发类UserLoginChangedprocessValueChanged(...)思路方法

  JSF可以为组件提供两种事件:Value Changed和 Action. 前者我们已经在上节见识过用处后者就相当于struts中表单提交Action机制JSF写法如下:

<h:commandButton id="login" commandName="login">
  <f:actionListener type=”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选择其中Reference Implementation

  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>Faces Servlet</servlet-name>
    <servlet->javax.faces.webapp.FacesServlet</servlet-
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
</web-app>


  这里和Strutsweb.xml配置何其相似简直

  正如Strutsstruts-config.xmlJSF也有类似faces-config.xml配置文件:

<faces-config>
  <navigation-rule>
    <from-view-id>/index.jsp</from-view-id>
    <navigation-
      <from-outcome>login</from-outcome>
      <to-view-id>/welcome.jsp</to-view-id>
    </navigation-
  </navigation-rule>
  <managed-bean>
    <managed-bean-name>user</managed-bean-name>
    <managed-bean->com.corejsf.UserBean</managed-bean-
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
</faces-config>


  在Struts-config.xml中有ActionForm Action以及Jsp的间流程关系在faces-config.xml中也有这样流程我们具体解释下Navigation:

  在index.jsp中有个事件:

  <h:commandButton label="Login" action="login" />

  action值必须匹配form-outcome值上述Navigation配置表示:如果在index.jsp中有个login事件那么事件触发后下个页面将是welcome.jsp

  JSF有个独立事件发生和页面导航流程安排这个思路比struts要非常清晰

  managed-bean类似StrutsActionForm正如可以在struts-config.xml中定义ActionFormscope这里也定义了managed-beanscope为session

  但是如果你只以为JSFmanaged-bean就这点功能就错了JSF融入了新Ioc模式/依赖性注射等技术

  Ioc模式

  对于Userbean这样个managed-bean其代码如下:

public UserBean {
  private String name;
  private String password;
  // PROPERTY: name
  public String getName { name; }
  public void Name(String Value) { name = Value; }
  // PROPERTY: password
  public String getPassword { password; }
  public void Password(String Value) { password = Value; }
}
<managed-bean>
  <managed-bean-name>user</managed-bean-name>
  <managed-bean->com.corejsf.UserBean</managed-bean-
  <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注射方式

  Backing Beans

  对于个web form我们可以使用个bean包含其涉及所有组件这个bean就称为Backing Bean Backing Bean优点是:个单个类可以封装相关系列功能数据和逻辑

  说白了就是个Javabean里包含其他Javabean互相属于Facade模式或Adapter模式



  对于个Backing Beans来说其中包含了几个managed-beanmanaged-bean定是有scope那么这其中几个managed-beans如何配置它们scope呢?

<managed-bean>
  ...
  <managed-property>
    <property-name>visit</property-name>
    <value>#{sessionScope.visit}</value>
  </managed-property>


  这里配置了个Backing Beans中有Visit思路方法将这个visit赋值为session中visit这样以后在中我们只管访问visit对象从中获取我们希望数据(如用户登陆注册信息)而visit是保存在session还是application或request只需要配置既可

  UI界面

  JSF和Struts除了JavaBeans类的外还有页面表现元素都是是使用标签完成Struts也提供了struts-faces.tld标签库向JSF过渡

  使用Struts标签库编程复杂页面时个最大问题是会大量使用logic标签这个logic如同语句旦写起来JSP页面象俄罗斯方块但是使用JSF标签就简洁优美:

<jia:navigatorItem name="inbox" label="InBox"
  icon="/images/inbox.g"
  action="inbox"
  disabled="#{!authenticationBean.inboxAuthorized}"/>


  如果authenticationBean中inboxAuthorized返回是假那么这行标签就不用显示多干净利索!



Tags:  struts2验证框架 struts框架 jsfstruts区别 jsfstruts

延伸阅读

最新评论

发表评论