1.Struts2的屬性驅動.
Struts2的屬性驅動指的是在action中JSP頁面的每一個form中的name都對應在action中有一個屬性與之對應。看下面代碼片段:
<form action="register.do" name="RegisterForm" method="post">
Username:<input type="text" name="uname"><br>
Password:<input type="password" name="upass"><br>
Confirm: <input type="password" name="rpass"><br>
<input type="submit" value="Submit">
</form>
這是一個最基本的用戶注冊的表單,它有三個數據要提交: uname、upass、rpass,那么對應的Action也要有三個屬性(其實是三個屬性的setter),看register.do實際的Action定義類:
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2屬性驅動演示用的Action
* @author 阿布
*
*/
public class RegisterAction extends ActionSupport {
private String uname;
private String upass;
private String rpass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getRpass() {
return rpass;
}
public void setRpass(String rpass) {
this.rpass = rpass;
}
@Override
public String execute() throws Exception {
return ActionSupport.SUCCESS;
}
}
你會看到RegisterAction中的三個屬性和RegisterForm表單中的name屬性名字一模一樣,沒錯,這就是Struts2的屬性驅動,當表單提交到RegisterAction后,Struts2將會自動將根據表單的name屬性調用Action中相應的屬性setter,去自動賦值。
2.Struts2的模型驅動
Struts2的模型驅動其實和Struts1.x中的ActionForm有點類似,在Struts1.x中每一個Action都必須有一個ActionForm與之對應,而Struts2.0中,每一個Action同樣需要提供一個POJO對象,用來封裝表單屬性,看代碼:
<form action="register.do" name="RegisterForm" method="post">
Username:<input type="text" name="uname"><br>
Password:<input type="password" name="upass"><br>
Confirm: <input type="password" name="rpass"><br>
<input type="submit" value="Submit">
</form>
這段表單的代碼和上面的一模一樣,就不贅述了。接下來看POJO的代碼,其實就是普通的Java Bean:
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2屬性驅動演示用的Java Bean
* @author 阿布
*
*/
public class User {
private String uname;
private String upass;
private String rpass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getRpass() {
return rpass;
}
public void setRpass(String rpass) {
this.rpass = rpass;
}
}
對不起,也是和屬性驅動中的例子一樣,很簡單,因為演示的都是同一個例子,只是方法不同而已,但是接下來就不一樣了,看RegisterAction代碼:
package org.abu.csdn.action.user;
import org.abu.csdn.dto.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* Struts2模型驅動演示用的Action
*
* @author 阿布
*
*/
public class RegisterAction extends ActionSupport implements ModelDriven<User> {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
return ActionSupport.SUCCESS;
}
// 模型驅動必須實現的方法,也是ModelDriven接口中唯一的方法
public User getModel() {
return user;
}
}
看到沒有,和屬性驅動的Action有很大的區別,下面一一列舉:
(1)模型驅動的Action必須實現ModelDriven接口,而且要提供相應的泛型,這里當然就是具體使用的Java Bean了。
(2)實現ModelDriven的getModel方法,其實就是簡單的返回泛型的一個對象。
(3)在Action提供一個泛型的私有對象,這里就是定義一個User的user對象,并提供相應的getter與setter。
好了,上面的三件事做完之后,Action就會去自動調用User的setter將表單中的name屬性的值賦給User中的屬性。而Action的后續處理的Jsp頁面后者是Servlet就可以使用user對象了。
3.到底是用屬性驅動和是模型驅動呢?
這個問題困擾了很多Struts2的初學者,我這里提供一些建議:
(1)請你統一整個系統中的Action使用的驅動模型,即要么都是用屬性驅動,要么都是用模型驅動。
(2)如果你的DB中的持久層的對象與表單中的屬性都是一一對應的話,那么就使用模型驅動吧,畢竟看起來代碼要整潔得多。
(3)如果表單的屬性不是一一對應的話,那么就應該使用屬性驅動,否則,你的系統就必須提供兩個Bean,一個對應表單提交的數據,另一個用與持久層。
看上面的例子,其實密碼確認rpass是不需要放到DB中去的,而僅僅是用于校驗密碼的,不是嗎?那么如果使用模型驅動的話,就存在這個問題了,而使用屬性驅動的話又有些繁瑣,現在我們就來調整一個看我的解決方法:
4.完整的例子
(1)表單提交的JSP頁面index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CSDN首頁</title>
</head>
<body>
<s:a href="userManager/userRegister.jsp">用戶注冊</s:a>
<form action="register.do" name="SampleForm" method="post">
Username:<input type="text" name="uname"><br>
Password:<input type="password" name="upass"><br>
Confirm: <input type="password" name="rpass"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
(2)User的定義
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2屬性驅動演示用的Java Bean
* @author 阿布
*
*/
public class User {
private String uname;
private String upass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
}
(3)RegisterAction的定義
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2屬性驅動演示用的Action
* @author 阿布
*
*/
public class RegisterAction extends ActionSupport {
// 用來給spring注入,及屬性拷貝
private User user;
private String uname;
private String upass;
private String rpass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getRpass() {
return rpass;
}
public void setRpass(String rpass) {
this.rpass = rpass;
}
@Override
public String execute() throws Exception {
// 調用方法將屬性copy到user中去,便于后續的service方法
copyAttribute();
// TODO:編寫自己的user業務代碼
return ActionSupport.SUCCESS;
}
/**
* 注意這是一個action全局的校驗
*/
@Override
public void validate() {
// 進行密碼的校驗
if (!(upass.trim()).equals((rpass.trim()))) {
// 注意這里addFieldError的fieldName參數必須用引號引起來,
// 不能這樣使用addFieldError(rpass,"XXXXXX"),而必須是addFieldError("rpass","XXXXX")
this.addFieldError("rpass", this
.getText("csdn.action.user.register.validate.verify"));
}
}
/**
* 將表單屬性中需要持久化的屬性拷貝到user中去
* @author 阿布
*
*/
private void copyAttributes () {
user.setUname(uname);
user.setUpass(upass);
}
}
(4)Struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="root" extends="struts-default" namespace="/userManager">
<action name="userRegister" class="org.abu.csdn.action.user.RegisterAction">
<result name="success">/index.jsp</result>
<result name="input">/userManager/userRegister.jsp</result>
</action>
</package>
</struts>
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/csuliky/archive/2009/05/30/4226917.aspx