zoukankan      html  css  js  c++  java
  • Seam 的一些必备知识

    Seam框架本身基于JSF和EJB3.0,所以JSF和EJB3是必须要了解的内容,为了更好的使用JSF还需要了解Facelets(JSF和JSP相关)。

     

    JSF的教程可以参考Sang Shinsang.shin@sun.com)的J2EE的教程

    http://www.javapassion.com/j2ee/

     

    EJB3 和 JPA 还可以参考这个教程:

    http://www.javapassion.com/j2ee/

     

    上面两个教程唯一的缺点是:是英文写的;但是也是优点,很原汁原味,不过过分偏重了Sun(个人观点)。

     

    Facelets可以参考ibm上面的文章:《Facelets 非常和是 JSF》

    http://www.ibm.com/developerworks/cn/java/j-facelets/

     

    开发工具,我喜欢使用IDEA,部署和构建依赖Ant,现在还没有研究Maven怎么使用Seam。

    但是最好Maven能支持Seam,做一个Seam Starter的Maven插件,像Struts2 的插件那样好用。

     

    Facelets

    Facelets配置

    我们这里主要讲如何让使用Facelets功能的应用程序在JBoss-4.2.2GA中运行。

    Facelets的版本为1.1.14

     

    目录结构:

    facelets-number-guess

    │  guess.xhtml
    │  index.jsp
    │  response.xhtml
    │  template.xhtml

    └─WEB-INF
        │  faces-config.xml
        │  web.xml
        │
        ├─classes
        │  └─tutorial
        │          NumberBean.class
        │
        └─lib
                jsf-facelets.jar

    lib库中的文件都是从C:/Seam/facelets-1.1.13/lib目录中拷贝而来的,这里需要注意一点,当如下文件:

      el-api-1.0.jar
      el-impl-1.0.jar
      jsf-api-1.2_04-p02.jar
      servlet-api-2.4.jar

    在WEB-INF/lib目录下时在JBoss下无法正常运行,原因是JBoss已经提供了这些API的类库,一旦重复发现,JBoss无法加载这些类库而出错。

     

    web.xml的内容为:

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"

             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

             version="2.5">

        <!-- Use Documents Saved as *.xhtml -->

        <context-param>

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

            <param-value>.xhtml</param-value>

        </context-param>

        <!-- Special Debug Output for Development -->

        <context-param>

            <param-name>facelets.DEVELOPMENT</param-name>

            <param-value>true</param-value>

        </context-param>

        <!-- Optional JSF-RI Parameters to Help Debug -->

        <context-param>

            <param-name>com.sun.faces.validateXml</param-name>

            <param-value>true</param-value>

        </context-param>

        <context-param>

            <param-name>com.sun.faces.verifyObjects</param-name>

            <param-value>true</param-value>

        </context-param>

        <!-- Faces 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>*.jsf</url-pattern>

        </servlet-mapping>

    </web-app>



    上述黑体部分的内容为facelets的配置,稍后说明用途。

     

    faces-config.xml的内容为:

    <?xml version='1.0' encoding='UTF-8'?>

    <!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>

        <application>

            <view-handler>

                com.sun.facelets.FaceletViewHandler

            </view-handler>

        </application>

        <!-- our NumberBean we just created -->

        <managed-bean>

            <managed-bean-name>NumberBean</managed-bean-name>

            <managed-bean-class>tutorial.NumberBean</managed-bean-class>

            <managed-bean-scope>session</managed-bean-scope>

            <managed-property>

                <property-name>min</property-name>

                <value>1</value>

            </managed-property>

            <managed-property>

                <property-name>max</property-name>

                <value>10</value>

            </managed-property>

        </managed-bean>



        <!-- going from guess.xhtml to response.xhtml -->

        <navigation-rule>

            <from-view-id>/guess.xhtml</from-view-id>

            <navigation-case>

                <from-outcome>success</from-outcome>

                <to-view-id>/response.xhtml</to-view-id>

            </navigation-case>

        </navigation-rule>

        <!-- going from response.xhtml to guess.xhtml -->

        <navigation-rule>

            <from-view-id>/response.xhtml</from-view-id>

            <navigation-case>

                <from-outcome>success</from-outcome>

                <to-view-id>/guess.xhtml</to-view-id>

            </navigation-case>

        </navigation-rule>



    </faces-config> 

     

    上述黑体部分的内容为facelets的配置,上述两部分的配置内容结合在一起,可以得出如下结论:

    单用户向服务器请求*.jsf的内容的时候,会被Facelets框架解释为对*.xhtml的处理,这是在这个解释的过程中完成了Facelets的功能。

     

    Facelets的模板功能

    Facelets的一个简单的功能是类似Tile的模板的功能,例如,我们有两个页面guess.xhtml和response.xhtml,我们需要使用共同的布局,那么我们可以设置一个共同的框架模板template.xhtml文件。

    说明:xhtml文件为html文件的子集,必须满足xml的规范,是一个合式的xml文件

    template.xhtml文件的内容为:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml"

          xmlns:ui="http://java.sun.com/jsf/facelets">     Œ

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>

        <title>Facelets: Number Guess Tutorial</title>

        <style type="text/css">

            <!--

            body {

                font-family: Verdana, Arial, Helvetica, sans-serif;

                font-size: small;

            }

            -->

        </style>

    </head>

    <body>

    <h1>

        <ui:insert name="title">Default Title</ui:insert>

    </h1>

    <p>

        <ui:insert name="body">Default Body</ui:insert>Ž

    </p>

    </body>

    </html>

     

    其中内容的一些说明:

    Œ 引入了facelets模板标签

    Ž定义了占位符,之后可以使用动态的内容替换。

     

    guess.xhtml文件的内容

     

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml"

          xmlns:ui="http://java.sun.com/jsf/facelets"

          xmlns:h="http://java.sun.com/jsf/html">

    <body>

    This text above will not be displayed.

    <ui:composition template="/template.xhtml">

        This text will not be displayed.

        <ui:define name="title">

            I'm thinking of a number from #{NumberBean.min} to #{NumberBean.max}. Can you guess it?

        </ui:define>

        This text will also not be displayed.

        <ui:define name="body">

            <h:form id="helloForm">

                <h:inputText type="text" id="userNo" value="#{NumberBean.guess}" validator="#{NumberBean.validate}"/>

                <br/>

                <h:commandButton type="submit" id="submit" action="success" value="Submit"/>

                <br/>

                <h:message showSummary="true" showDetail="false" style="color: red; font-weight: bold;" id="errors1"

                           for="userNo"/>

            </h:form>

        </ui:define>

        This text will not be displayed.

    </ui:composition>

    This text below will also not be displayed.

    </body>

    </html>

     

    上 述的内容相信大家会很容易理解,xmlns部分引入了Facelets标签合JSF的h类型的标签,<ui:define name="title"> ...部分和<ui:define name="body">...两部分定义了模板中的动态部分。

    另外需要注意的是,黑体部分的内容不会作为输出。

     

    response.xhtml文件内容:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html">
    <body>

    <ui:composition template="/template.xhtml">

      <ui:define name="title">
        #{NumberBean.message}
      </ui:define>

      <ui:define name="body">
        <form jsfc="h:form">
        <input jsfc="h:commandButton" type="submit" id="back" value="Back" action="success"/>
        </form>

      </ui:define>

    </ui:composition>

    </body>
    </html>

     

    Facelets对模板的支持

    Facelets可以使用HTML格式的标签处理JSF标签,这样可以方便设计人员的设计,例如可以使用Dreamwaver等工具设计,而在实行的时候按照JSF标签的方式自动的处理数据绑定和事件绑定。

    例如上述response.xhtml中的标签内容:

    <form jsfc="h:form">
        <input jsfc="h:commandButton" type="submit" id="back" value="Back" action="success"/>
    </form>

    上述代码在执行的时候会被翻译为如下的代码:

    <h:from>

         <h:commandButton type="submit" id="back" value="Back" action="success"/>

    </h:from>

    在上述的过程中jsfc属性起到了标志的作用。

     

    另外使用facelets还支持部分的JSTL的标签,虽然并不全面,但是解决了JSF中标签欠缺的问题,Facelets支持的标签为:

    <c:if/>
    <c:forEach/>
    <c:catch/>
    <c:set/>  

    其中forEach标签解决了JSF中没有真正的循环标签的问题(dataTable不算是真正的循环标签);

     

    Facelets支持表达式语言(EL)

    例如:

    <span>Your Basket has ${basket.lineCount} Items</span>


    转自:http://www.dojochina.com/?q=node/723

  • 相关阅读:
    WINDOWS REDIS 修改requirepass 不生效;
    解读JavaScript原型链
    禁止浏览器自动填写用户名密码
    Vue购物车实例
    scrollTop的兼容性
    jQuery架构(源码)分析
    web前端优化整理(转)
    前端模块化:RequireJS(转)
    前端构建之gulp与常用插件(转载)
    PS快捷键
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470070.html
Copyright © 2011-2022 走看看