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

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

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

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

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

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

          1、完整的注冊(cè)和登錄演示

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

          ?? 新建三個(gè) 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 文件,需要實(shí)現(xiàn) com.opensymphony.xwork.Action 接口,內(nèi)容如下:
          ----------------------------------------------------------------------------------------------------
          package com.test;

          import com.opensymphony.xwork.Action;

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

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

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

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

          import com.opensymphony.xwork.Action;

          public class RegisterAction implements Action {
          ?????? // 必需進(jìn)行初始化
          ?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 頁(yè)面 -->
          ???<result name="success" type="dispatcher">
          ????<param name="location">/ok.jsp</param>
          ???</result>
          ???<!--? 登錄失敗后則返回登錄頁(yè) -->
          ???<result name="error" type="dispatcher">
          ????<param name="location">/login.jsp</param>
          ???</result>
          ???<!--? 此段代碼為作用是將request請(qǐng)求的參數(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 的標(biāo)簽來(lái)獲取值,注意紅色字體,需要有斜桿

          ?? 配置 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>
          ----------------------------------------------------------------------------------------------------

          ?? 好了,進(jìn)行第一段的測(cè)試

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

          Model-Driven(模型驅(qū)動(dòng))的 Action 要求我們的 Action 實(shí)現(xiàn) com.opensymphony.xwork.ModelDriven 接口,
          它有一個(gè)方法:Object getModel(); 我們用這個(gè)方法返回我們的模型對(duì)象就可以了,也就是 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 {
          //? 必需進(jìn)行初始化
          ?private User user = new User();

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

          ?public String execute() throws Exception {
          ??// 可以在這里調(diào)用Service層來(lái)進(jìn)行驗(yàn)證
          ??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? {
          ?// 必需進(jìn)行初始化
          ?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 頁(yè)面 -->
          ???<result name="success" type="dispatcher">
          ????<param name="location">/ok.jsp</param>
          ???</result>
          ???<!--? 登錄失敗后則返回提交頁(yè) -->
          ???<result name="error" type="dispatcher">
          ????<param name="location">/login.jsp</param>
          ???</result>
          ???<!--? 此段代碼為作用是加入模型驅(qū)動(dòng) -->
          ???<interceptor-ref name="model-driven"/>
          ???<!--? 此段代碼為作用是將request請(qǐng)求的參數(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" /> 的順序一定要分先后

          ?? 這時(shí)可以去掉 jsp 文件中 name 值中的對(duì)像名了,如: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 進(jìn)行單元測(cè)試

          ?? 新建一個(gè) 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)于測(cè)試代碼的詳細(xì)解釋請(qǐng)查看《WebWork教程》中的內(nèi)容

          ?? 新建一個(gè) 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");
          ?}

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

          ?? 新建一個(gè) JUnit Test Suite ,這樣就可以一次運(yùn)行兩個(gè) 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;
          ?}

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

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

          4、配置表單驗(yàn)證
          ??
          ?? 注冊(cè)的驗(yàn)證類型:在 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>
          ----------------------------------------------------------------------------------------------------


          ?? 要啟動(dòng)表單驗(yàn)證,需要增加一個(gè)攔截器,對(duì) xwork.xml 文件進(jìn)行修改,增加 <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 頁(yè)面 -->
          ???<result name="success" type="dispatcher">
          ????<param name="location">/ok.jsp</param>
          ???</result>
          ???<!--? 登錄失敗后則返回提交頁(yè) -->
          ???<result name="error" type="dispatcher">
          ????<param name="location">/login.jsp</param>
          ???</result>
          ???<!--? 如果驗(yàn)證失敗,則返回登錄頁(yè) -->
          ???<result name="input" type="dispatcher">
          ????<param name="location">/login.jsp</param>
          ???</result>
          ???<!--? 此段代碼為作用是將request請(qǐng)求的參數(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>
          ???<!--? 如果驗(yàn)證失敗,則返回登錄頁(yè) -->
          ???<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 類實(shí)現(xiàn)了數(shù)據(jù)校驗(yàn)錯(cuò)誤信息、Action 運(yùn)行錯(cuò)誤信息的保存?zhèn)鬟f功
          能。通過(guò)擴(kuò)展 ActionSupport,LoginAction 即可攜帶執(zhí)行過(guò)程中的狀態(tài)信息,這
          為之后的錯(cuò)誤處理,以及面向用戶的信息反饋提供了基礎(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 {
          //? 必需進(jìn)行初始化
          ?private User user = new User();

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

          ?public String execute() throws Exception {
          ??// 可以在這里調(diào)用Service層來(lái)進(jìn)行驗(yàn)證
          ??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 {
          //? 必需進(jìn)行初始化
          ?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;
          ?}
          ?
          }
          ----------------------------------------------------------------------------------------------------

          ?? 修改頁(yè)面,為了能夠顯示錯(cuò)誤消息,需要使用 webwork 的標(biāo)簽來(lái)實(shí)現(xiàn)頁(yè)面,代碼如下:
          ?? 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>
          ----------------------------------------------------------------------------------------------------

          ?? 建立驗(yàn)證規(guī)則

          ????? 對(duì) LoginAction 進(jìn)行驗(yàn)證規(guī)則的配置,需要新建一個(gè)配置文件,文件名以 “Action 的名稱” + “-validation.xml”來(lái)命名,并保存到 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>
          ----------------------------------------------------------------------------------------------------

          ?? 測(cè)試

          5、國(guó)際化支持

          ?? Webwork 的國(guó)際化支持主要體現(xiàn)在兩個(gè)部分:
          ?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è)定的,也可以再加入一個(gè):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àn)證部份使用的是對(duì)應(yīng) LoginAction.java 文件的一個(gè)指定的資源文件,和驗(yàn)證文件一樣,
          需要在 LoginAction.java 文件相同的目錄下新建一個(gè)資源文件,文件名稱為 LoginAction_zh_CN.properties

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

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

          ?? 對(duì)驗(yàn)證部份進(jìn)行修改
          ?? 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 來(lái)指定資源文件中的鍵值

          ?? 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>
          ----------------------------------------------------------------------------------------------------
          ?? 測(cè)試

          6、集成 spring
          ??? 因?yàn)楝F(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

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

          ?? 3) 新增 Service 層的對(duì)像 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 層對(duì)像錄入用戶信息到數(shù)據(jù)庫(kù)
          ??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 頁(yè)面 -->
          ???<result name="success" type="dispatcher">
          ????<param name="location">/ok.jsp</param>
          ???</result>
          ???<!--? 登錄失敗后則返回提交頁(yè) -->
          ???<result name="error" type="dispatcher">
          ????<param name="location">/login.jsp</param>
          ???</result>
          ???<!--? 如果驗(yàn)證失敗,則返回登錄頁(yè) -->
          ???<result name="input" type="dispatcher">
          ????<param name="location">/login.jsp</param>
          ???</result>
          ???<!--? 此段代碼為作用是將request請(qǐng)求的參數(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>
          ???<!--? 如果驗(yàn)證失敗,則返回登錄頁(yè) -->
          ???<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 框架到項(xiàng)目中
          ??
          ?? 修改 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)容相對(duì)應(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? {

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

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

          ?public String execute() throws Exception {
          ??// 可以在這里調(diào)用Service層來(lái)進(jìn)行驗(yàn)證
          ??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 {

          ??? // 必需進(jìn)行初始化
          ?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;
          ?}
          }
          ----------------------------------------------------------------------------------------------------

          ?? 好了,進(jìn)行最后的測(cè)試!


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

          Feedback

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

          2006-08-21 13:24 by siyuan
          MyEclipse5.0出來(lái)啦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          2007-02-08 23:41 by fzf
          另外,我運(yùn)行你視頻壓縮包里的webwork工程,也無(wú)法啟動(dòng),如果你有時(shí)間,想和你探討下。

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

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

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

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

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

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

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

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

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

          2007-07-18 09:46 by xuechao
          好 沒別的可說(shuō)的 好

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

          2007-08-03 20:27 by yubin
          sdfsdfs

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

          Copyright © oksonic

          主站蜘蛛池模板: 揭西县| 繁昌县| 探索| 桐乡市| 沿河| 汽车| 中阳县| 益阳市| 西乡县| 砚山县| 咸阳市| 尖扎县| 桐柏县| 万全县| 定边县| 济南市| 乌兰浩特市| 亳州市| 遵化市| 沾益县| 福安市| 兴海县| 梨树县| 合山市| 阿合奇县| 林周县| 侯马市| 太康县| 漾濞| 沙河市| 邢台市| 永嘉县| 庐江县| 涟源市| 钟山县| 那坡县| 深圳市| 龙南县| 城市| 蕉岭县| 左云县|