此為更新版,以前發布的版本無法完整播放,現已經將原來的一段分為三段播放,請放心下載觀看。
速動畫教程第二十六集 WebWork2 開發教程
下載地址:
http://this.oksonic.cn
此錄像較大,并且為第一次完整錄間,缺點是制作錄像時沒有修改分辯率以至于現在的分辯率為1280 * 800 還望見諒!
速動畫教程第二十六集 WebWork2 開發教程
目錄:
?? 1、完整的注冊和登錄演示
?? 2、Model-Driven(模型驅動)
?? 3、使用 JUnit 進行單元測試
?? 4、配置表單驗證
?? 5、國際化支持
?? 6、集成 spring
1、完整的注冊和登錄演示
?? 頁面結構圖
???
?? 所需要的 JavaBean
???
?
?? 新建工程,名稱為:webwork
???
?? 拷貝webwork相關的類庫文件到項目的 lib 目錄下,具體的類庫文件請從《速動畫教程第二十三集》的源程序中拷貝
?? 刷新工程
?? 新建三個 JAVA 文件
??
?? User.java 文件內容如下:
----------------------------------------------------------------------------------------------------
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 文件,需要實現 com.opensymphony.xwork.Action 接口,內容如下:
----------------------------------------------------------------------------------------------------
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 {
??// 可以在這里調用Service層來進行驗證,這里只驗證用戶名
??if (user.getUserName().equals("oksonic") && user.getUserPwd().equals("oksonic"))
???return this.SUCCESS;
??else
???return this.ERROR;
?}
?
}
----------------------------------------------------------------------------------------------------
?? RegisterAction.java 文件,需要實現 com.opensymphony.xwork.Action 接口,內容如下:
----------------------------------------------------------------------------------------------------
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">
???<!--? 這里的意思是登錄成功后跳轉到 /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請求的參數傳遞到 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
執行 action 的路徑為 /login.action
?? 新建 jsp 文件
?? index.jsp 文件內容如下:
----------------------------------------------------------------------------------------------------
<html>
<head><title>INDEX</title></head>
<body>
?<a href="login.jsp">Login</a><br>
?<a href="register.jsp">Register</a>
</body>
</html>
----------------------------------------------------------------------------------------------------
?? login.jsp 文件內容如下:
----------------------------------------------------------------------------------------------------
<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 文件內容如下:
----------------------------------------------------------------------------------------------------
<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 文件內容如下:
----------------------------------------------------------------------------------------------------
<%@ 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 文件,文件內容如下:
----------------------------------------------------------------------------------------------------
<?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(模型驅動)
Model-Driven(模型驅動)的 Action 要求我們的 Action 實現 com.opensymphony.xwork.ModelDriven 接口,
它有一個方法:Object getModel(); 我們用這個方法返回我們的模型對象就可以了,也就是 User
修改 Action 加入 com.opensymphony.xwork.ModelDriven 接口,并創建 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 {
??// 可以在這里調用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">
???<!--? 這里的意思是登錄成功后跳轉到 /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>
???<!--? 此段代碼為作用是加入模型驅動 -->
???<interceptor-ref name="model-driven"/>
???<!--? 此段代碼為作用是將request請求的參數傳遞到 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 文件內容如下:
----------------------------------------------------------------------------------------------------
<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 文件內容如下:
----------------------------------------------------------------------------------------------------
<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 文件內容如下:
----------------------------------------------------------------------------------------------------
<%@ 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 包中,內容如下:
----------------------------------------------------------------------------------------------------
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");
?}
}
----------------------------------------------------------------------------------------------------
?? 關于測試代碼的詳細解釋請查看《WebWork教程》中的內容
?? 新建一個 JUnit Test Case (RegisterActionTest),放到 test.com.test 包中,內容如下:
----------------------------------------------------------------------------------------------------
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 了,內容如下:
----------------------------------------------------------------------------------------------------
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;
?}
}
----------------------------------------------------------------------------------------------------
?? 直接進行測試(不需要啟動服務),出現綠色條表示正常
4、配置表單驗證
??
?? 注冊的驗證類型:在 src 目錄下新建 validators.xml 文件,文件內容如下:
----------------------------------------------------------------------------------------------------
<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">
???<!--? 這里的意思是登錄成功后跳轉到 /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請求的參數傳遞到 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 類實現了數據校驗錯誤信息、Action 運行錯誤信息的保存傳遞功
能。通過擴展 ActionSupport,LoginAction 即可攜帶執行過程中的狀態信息,這
為之后的錯誤處理,以及面向用戶的信息反饋提供了基礎數據。
?? 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 {
??// 可以在這里調用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 的標簽來實現頁面,代碼如下:
?? 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>
----------------------------------------------------------------------------------------------------
?? 建立驗證規則
????? 對 LoginAction 進行驗證規則的配置,需要新建一個配置文件,文件名以 “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 的國際化支持主要體現在兩個部分:
?1. UI-Tag
?2. Validator
?? 示例:讀取 messages 資源中的 welcome 鍵值
?<ww:i18n name="'messages'">
? ????? <ww:text name="'welcome'"/>
?</ww:i18n>
?? 在 src 目錄下新建 messages_zh_CN.properties 文件,內容如下:
----------------------------------------------------------------------------------------------------
welcome=歡迎!{0}
----------------------------------------------------------------------------------------------------
?? 這里的 “{0}”是為了加入參數而設定的,也可以再加入一個: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>
----------------------------------------------------------------------------------------------------
?? 驗證部份使用的是對應 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
??? 因為現在使用的 webwork 版本為 2.2.2,所以在集成 spring 的方式上和 2.1.x 以前的版本有所不同。
??? 1) 修改 web.xml,為 Web 應用增加相應的 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 文件,內容如下:
?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) {
??// 這里可以調用 DAO 層對像錄入用戶信息到數據庫
??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">
???<!--? 這里的意思是登錄成功后跳轉到 /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請求的參數傳遞到 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 框架到項目中 <beans> ?? 6) 修改 Action ?? LoginAction.java import com.opensymphony.xwork.Action; public class LoginAction extends ActionSupport implements Action,ModelDriven? { //? 必需進行初始化 ?public User getUser() { ?public String execute() throws Exception { ?public Object getModel() { ?public void setUserService(IUserService userService) { ?? RegisterAction.java import com.opensymphony.xwork.Action; public class RegisterAction extends ActionSupport implements Action,ModelDriven { ??? // 必需進行初始化 ?public String execute() throws Exception { ?public Object getModel() { ?public void setUserService(IUserService userService) { ?? 好了,進行最后的測試!
??
?? 修改 applicationContext.xml 文件,加入 UserService 的配置信息
----------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
?<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>
----------------------------------------------------------------------------------------------------
?? 注意:紅色字體內容要和 xwork.xml 文件中的內容相對應
----------------------------------------------------------------------------------------------------
package com.test;
import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.ModelDriven;
import com.test.services.IUserService;
?private User user = new User();
?private IUserService userService;
??return user;
?}
??// 可以在這里調用Service層來進行驗證
??if (userService.isValidUser(user))
???return this.SUCCESS;
??else
???return this.ERROR;
?}
??// TODO Auto-generated method stub
??return user;
?}
??this.userService = userService;
?}
}
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
package com.test;
import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.ModelDriven;
import com.test.services.IUserService;
?private User user = new User();
?private IUserService userService;
?
?public User getUser() {
??return user;
?}
??userService.registerUser(user);
??return this.SUCCESS;
?}
??// TODO Auto-generated method stub
??return user;
?}
??this.userService = userService;
?}
}
----------------------------------------------------------------------------------------------------
為了制作更多更好的錄像教程,希望大家多多提供相關資料!!!
聯系方法:
? http://www.oksonic.cn
? Email: oksonic@tom.com
? QQ: 71279650
??