出於結構清晰的考慮,應該采用單獨的Model實例來封裝請求參數和處理結果,這就是所謂的模型驅動,
所謂模型驅動,就是使用單獨的JavaBean來貫穿整個MVC流程。
所謂屬性驅動,就是使用屬性來作為貫穿MVC流程的信息攜帶者,當然屬性必須依附於對象,
這個對象就是Action實例。 簡單說,模型驅動就是使用單獨的javaBean封裝請求參數。 屬性驅動就是把屬性寫在Action類中。
我們發現上一章的jsp中的name必須前面得加 user.username。。太過麻煩。我們使用模型驅動來解決這個問題。實際開發中使用這種方式
一、模型驅動的要求
1.動作類實現ModelDriven接口
2.實現接口中的getModel方法,返回我們的數據對象。(實現中用泛型將確定傳入模型 implements ModelDriven<?>)
3.數據模型對象必須由我們實例化。
例子:
public class AdduserAction extends ActionSupport implements ModelDriven<User>{
//數據模型對象由我們實例化
private User user=new User();
public User getUser() {
System.out.println("getuser");
return user;
}
public void setUser(User user) {
System.out.println("setuser");
this.user = user;
}
public String adduser(){
System.out.println(user.getUsername()+":"+user.getAge());
return null;
}
//實現接口方法,返回我們的數據模型對象
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
我們在jsp上就能像以前那樣 ,name只用我們的參數相同即可
<body>
<form action="${pageContext.request.contextPath }/action1" method="post">
用戶名:<input type="text" name="username"><br>
年 齡:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
</body>
原理:
其實這時候表單的name已經不僅僅是一個簡單的字符串了。
這一系列的操作是由ModelDriven和params攔截器幫我們做的 。
params攔截器負責提取請求參數,如果是屬性驅動模式,則還負責將請求參數傳給Action類的屬性
模型驅動的話就只提取請求參數。
ModelDriven攔截器會先判斷我們的動作類是否屬於ModelDriven類型
屬於的話,就調用我們實現的getModel方法,獲取我們傳入的對象
然后將我們的對象給壓入棧中
附:struts2注冊案例
(1)我們先創建數據庫表
create database demo;
use demo;
create table user(
username varchar(100) primary key,
password varchar(100),
birthday date,
hobby varchar(255),
married boolean
);
(2)在domain包創建我們的user實體類
public class User {
private String username;//用戶名
private String password;//密碼
private Date birthday; //生日
private String hobby; //愛好
private boolean married; //是否結婚
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
}
(3)完成數據層,我們在Dao層處理數據
public class UserDao {
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
//根據名字查找用戶
public User findUserByUsername(String username){
try {
String sql="select * from user where username=?";
return qr.query(sql, new BeanHandler<User>(User.class),username);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//添加用戶
public int addUser(User user){
String sql="insert into user values(?,?,?,?,?)";
Object []params={user.getUsername(),user.getPassword(),user.getBirthday(),user.getHobby(),user.isMarried()};
try {
return qr.update(sql,params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
(4)完成業務邏輯層的編寫,service層
public class UserService {
private UserDao userdao=new UserDao();
//注冊
public int regist(User user){
return userdao.addUser(user);
}
//通過用戶名查找用戶
public User findByUsername(String username){
return userdao.findUserByUsername(username);
}
}
(5)創建web層,我們創建web層動作類
public class UserAction extends ActionSupport implements ModelDriven{
private User user=new User();
private UserService userservice=new UserService();
//注冊方法
public String regist(){
User _user=userservice.findByUsername(user.getUsername());
//判斷用戶是否存在,存在返回exists字符串
if(_user!=null){
return "exists";
}
//獲取注冊成功更新的行數
int count=userservice.regist(user);
//如果>0,返回success
if(count>0){
return SUCCESS;
}
return null;
}
public Object getModel() {
// TODO Auto-generated method stub
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
(6)我們編寫注冊的jsp頁面
<body>
<form action="${pageContext.request.contextPath }/regist.action" method="post">
用戶名:<input type="text" name="username"><br>
密 碼:<input type="password" name="password"><br>
生 日:<input type="text" name="birthday"><br>
愛好:<input type="checkbox" name="hobby" value="籃球">籃球
<input type="checkbox" name="hobby" value="足球">足球
<input type="checkbox" name="hobby" value="寫代碼">寫代碼<br>
已婚:<input type="checkbox" name="married" value="true"><br>
<input type="submit" name="注冊"><br>
</form>
</body>
(7)配置 struts.xml
<package name="p1" extends="struts-default">
<action name="regist" class="com.cad.web.action.UserAction" method="regist">
<result name="success">/success.jsp</result>
<result name="exists">/msg.jsp</result>
</action>
</package>
