JSF入门

来源:互联网 发布:淘宝货到付款拒收后果 编辑:程序博客网 时间:2024/06/05 20:00

 JSF需要的jar文件
jsf-impl.jar jsf-api.jar commons-digester.jar commons-collections.jar  commons-beanutils.jar jstl.jar
standard.jar

web.xml配置jsf servlet

   <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Faces Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>

   <!--配置文件路径 -->
    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>/WEB-INF/faces-beans.xml,/WEB-INF/faces-navigation.xml</param-value>
    </context-param>

上面的定义们将所有.faces 的请求交由 FaceServlet 来处理,FaceServlet 会唤起相对的.jsp 网页,例如请求是/index.faces 的话,则实际上会唤起/index.jsp 网页,完成以上的配置,您就可以开始使用 JSF了。

JSF预设会读取faces-config.xml中关于Bean的定义,如果想要自行设置定义档的名称,我们是在web.xml中提供javax.faces.CONFIG_FILES参数,例如:
<context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/beans.xml</param-value>
</context-param>
配置文件可以有多个,中间以 "," 区隔,例如:/WEB-INF/navigation.xml,/WEB-INF/beans.xml

JSF配置文件
<?xml version="1.0"?>
 <!DOCTYPE faces-config PUBLIC
 "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
 "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
    <navigation-rule>
        <from-view-id>/pages/index.jsp</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/pages/welcome.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

    <managed-bean>
        <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>
            onlyfun.caterpillar.UserBean
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>


<navigation-rule>定义了页面流程,当请求来自<from-view-id>中指定的页面,并且指定了<navigation-case>中的<from-outcome>为login时,则会将请求导向至<to-view-id>所指定的页面

<managed-bean>用来统一管理Bean
<h:commandButton value="送出" action="#{user.verify}"/>
action属性指定根据verify方法的返回值来导航页面

对于JSF,每一个视图(View)都有一个独特的标识(identifier),称之为View  ID ,设定时都是以/作为开头,如果您请求时的路径是/pages/index.faces,则JSF会将副文件名改为/pages/index.jsp,以此作为view-id。

<from-view-id>代表请求的页面,

<to-view-id>代表返回的页面,

<from-outcome>既可以代表页面配置的action的值,也可以是ManagedBean中action方法返回的字符串。

如果页面上<h:commandButton> 的action是一个EL表达式,则<from-outcome>代表的是action方法返回的字符串。
还可以加入<from-action>, 进一步规范表单结果必须根据哪一个动作方法(action method)
例如:<from-action>#{user.verify}</from-action> 


在导航时,预定义都是使用forward的方式,在<navigation-case>中加入一个<redirect/>


表单元素和JavaScript
要在javascript中取得<h:form>包含的JSF组件的信息,可以在<h:form>标签上定义id属性
此时<h:form>包含的JSF组件的id为(<h:form>的id属性值)+":"+(JSF组件id属性值)
例如:
<h:form id="test">
    <h:inputText value="#{user.userInfo.username}" id="username"/>
</h:form>
输入框的id为test:username


JSF表达式语言
JSF EL是以#开始,将变量或运算式放置在 { 与 } 之间
变量名称如果是Bean的话,可以通过使用 '.'导航

JSF所提供的隐含对象,大致上对应于JSP隐含对象
不过JSF隐含对象移除了pageScope与pageContext。而增加了facesContext与view,它们分别对应于 javax.faces.context.FacesContext与javax.faces.component.UIViewRoot。

对于Map类型对象,我们可以使用 '.' 运算符指定key值来取出对应的value,也可以使用 [ 与 ] 来指定
例如:
<f:view>
    <b> 您好, <h:outputText value="#{param['name']}"/> </b>
 </f:view>
如果变量是List类型或数组的话,则可以在 [] 中指定索引
<f:view>
     <h:outputText value="#{someBean.someList[0]}"/>  
     <h:outputText value="#{someBean.someArray[1]}"/>
</f:view>
JSF表达式也可以指定字面常数,对于true、false、字符串、数字,JSF EL会尝试进行转换
如果要输出字符串,必须以单引号 ' 或双引号 " 括住,如此才不会被认为是变量名称

