`
csbison
  • 浏览: 150157 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JSF学习笔记

阅读更多

FAQ   

1. JSFSpring如何结合?

A: 通过在faces-config配置文件中加入

     <application>

        <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>

     </application>

     可以使JSFSpring结合。

 

2. 为何称JSF是基于event的?而Struts是基于请求驱动或者Command驱动。

A: JSF是以页面组件为中心的,而页面组件是面向事件的。JSF只有commandButtoncommandLink这两个UI组件是基于事件的,可以设定action属性,而该属性便是调用后台managed-bean的对应方法。

    不过ASP.NET是所有UI组件都是面向事件的。

    而其他UI组件,可以通过设定value属性,来调用后台managed-bean的对应方法,获取其返回值。例如:

    <h:outputText value="#{testBean.creationTime}"/>

    如果获取的返回值是一个自定义类型或者List,如何进行取自定义类型的属性或者迭代?

    可以通过类似EL(称为JSF-EL)的方式来获取嵌套属性的值。可以通过#{purchases.cheapItems[2]}或者

#{purchases.valuableItems["low"]}获取List的值。

 

3. JSF的访问路径的机制?

A: JSF是以页面组件为中心的,类似ASP.NET。所以要访问JSF的应用,实际上是直接访问JSP页面。不过对xx.jsp的访问路径要修改成xx.faces。(类似ASP.NET去访问xx.aspx

 

  

4. JSF是否有interceptor等拦截器机制?如何在managed-bean中使用ServletAPI

A: JSF可以在页面增加actionListener,类似interceptor的机制。

   ServletAPI可以通过FacesContext,例如:

   FacesContext fc = FacesContext.getCurrentInstance();

   fc.getExternalContext().getResponse();

   fc.getExternalContext().getRequest();

 

 

5. JSF可否结合其他JSP标签?结合ajax是否方便?在页面层结合Scriptlet是否方便,可否跟requestAttribute等结合使用?

A: JSF可以使用其他JSP标签以及JSTLJSF通过EL取值和通过JSF-EL取值是效果一样的。例如

     <LI>Employee's first name: ${employee.name.firstName}

   <LI>Employee's first name: <h:outputText value="#{employee.name.firstName}"/> 作用一样。

 

   JSF后台managed-bean的返回值实际上是放在requestAttrubite中,key为其属性名。所以可以直接在JSPScriptlet中与requestAttribute等结合使用。

 

 

6. JSFMVC框架与Struts框架的异同?

A: JSFMVC框架跟ASP.NET类似,是以页面组件为中心的。 要先访问指定的jsp相关的faces然后再跳转到Controller最后再到View。如下图所示:

    StrutsMVC框架是 Controller(action)->View(JSP)

    JSFMVC框架是    View(*.faces)->Controller(managed-bean)->View(JSP)

 

7.JSF能否实现类似Struts action(or servlet)->view(JSP)?.faces相关的jsp能否隐藏起来?

A: 都不能。  

 

8.JSF<managed-bean>可以实现对actionBean的设值注入。

 

9.配置文件的分离,通过在web.xml中设置

  <context-param>

     <param-name>javax.faces.CONFIG_FILES</param-name>

     <param-value>/WEB-INF/faces-config-beans.xml,/WEB-INF/faces-config-nav.xml</param-value>

  </context-param>

10.JSFASP.NET的一些区别。

   ASP.NET页面控件的nameid 是跟自命名是一致的。例如:

   <input name="TextBox1" type="text" value="ss" id="TextBox1" />

 

11.JSF如何传递页面参数?

A: 通过<h:commandLink action="viewProduct" styleClass="highLightLink">

      <h:outputText value="view"/>

      <f:param name="productId" value="#{productBean.id}"/>

      </h:commandLink>

   这种方式是通过post来传递参数的。对于url参数只能在backingBean中,通过如下代码获取

   FacesContext fc = FacesContext.getCurrentInstance();

String id = (String) fc.getExternalContext().getRequestParameterMap().get("id");

 

    JSF的优缺点:

    我认为JSF的优缺点都是因为这个框架是以页面组件为中心。

    优点:可以利用一些功能强大的UI组件,这些UI组件是服务器端,并且基于事件的。可以方便地定义事件响应方法。

    缺点:太依赖于UI组件。目前尚没有可以跟vs.net媲美的IDE来支持基于UI组件的开发。所以开发和配置起来还是有些麻烦,而且开发自定义的UI组件更加复杂。

            因为依赖于UI组件,所以页面层的开发不够灵活。

            因为依赖于UI组件,所以很多原始的html标签不能用。这导致美工设计的静态页面,到程序员这边还要经过不小的调整,而不像其他web框架那样结合方便。

   

 

 

    JSF的标准标签包括以下几个类别:   

输出(Outputs

  其名称以output作为开头,作用为输出指定的讯息或绑定值。

输入(Inputs

  其名称以input作为开头,其作用为提供使用者输入字段。

命令(Commands

  其名称以command作为开头,其作用为提供命令或连结按钮。

选择(Selections

  其名称以select作为开头,其作用为提供使用者选项的选取。

其它

  包括了formmessagemessagesgraphicImage等等未分类的标签。

 

JSF的页面组件的属性中,都没有name这个属性。    这些标准标签都可以设定idstyleClass等属性值。

 

   如果自定义JSF的页面组件,一般会用到以下的类:

   javax.faces.component.UIComponent

 自定义Component所要继承的父类别,但通常,您是继承其子类别,例如UIInputUIOutput等等。

javax.faces.webapp.UIComponentTag

 自定义JSF标签所要继承的父类别,继承它可以帮您省去许多JSF标签处理的细节。

javax.faces.context.FacesContext

 包括了JSF相关的请求信息,您可以透过它取得请求对象或请求参数,或者是Application对象。

javax.faces.application.Application

 包括了一个应用程序所共享的信息

 

   如果安装了myeclipsejsp页面中只要包含有jsftaglib(如下所示),则会自动打开JSFDesigner

   <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>    

 

   JSFStruts2的整合

JSF可以跟Struts2进行整合,具体参考《Struts 2权威指南》

后台可以使用Struts2Action类,这些类因为可以有Spring来管理,更具有可测试性。

前台页面依旧使用JSF的页面组件。

 

只要加入struts2jsflib包以及struts2-jsf-plugin-2.**.jar

然后简单修改web.xml以及在struts.xml中加入相应的interceptors即可,而不需要faces-config.xml配置文件。

    <package name="jsf" extends="jsf-default">

      <interceptors>

       <interceptor-stack name="jsfFullStack">

        <interceptor-ref name="params" />

        <interceptor-ref name="basicStack"/>

        <interceptor-ref name="jsfStack"/>

       </interceptor-stack>

      </interceptors>

      <default-interceptor-ref name="jsfFullStack"/>

     </package>

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics