<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    速動畫教程第二十六集 WebWork2 開發(fā)教程

    Posted on 2006-08-18 01:54 oksonic 閱讀(9780) 評論(21)  編輯  收藏 所屬分類: java

    此為更新版,以前發(fā)布的版本無法完整播放,現(xiàn)已經(jīng)將原來的一段分為三段播放,請放心下載觀看。

    速動畫教程第二十六集 WebWork2 開發(fā)教程

    下載地址:
    http://this.oksonic.cn

    此錄像較大,并且為第一次完整錄間,缺點是制作錄像時沒有修改分辯率以至于現(xiàn)在的分辯率為1280 * 800 還望見諒!

    速動畫教程第二十六集 WebWork2 開發(fā)教程

    目錄:
    ?? 1、完整的注冊和登錄演示
    ?? 2、Model-Driven(模型驅(qū)動)
    ?? 3、使用 JUnit 進行單元測試
    ?? 4、配置表單驗證
    ?? 5、國際化支持
    ?? 6、集成 spring

    1、完整的注冊和登錄演示

    ?? 頁面結(jié)構(gòu)圖
    ???
    ?? 所需要的 JavaBean
    ???
    ?
    ?? 新建工程,名稱為:webwork
    ???
    ?? 拷貝webwork相關(guān)的類庫文件到項目的 lib 目錄下,具體的類庫文件請從《速動畫教程第二十三集》的源程序中拷貝
    ?? 刷新工程

    ?? 新建三個 JAVA 文件
    ??
    ?? User.java 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    package com.test;

    public class User {

    ?private String userName;
    ?private String userPwd;
    ?
    ?public String getUserName() {
    ??return userName;
    ?}
    ?public void setUserName(String userName) {
    ??this.userName = userName;
    ?}
    ?public String getUserPwd() {
    ??return userPwd;
    ?}
    ?public void setUserPwd(String userPwd) {
    ??this.userPwd = userPwd;
    ?}
    ?
    }
    ----------------------------------------------------------------------------------------------------

    ?? LoginAction.java 文件,需要實現(xiàn) com.opensymphony.xwork.Action 接口,內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;

    public class LoginAction implements Action {
    ?????? // 必需進行初始化
    ?private User user = new User();

    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??// 可以在這里調(diào)用Service層來進行驗證,這里只驗證用戶名
    ??if (user.getUserName().equals("oksonic") && user.getUserPwd().equals("oksonic"))
    ???return this.SUCCESS;
    ??else
    ???return this.ERROR;
    ?}
    ?
    }
    ----------------------------------------------------------------------------------------------------

    ?? RegisterAction.java 文件,需要實現(xiàn) com.opensymphony.xwork.Action 接口,內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;

    public class RegisterAction implements Action {
    ?????? // 必需進行初始化
    ?private User user = new User();
    ?
    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??System.out.println(user.getUserName());
    ??System.out.println(user.getUserPwd());
    ??return this.SUCCESS;
    ?}

    }
    ----------------------------------------------------------------------------------------------------


    ?? 新建 xwork.xml 文件,此文件為 webwork 的配置文件,必須放到 src 目錄下
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "<xwork>
    ?<include file="webwork-default.xml" />
    ?<package name="default" extends="webwork-default">
    ??<action name="login" class="com.test.LoginAction">
    ???<!--? 這里的意思是登錄成功后跳轉(zhuǎn)到 /ok.jsp 頁面 -->
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<!--? 登錄失敗后則返回登錄頁 -->
    ???<result name="error" type="dispatcher">
    ????<param name="location">/login.jsp</param>
    ???</result>
    ???<!--? 此段代碼為作用是將request請求的參數(shù)傳遞到 action 中 -->
    ???<interceptor-ref name="params" />
    ??</action>
    ??<action name="register"
    ???class="com.test.RegisterAction">
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<interceptor-ref name="params" />
    ??</action>
    ?</package>
    </xwork>
    ----------------------------------------------------------------------------------------------------
    <action name="login" class="com.test.web.action.LoginAction"> 這一句為定義 action
    執(zhí)行 action 的路徑為 /login.action

    ?? 新建 jsp 文件

    ?? index.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <html>
    <head><title>INDEX</title></head>
    <body>
    ?<a href="login.jsp">Login</a><br>
    ?<a href="register.jsp">Register</a>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? login.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <html>
    <head><title>Login</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<form name="login" action="login.action" method="post">
    ??Username:<input type="text" name="user.userName"><br>
    ??Password:<input type="password" name="user.userPwd"><br>
    ??<input type="submit" name="Submit"><br>?
    ?</form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? register.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <html>
    <head><title>Register</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<form name="register" action="register.action" method="post">
    ??Username:<input type="text" name="user.userName"><br>
    ??Password:<input type="password" name="user.userPwd"><br>
    ??<input type="submit" name="Submit"><br>?
    ?</form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? ok.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <html>
    ?<head>
    ??<title>OK</title>
    ?</head>
    ?<body>
    ??userName=<ww:property value="user.userName" />
    ??<br>
    ??userPwd=<ww:property value="user.userPwd" />
    ??<br>
    ??<a href="index.jsp">HOME</a>
    ?</body>
    </html>
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%> 使用 webwork 的標簽來獲取值,注意紅色字體,需要有斜桿

    ?? 配置 web.xml 文件,文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="
    http://java.sun.com/xml/ns/j2ee
    ??<servlet>
    ??<servlet-name>webwork</servlet-name>
    ??<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
    ?</servlet>
    ?<servlet-mapping>
    ??<servlet-name>webwork</servlet-name>
    ??<url-pattern>*.action</url-pattern>
    ?</servlet-mapping>
    </web-app>
    ----------------------------------------------------------------------------------------------------

    ?? 好了,進行第一段的測試

    2、Model-Driven(模型驅(qū)動)

    Model-Driven(模型驅(qū)動)的 Action 要求我們的 Action 實現(xiàn) com.opensymphony.xwork.ModelDriven 接口,
    它有一個方法:Object getModel(); 我們用這個方法返回我們的模型對象就可以了,也就是 User

    修改 Action 加入 com.opensymphony.xwork.ModelDriven 接口,并創(chuàng)建 Object getModel() 方法
    將表單中的 <input type="text" name="user.userName"> 改為 <input type="text" name="userName">
    修改 xwork.xml 文件,增加 <interceptor-ref name="model-driven"/>

    ??? 具體代碼如下:

    ?? LoginAction.java 文件
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;
    import com.opensymphony.xwork.ModelDriven;

    public class LoginAction implements Action,ModelDriven {
    //? 必需進行初始化
    ?private User user = new User();

    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??// 可以在這里調(diào)用Service層來進行驗證
    ??if (user.getUserName().equals("oksonic") && user.getUserPwd().equals("oksonic"))
    ???return this.SUCCESS;
    ??else
    ???return this.ERROR;
    ?}

    ?public Object getModel() {
    ??return user;
    ?}
    ?
    }
    ----------------------------------------------------------------------------------------------------

    ?? RegisterAction.java 文件
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;
    import com.opensymphony.xwork.ModelDriven;

    public class RegisterAction implements Action,ModelDriven? {
    ?// 必需進行初始化
    ?private User user = new User();
    ?
    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??System.out.println(user.getUserName());
    ??System.out.println(user.getUserPwd());
    ??return this.SUCCESS;
    ?}

    ?public Object getModel() {
    ??return user;
    ?}

    }
    ----------------------------------------------------------------------------------------------------

    ?? 修改 xwork.xml 文件,此文件為 webwork 的配置文件,必須放到 src 目錄下
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "
    <xwork>
    ?<include file="webwork-default.xml" />
    ?<package name="default" extends="webwork-default">
    ??<action name="login" class="com.test.LoginAction">
    ???<!--? 這里的意思是登錄成功后跳轉(zhuǎn)到 /ok.jsp 頁面 -->
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<!--? 登錄失敗后則返回提交頁 -->
    ???<result name="error" type="dispatcher">
    ????<param name="location">/login.jsp</param>
    ???</result>
    ???<!--? 此段代碼為作用是加入模型驅(qū)動 -->
    ???<interceptor-ref name="model-driven"/>
    ???<!--? 此段代碼為作用是將request請求的參數(shù)傳遞到 action 中 -->
    ???<interceptor-ref name="params" />
    ??</action>
    ??<action name="register"
    ???class="com.test.RegisterAction">
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<interceptor-ref name="model-driven"/>
    ???<interceptor-ref name="params" />
    ??</action>
    ?</package>
    </xwork>
    ----------------------------------------------------------------------------------------------------
    ?? 注意:<interceptor-ref name="model-driven"/> 和 <interceptor-ref name="params" /> 的順序一定要分先后

    ?? 這時可以去掉 jsp 文件中 name 值中的對像名了,如:user.userName 可以改為 userName

    ?? login.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <html>
    <head><title>Login</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<form name="register" action="login.action" method="post">
    ??Username:<input type="text" name="userName"><br>
    ??Password:<input type="password" name="userPwd"><br>
    ??<input type="submit" name="Submit"><br>?
    ?</form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? register.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <html>
    <head><title>Register</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<form name="register" action="register.action" method="post">
    ??Username:<input type="text" name="userName"><br>
    ??Password:<input type="password" name="userPwd"><br>
    ??<input type="submit" name="Submit"><br>?
    ?</form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? ok.jsp 文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <html>
    ?<head>
    ??<title>OK</title>
    ?</head>
    ?<body>
    ??userName=<ww:property value="userName" />
    ??<br>
    ??userPwd=<ww:property value="userPwd" />
    ??<br>
    ??<a href="index.jsp">HOME</a>
    ?</body>
    </html>

    3、使用 JUnit 進行單元測試

    ?? 新建一個 JUnit Test Case (LoginActionTest),放到 test.com.test 包中,內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    package test.com.test;

    import java.util.HashMap;
    import java.util.Map;

    import com.opensymphony.xwork.ActionContext;
    import com.opensymphony.xwork.ActionProxy;
    import com.opensymphony.xwork.ActionProxyFactory;
    import com.test.LoginAction;

    import junit.framework.TestCase;

    public class LoginActionTest extends TestCase {

    ?public void testExecute() throws Exception {
    ??Map params = new HashMap();
    ??params.put("user.userName", "oksonic");
    ??params.put("user.userPwd", "oksonic");
    ??Map extraContext = new HashMap();
    ??extraContext.put(ActionContext.PARAMETERS, params);

    ??ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(
    ????"com.test", "login", extraContext);
    ??proxy.setExecuteResult(false);
    ??assertEquals(proxy.execute(), "success");

    ??LoginAction action = (LoginAction) proxy.getAction();
    ??assertEquals(action.getUser().getUserName(), "oksonic");
    ?}

    }
    ----------------------------------------------------------------------------------------------------
    ?? 關(guān)于測試代碼的詳細解釋請查看《WebWork教程》中的內(nèi)容

    ?? 新建一個 JUnit Test Case (RegisterActionTest),放到 test.com.test 包中,內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    package test.com.test;

    import java.util.HashMap;
    import java.util.Map;

    import com.opensymphony.xwork.ActionContext;
    import com.opensymphony.xwork.ActionProxy;
    import com.opensymphony.xwork.ActionProxyFactory;
    import com.test.LoginAction;

    import junit.framework.TestCase;

    public class LoginActionTest extends TestCase {

    ?public void testExecute() throws Exception {
    ??Map params = new HashMap();
    ??params.put("user.userName", "aaa");
    ??params.put("user.userPwd", "bbb");
    ??Map extraContext = new HashMap();
    ??extraContext.put(ActionContext.PARAMETERS, params);

    ??ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(
    ????"com.test", "register", extraContext);
    ??proxy.setExecuteResult(false);
    ??assertEquals(proxy.execute(), "success");

    ??RegisterAction action = (RegisterAction) proxy.getAction();
    ??assertEquals(action.getUser().getUserName(), "aaa");
    ?}

    }
    ----------------------------------------------------------------------------------------------------

    ?? 新建一個 JUnit Test Suite ,這樣就可以一次運行兩個 test case 了,內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    package test.com.test;

    import junit.framework.Test;
    import junit.framework.TestSuite;

    public class AllTests {

    ?public static Test suite() {
    ??TestSuite suite = new TestSuite("Test for test.com.test");
    ??//$JUnit-BEGIN$
    ??suite.addTestSuite(LoginActionTest.class);
    ??suite.addTestSuite(RegisterActionTest.class);
    ??//$JUnit-END$
    ??return suite;
    ?}

    }
    ----------------------------------------------------------------------------------------------------

    ?? 直接進行測試(不需要啟動服務(wù)),出現(xiàn)綠色條表示正常

    4、配置表單驗證
    ??
    ?? 注冊的驗證類型:在 src 目錄下新建 validators.xml 文件,文件內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    <validators>
    ??? <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
    ??? <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
    ??? <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
    ??? <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
    ??? <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
    ??? <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
    ??? <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
    ??? <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
    ??? <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
    ??? <validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
    ??? <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
    </validators>
    ----------------------------------------------------------------------------------------------------


    ?? 要啟動表單驗證,需要增加一個攔截器,對 xwork.xml 文件進行修改,增加 <interceptor-ref name="validationWorkflowStack" />

    ?? 代碼如下:
    ?? xwork.xml
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "
    <xwork>
    ?<include file="webwork-default.xml" />
    ?<package name="default" extends="webwork-default">
    ??<action name="login" class="com.test.LoginAction">
    ???<!--? 這里的意思是登錄成功后跳轉(zhuǎn)到 /ok.jsp 頁面 -->
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<!--? 登錄失敗后則返回提交頁 -->
    ???<result name="error" type="dispatcher">
    ????<param name="location">/login.jsp</param>
    ???</result>
    ???<!--? 如果驗證失敗,則返回登錄頁 -->
    ???<result name="input" type="dispatcher">
    ????<param name="location">/login.jsp</param>
    ???</result>
    ???<!--? 此段代碼為作用是將request請求的參數(shù)傳遞到 action 中 -->
    ???<interceptor-ref name="model-driven"/>
    ???<interceptor-ref name="params" />
    ???<interceptor-ref name="validationWorkflowStack"/>
    ??</action>
    ??<action name="register"
    ???class="com.test.RegisterAction">
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<!--? 如果驗證失敗,則返回登錄頁 -->
    ???<result name="input" type="dispatcher">
    ????<param name="location">/register.jsp</param>
    ???</result>
    ???<interceptor-ref name="model-driven"/>
    ???<interceptor-ref name="params" />
    ???<interceptor-ref name="validationWorkflowStack" />
    ??</action>
    ?</package>
    </xwork>
    ----------------------------------------------------------------------------------------------------

    ?? 修改 LoginAction、RegisterAction,使繼承 ActionSupport 類
    ?? ActionSupport 類實現(xiàn)了數(shù)據(jù)校驗錯誤信息、Action 運行錯誤信息的保存?zhèn)鬟f功
    能。通過擴展 ActionSupport,LoginAction 即可攜帶執(zhí)行過程中的狀態(tài)信息,這
    為之后的錯誤處理,以及面向用戶的信息反饋提供了基礎(chǔ)數(shù)據(jù)。

    ?? LoginAction.java 代碼如下:
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;
    import com.opensymphony.xwork.ActionSupport;
    import com.opensymphony.xwork.ModelDriven;

    public class LoginAction extends ActionSupport implements Action,ModelDriven {
    //? 必需進行初始化
    ?private User user = new User();

    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??// 可以在這里調(diào)用Service層來進行驗證
    ??if (user.getUserName().equals("oksonic") && user.getUserPwd().equals("oksonic"))
    ???return this.SUCCESS;
    ??else
    ???return this.ERROR;
    ?}

    ?public Object getModel() {
    ??return user;
    ?}
    ?
    }
    ----------------------------------------------------------------------------------------------------

    ?? RegisterAction.java 代碼如下:
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;
    import com.opensymphony.xwork.ActionSupport;
    import com.opensymphony.xwork.ModelDriven;

    public class RegisterAction extends ActionSupport implements Action,ModelDriven {
    //? 必需進行初始化
    ?private User user = new User();

    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??System.out.println(user.getUserName());
    ??System.out.println(user.getUserPwd());
    ??return this.SUCCESS;
    ?}

    ?public Object getModel() {
    ??return user;
    ?}
    ?
    }
    ----------------------------------------------------------------------------------------------------

    ?? 修改頁面,為了能夠顯示錯誤消息,需要使用 webwork 的標簽來實現(xiàn)頁面,代碼如下:
    ?? login.jsp
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <html>
    <head><title>Register</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<ww:form name="test" action="login.action" method="POST">
    ??????????? <ww:textfield label="Username" name="userName" required="true"/>
    ??????????? <ww:password label="Password" name="userPwd" required="true"/>
    ??????????? <ww:submit value="Submit"/>
    ???? </ww:form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? register.jsp
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <html>
    <head><title>Login</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<ww:form name="test" action="register.action" method="POST">
    ??????????? <ww:textfield label="Username" name="userName" required="true"/>
    ??????????? <ww:password label="Password" name="userPwd" required="true"/>
    ??????????? <ww:submit value="Submit"/>
    ???? </ww:form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? 建立驗證規(guī)則

    ????? 對 LoginAction 進行驗證規(guī)則的配置,需要新建一個配置文件,文件名以 “Action 的名稱” + “-validation.xml”來命名,并保存到 LoginAction.java 文件所在的目錄中
    ?如:
    ?????? ?LoginAction-validation.xml
    ??
    ?? 代碼如下:
    ?? LoginAction-validation.xml
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "
    <validators>
    ?<field name="userName">
    ??<field-validator type="requiredstring">
    ???<message>You must enter a value for username.</message>
    ??</field-validator>
    ?</field>
    ?<field name="userPwd">
    ??<field-validator type="requiredstring">
    ???<message>You must enter a value for password.</message>
    ??</field-validator>
    ?</field>
    </validators>
    ----------------------------------------------------------------------------------------------------

    ?? RegisterAction-validation.xml
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "
    <validators>
    ?<field name="userName">
    ??<field-validator type="requiredstring">
    ???<message>You must enter a value for username.</message>
    ??</field-validator>
    ?</field>
    ?<field name="userPwd">
    ??<field-validator type="requiredstring">
    ???<message>You must enter a value for password.</message>
    ??</field-validator>
    ?</field>
    </validators>
    ----------------------------------------------------------------------------------------------------

    ?? 測試

    5、國際化支持

    ?? Webwork 的國際化支持主要體現(xiàn)在兩個部分:
    ?1. UI-Tag
    ?2. Validator

    ?? 示例:讀取 messages 資源中的 welcome 鍵值
    ?<ww:i18n name="'messages'">
    ? ????? <ww:text name="'welcome'"/>
    ?</ww:i18n>


    ?? 在 src 目錄下新建 messages_zh_CN.properties 文件,內(nèi)容如下:
    ----------------------------------------------------------------------------------------------------
    welcome=歡迎!{0}
    ----------------------------------------------------------------------------------------------------
    ?? 這里的 “{0}”是為了加入?yún)?shù)而設(shè)定的,也可以再加入一個:welcome=歡迎!{0}{1}

    ?? 修改 ok.jsp ,讓它在登錄后顯示歡迎字樣
    ?? ok.jsp
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <%@ page contentType="text/html;charset=UTF-8" language="java"%>
    <html>
    ?<head>
    ??<title>OK</title>
    ?</head>
    ?<body>
    ??<ww:i18n name="messages">
    ???<ww:text name="welcome">
    ????<ww:param>
    ?????<ww:property value="userName" />
    ????</ww:param>
    ???</ww:text>
    ??</ww:i18n>
    ??<br>
    ??userPwd=<ww:property value="userPwd" />
    ??<br>
    ?</body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? 驗證部份使用的是對應(yīng) LoginAction.java 文件的一個指定的資源文件,和驗證文件一樣,
    需要在 LoginAction.java 文件相同的目錄下新建一個資源文件,文件名稱為 LoginAction_zh_CN.properties

    ?? LoginAction_zh_CN.properties
    ----------------------------------------------------------------------------------------------------
    error.username=用戶名稱必須輸入!
    error.password=密碼必須輸入!
    ----------------------------------------------------------------------------------------------------

    ?? RegisterAction_zh_CN.properties
    ----------------------------------------------------------------------------------------------------
    error.username=用戶名稱必須輸入!
    error.password=密碼必須輸入!
    ----------------------------------------------------------------------------------------------------

    ?? 對驗證部份進行修改
    ?? LoginAction-validation.xml
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "
    <validators>
    ?<field name="userName">
    ??<field-validator type="requiredstring">
    ???<message key="error.username">You must enter a value for username.</message>
    ??</field-validator>
    ?</field>
    ?<field name="userPwd">
    ??<field-validator type="requiredstring">
    ???<message key="error.password">You must enter a value for password.</message>
    ??</field-validator>
    ?</field>
    </validators>
    ----------------------------------------------------------------------------------------------------
    ?? 使用 key 來指定資源文件中的鍵值

    ?? RegisterAction-validation.xml
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "
    <validators>
    ?<field name="userName">
    ??<field-validator type="requiredstring">
    ???<message key="error.username">You must enter a value for username.</message>
    ??</field-validator>
    ?</field>
    ?<field name="userPwd">
    ??<field-validator type="requiredstring">
    ???<message key="error.password">You must enter a value for password.</message>
    ??</field-validator>
    ?</field>
    </validators>
    ----------------------------------------------------------------------------------------------------

    ?? 修改 login.jsp 和 register.jsp 加入 <%@ page contentType="text/html;charset=UTF-8" language="java"%> 以支持顯示中文

    ?? login.jsp
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <%@ page contentType="text/html;charset=UTF-8" language="java"%>
    <html>
    <head><title>Login</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<ww:form name="test" action="login.action" method="POST">
    ??????????? <ww:textfield label="Username" name="userName" required="true"/>
    ??????????? <ww:password label="Password" name="userPwd" required="true"/>
    ??????????? <ww:submit value="Submit"/>
    ???? </ww:form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------

    ?? register.jsp
    ----------------------------------------------------------------------------------------------------
    <%@ taglib prefix="ww" uri="/webwork"%>
    <%@ page contentType="text/html;charset=UTF-8" language="java"%>
    <html>
    <head><title>Register</title></head>
    <body>
    <table border=0 width=97%>
    <tr><td align="left">
    ?<ww:form name="test" action="register.action" method="POST">
    ??????????? <ww:textfield label="Username" name="userName" required="true"/>
    ??????????? <ww:password label="Password" name="userPwd" required="true"/>
    ??????????? <ww:submit value="Submit"/>
    ???? </ww:form>
    </td></tr>
    </table>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------
    ?? 測試

    6、集成 spring
    ??? 因為現(xiàn)在使用的 webwork 版本為 2.2.2,所以在集成 spring 的方式上和 2.1.x 以前的版本有所不同。

    ??? 1) 修改 web.xml,為 Web 應(yīng)用增加相應(yīng)的 Spring ContextLoaderListener

    ??? web.xml
    ----------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="
    ?xmlns:xsi="?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    ??<servlet>
    ??<servlet-name>webwork</servlet-name>
    ??<servlet-class>
    ???com.opensymphony.webwork.dispatcher.ServletDispatcher
    ??</servlet-class>
    ?</servlet>
    ?<servlet-mapping>
    ??<servlet-name>webwork</servlet-name>
    ??<url-pattern>*.action</url-pattern>
    ?</servlet-mapping>
    ?<listener>
    ??<listener-class>
    ???org.springframework.web.context.ContextLoaderListener
    ??</listener-class>
    ?</listener>
    </web-app>
    ----------------------------------------------------------------------------------------------------

    ?? 2) 在 src 目錄下新建 webwork.properties 文件,內(nèi)容如下:

    ?webwork.objectFactory = spring

    ?這個文件非常重要,也是集成所必需的

    ?? 3) 新增 Service 層的對像 IUserService、UserService

    ?? IUserService.java
    ----------------------------------------------------------------------------------------------------
    package com.test.services;

    import com.test.User;

    public interface IUserService {

    ?public boolean isValidUser(User user);
    ?
    ?public boolean registerUser(User user);
    }
    ----------------------------------------------------------------------------------------------------

    ?? UserService.java
    ----------------------------------------------------------------------------------------------------
    package com.test.services;

    import com.test.User;

    public class UserService implements IUserService {

    ?public boolean isValidUser(User user) {
    ??if (user.getUserName().equals("oksonic") && user.getUserPwd().equals("oksonic"))
    ???return true;
    ??else
    ???return false;
    ?}

    ?public boolean registerUser(User user) {
    ??// 這里可以調(diào)用 DAO 層對像錄入用戶信息到數(shù)據(jù)庫
    ??return true;
    ?}

    }
    ----------------------------------------------------------------------------------------------------

    ?? 4) 修改 xwork.xml
    ----------------------------------------------------------------------------------------------------
    <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "
    <xwork>
    ?<include file="webwork-default.xml" />
    ?<package name="default" extends="webwork-default">
    ??<action name="login" class="login">
    ???<!--? 這里的意思是登錄成功后跳轉(zhuǎn)到 /ok.jsp 頁面 -->
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<!--? 登錄失敗后則返回提交頁 -->
    ???<result name="error" type="dispatcher">
    ????<param name="location">/login.jsp</param>
    ???</result>
    ???<!--? 如果驗證失敗,則返回登錄頁 -->
    ???<result name="input" type="dispatcher">
    ????<param name="location">/login.jsp</param>
    ???</result>
    ???<!--? 此段代碼為作用是將request請求的參數(shù)傳遞到 action 中 -->
    ???<interceptor-ref name="model-driven" />
    ???<interceptor-ref name="params" />
    ???<interceptor-ref name="validationWorkflowStack" />
    ??</action>
    ??<action name="register" class="register">
    ???<result name="success" type="dispatcher">
    ????<param name="location">/ok.jsp</param>
    ???</result>
    ???<!--? 如果驗證失敗,則返回登錄頁 -->
    ???<result name="input" type="dispatcher">
    ????<param name="location">/register.jsp</param>
    ???</result>
    ???<interceptor-ref name="model-driven" />
    ???<interceptor-ref name="params" />
    ???<interceptor-ref name="validationWorkflowStack" />
    ??</action>
    ?</package>
    </xwork>

    ----------------------------------------------------------------------------------------------------

    ?? 5) 添加 spring 框架到項目中
    ??
    ?? 修改 applicationContext.xml 文件,加入 UserService 的配置信息
    ----------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "

    <beans>
    ?<bean id="UserService" class="com.test.services.UserService" singleton="false"/>
    ?<bean id="login" class="com.test.LoginAction" singleton="false" >
    ??<property name="userService">
    ???<ref bean="UserService"/>
    ??</property>
    ?</bean>
    ?<bean id="register" class="com.test.RegisterAction" singleton="false" >
    ??<property name="userService">
    ???<ref bean="UserService"/>
    ??</property>
    ?</bean>
    </beans>
    ----------------------------------------------------------------------------------------------------
    ?? 注意:紅色字體內(nèi)容要和 xwork.xml 文件中的內(nèi)容相對應(yīng)

    ?? 6) 修改 Action

    ?? LoginAction.java
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;
    import com.opensymphony.xwork.ActionSupport;
    import com.opensymphony.xwork.ModelDriven;
    import com.test.services.IUserService;

    public class LoginAction extends ActionSupport implements Action,ModelDriven? {

    //? 必需進行初始化
    ?private User user = new User();
    ?private IUserService userService;

    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??// 可以在這里調(diào)用Service層來進行驗證
    ??if (userService.isValidUser(user))
    ???return this.SUCCESS;
    ??else
    ???return this.ERROR;
    ?}

    ?public Object getModel() {
    ??// TODO Auto-generated method stub
    ??return user;
    ?}

    ?public void setUserService(IUserService userService) {
    ??this.userService = userService;
    ?}
    }
    ----------------------------------------------------------------------------------------------------

    ?? RegisterAction.java
    ----------------------------------------------------------------------------------------------------
    package com.test;

    import com.opensymphony.xwork.Action;
    import com.opensymphony.xwork.ActionSupport;
    import com.opensymphony.xwork.ModelDriven;
    import com.test.services.IUserService;

    public class RegisterAction extends ActionSupport implements Action,ModelDriven {

    ??? // 必需進行初始化
    ?private User user = new User();
    ?private IUserService userService;
    ?
    ?public User getUser() {
    ??return user;
    ?}

    ?public String execute() throws Exception {
    ??userService.registerUser(user);
    ??return this.SUCCESS;
    ?}

    ?public Object getModel() {
    ??// TODO Auto-generated method stub
    ??return user;
    ?}

    ?public void setUserService(IUserService userService) {
    ??this.userService = userService;
    ?}
    }
    ----------------------------------------------------------------------------------------------------

    ?? 好了,進行最后的測試!


    為了制作更多更好的錄像教程,希望大家多多提供相關(guān)資料!!!
    聯(lián)系方法:
    ?
    http://www.oksonic.cn
    ? Email: oksonic@tom.com
    ? QQ: 71279650
    ??

    Feedback

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-08-21 13:24 by siyuan
    MyEclipse5.0出來啦

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-08-22 23:13 by goby
    我已經(jīng)好想學(xué)webwork啦!你實在太好啦!謝謝

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-08-25 20:55 by sos
    請問老大,速動畫教程第二十六集 WebWork2 開發(fā)教程怎么播放到中間就播放不下去了

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-08-25 20:57 by sos
    請問老大,速動畫教程第二十六集 WebWork2 開發(fā)教程怎么播放到中間就播放不下去了,能否告知,freeisland@163.com,另外老大,是否可創(chuàng)作出一些,ejb,jms,jaas,jta等方面的教程,永遠支持老大

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-09-01 12:00 by cclll
    真的太感謝您的教程了,太佩服你了,你能不能給做個struts+hibernate+spring的分頁啊
    真的很需要!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-09-13 10:32 by suwu
    一直就很佩服你 很感謝你的大力支持 能不能做個webwork+hibernate+spring的教程 急需要

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-09-13 13:54 by zhang
    我也是播放到中間就卡住了 !

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-09-27 10:04 by 黑三老妖
    http://www.diaolv.com/product_files/2006-7-21/2006721161128.html

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-09-28 13:44 by
    支持。。。

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-10-25 11:51 by KIM
    樓主好高手,佩服!要多向樓主學(xué)習(xí)!

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2006-11-06 15:45 by along
    一直就很佩服你 老大

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-01-04 22:16 by Java[匿名]
    佩服。。。。。。。。。。。。。
    能不能做Portlet和Ajax的教程啊

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-01-09 22:25 by oksonic[匿名]
    我也知道播放到中間就無法繼續(xù)了,但因現(xiàn)在的工作環(huán)境無法提交到服務(wù)器,所以只有請耐心等待一段時間了。

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-02-08 23:39 by fzf
    根據(jù)你提供的學(xué)習(xí)資料,在web.xml中加入配置:
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    啟動tomcat5。5。20會報錯:嚴重: Error listenerStart
    2007-2-8 23:25:26 org.apache.catalina.core.StandardContext start
    嚴重: Context [/webwork_spring] startup failed due to previous errors

    刪除spring監(jiān)聽,則工程能正常啟動,網(wǎng)上找了資料,沒有1個確切的答案。
    我用log4j來寫入日志,只有1句話:INFO - Shutting down Log4J
    沒有其他日志提醒。why?

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-02-08 23:41 by fzf
    另外,我運行你視頻壓縮包里的webwork工程,也無法啟動,如果你有時間,想和你探討下。

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-02-09 14:39 by fzf
    啟動工程的問題已解決呵呵

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程[未登錄]  回復(fù)  更多評論   

    2007-02-12 23:54 by rose
    我真是太佩服你了。

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-05-06 09:35 by furong
    @fzf
    你好,我想問一下你是怎么解決啟動工程這個問題的
    我也遇到了同樣的問題
    謝謝

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-05-26 13:56 by 茉莉飛翔
    怎么不能下載了?

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-07-18 09:46 by xuechao
    好 沒別的可說的 好

    # re: 速動畫教程第二十六集 WebWork2 開發(fā)教程  回復(fù)  更多評論   

    2007-08-03 20:27 by yubin
    sdfsdfs

    posts - 103, comments - 1104, trackbacks - 0, articles - 0

    Copyright © oksonic

    主站蜘蛛池模板: 亚洲高清中文字幕免费| 免费看成人AA片无码视频吃奶| 又黄又爽又成人免费视频| 久久久久亚洲av无码尤物| 国内精品免费视频精选在线观看| 区久久AAA片69亚洲| a毛看片免费观看视频| 久久久久久久综合日本亚洲| 最近2019中文免费字幕在线观看| 久久青青成人亚洲精品| 免费精品无码AV片在线观看| 亚洲精品网站在线观看你懂的| 7723日本高清完整版免费| 亚洲中文字幕精品久久| 国产精品嫩草影院免费| 一级毛片免费在线| 国产成A人亚洲精V品无码性色| 久久久精品2019免费观看| 亚洲AV无码乱码在线观看代蜜桃 | 久久免费精品视频| 亚洲综合日韩中文字幕v在线| 99在线精品视频观看免费| 亚洲日本一线产区和二线产区对比| 国产精品视_精品国产免费| 亚洲黄片手机免费观看| 亚洲色图国产精品| 毛片a级毛片免费播放下载| 日本激情猛烈在线看免费观看| 亚洲欧洲日产国码无码久久99| 4455永久在线观免费看| 久久精品国产亚洲av瑜伽| 亚洲色大成网站WWW久久九九| 黄网站色在线视频免费观看| 精品亚洲成a人在线观看| 国产亚洲一区二区三区在线观看 | 无码人妻丰满熟妇区免费| 亚洲人成网站18禁止久久影院| 免费一级特黄特色大片在线观看| 久久久精品午夜免费不卡| 最新国产精品亚洲| 国产成人精品日本亚洲|