JSF国际化
资源文件名称由basename加上语言与地区来组成
basename.properties ,basename_en.properties, basename_zh_CN.properties
没有指定语言与地区的basename是预定义的资源文件名称,JSF会根据浏览器送来的Accept-Language header中的内容来决定该使用哪一个资源文件名称
例如: Accept-Language: zh_CN, en-US, en
如果浏览器送来这些header,则预定义会使用简体中文,接着是美式英文,再来是英文语系,如果找不到对应的信息资源文件,则会使用预定义的信息资源文件(信息资源文件必须是ISO-8859-1编码,可以用JDK的native2ascii来转换)
使用<f:loadBundle>标签来指定载入信息资源
例如:
<f:loadBundle basename="messages" var="msgs"/>
<h:outputText value="#{msgs.titleText}"/>

也可以在faces-config.xml中设定语系
 <application>
        <local-config>
            <default-locale>en</default-locale>
            <supported-locale>zh_CN</supported-locale>
        </local-config>
</application>
<local-config>一定有一个<default-locale>

在页面中设定一个表单,可以让使用者选择语系,例如设定单选钮
<f:view locale="#{user.locale}">
<f:loadBundle basename="messages" var="msgs"/>
<h:selectOneRadio value="#{user.locale}">
     <f:selectItem itemValue="zh_CN" itemLabel="#{msgs.zh_CNText}"/>
     <f:selectItem itemValue="en" itemLabel="#{msgs.enText}"/>
</h:selectOneRadio>


JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在配置文件中,您只要修改配置文件,就可以修改 Bean 之间的相依关系。
<managed-bean-class>设定所要使用的Bean类
<managed-bean-name>设定之名称,可供我们在JSF表达式语言使用
<managed-bean-scope>设定Bean的存活范围,您可以设定为request、session 与application
还可以将存活范围设定为none, 当设定为none时会在需要的时候生成一个新的Bean,例如您在一个method中想要生成一个临时的Bean,就可以将之设定为none。
要注意的是,JSF的标签上的属性设定时,只接受JSF表示语言

配置bean的依赖关系

如果要在其它类别中取得Bean对象,则可以先取得javax.faces.context.FacesContext,它代表了JSF目前的执行的环境物件,接着尝试取得javax.faces.el.ValueBinding物件,从中取得指定的Bean对象
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding = context.getApplication().createValueBinding("#{user}");
UserBean user = (UserBean) binding.getValue(context);

如果只是要尝试取得Bean的某个属性,则可以如下:
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding = context.getApplication().createValueBinding("#{user.name}");
String name = (String) binding.getValue(context);

如果有必要在启动Bean时,自动设置属性的初始值,则可以如下设定
<managed-bean>
    <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>
            onlyfun.caterpillar.UserBean
        </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>name</property-name>
        <value>caterpillar</value>
    </managed-property>
    <managed-property>
        <property-name>password</property-name>
        <value>123456</value>
    </managed-property>
</managed-bean>
如果要设定属性为 null 值,则可以使用<null-value/>标签,例如:
<managed-property>
    <property-name>name</property-name>
    <null-value/>
</managed-property>
<managed-property>
    <property-name>password</property-name>
    <null-value/>
</managed-property>

您也可以将其它的Bean设定给另一个Bean的属性
<managed-bean>
    <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>
            onlyfun.caterpillar.UserBean
        </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>

 <managed-bean>
    <managed-bean-name>other</managed-bean-name>
        <managed-bean-class>
            onlyfun.caterpillar.OtherBean
        </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>user</property-name>
      <value>#{user}</value>
    </managed-property>
 </managed-bean>
在OtherBean中的user属性,接受一个UserBean对象,我们设定前一个名称为user的UserBean对象。

您的Bean上有接受List或Map型态的属性,则您也可以在组态档案中直接设定属些属性的值
<managed-bean>
    <managed-bean-name>someBean</managed-bean-name>
    <managed-bean-class>
       onlyfun.caterpillar.SomeBean
    </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>

    <managed-property>
        <property-name>someProperty</property-name>
        <list-entries>
            <value-class>java.lang.Integer</value-class>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </list-entries>
    </managed-property>

    <managed-property>
        <property-name>someProperty</property-name>
        <map-entries>
            <value-class>java.lang.Integer</value-class>
            <map-entry>
                <key>someKey1</key>
                <value>100</value>
            </map-entry>
            <map-entry>
                <key>someKey2</key>
                <value>200</value>
            </map-entry>
        </map-entries>
    </managed-property>

</managed-bean>

原创粉丝点击