(九)模型驱动和属性驱动
出于結(jié)構(gòu)清晰的考慮,應(yīng)該采用單獨(dú)的Model實(shí)例來(lái)封裝請(qǐng)求參數(shù)和處理結(jié)果,這就是所謂的模型驅(qū)動(dòng),
所謂模型驅(qū)動(dòng),就是使用單獨(dú)的JavaBean來(lái)貫穿整個(gè)MVC流程。
所謂屬性驅(qū)動(dòng),就是使用屬性來(lái)作為貫穿MVC流程的信息攜帶者,當(dāng)然屬性必須依附于對(duì)象,
這個(gè)對(duì)象就是Action實(shí)例。 簡(jiǎn)單說(shuō),模型驅(qū)動(dòng)就是使用單獨(dú)的javaBean封裝請(qǐng)求參數(shù)。 屬性驅(qū)動(dòng)就是把屬性寫(xiě)在Action類(lèi)中。
?
我們發(fā)現(xiàn)上一章的jsp中的name必須前面得加 user.username。。太過(guò)麻煩。我們使用模型驅(qū)動(dòng)來(lái)解決這個(gè)問(wèn)題。實(shí)際開(kāi)發(fā)中使用這種方式
一、模型驅(qū)動(dòng)的要求
1.動(dòng)作類(lèi)實(shí)現(xiàn)ModelDriven接口
2.實(shí)現(xiàn)接口中的getModel方法,返回我們的數(shù)據(jù)對(duì)象。(實(shí)現(xiàn)中用泛型將確定傳入模型 implements ModelDriven<?>)
3.數(shù)據(jù)模型對(duì)象必須由我們實(shí)例化。
例子:
public class AdduserAction extends ActionSupport implements ModelDriven<User>{//數(shù)據(jù)模型對(duì)象由我們實(shí)例化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;}//實(shí)現(xiàn)接口方法,返回我們的數(shù)據(jù)模型對(duì)象public User getModel() {// TODO Auto-generated method stubreturn user;}}
?
我們?cè)趈sp上就能像以前那樣 ,name只用我們的參數(shù)相同即可
<body><form action="${pageContext.request.contextPath }/action1" method="post">用戶(hù)名:<input type="text" name="username"><br>年 齡:<input type="text" name="age"><br><input type="submit" value="提交"></form></body>原理:
其實(shí)這時(shí)候表單的name已經(jīng)不僅僅是一個(gè)簡(jiǎn)單的字符串了。 這一系列的操作是由ModelDriven和params攔截器幫我們做的 。 params攔截器負(fù)責(zé)提取請(qǐng)求參數(shù),如果是屬性驅(qū)動(dòng)模式,則還負(fù)責(zé)將請(qǐng)求參數(shù)傳給Action類(lèi)的屬性 模型驅(qū)動(dòng)的話(huà)就只提取請(qǐng)求參數(shù)。 ModelDriven攔截器會(huì)先判斷我們的動(dòng)作類(lèi)是否屬于ModelDriven類(lèi)型 屬于的話(huà),就調(diào)用我們實(shí)現(xiàn)的getModel方法,獲取我們傳入的對(duì)象 然后將我們的對(duì)象給壓入棧中?
?
?
?
附:struts2注冊(cè)案例
(1)我們先創(chuàng)建數(shù)據(jù)庫(kù)表
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包創(chuàng)建我們的user實(shí)體類(lèi)
public class User {private String username;//用戶(hù)名private String password;//密碼private Date birthday; //生日private String hobby; //愛(ài)好private boolean married; //是否結(jié)婚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)完成數(shù)據(jù)層,我們?cè)贒ao層處理數(shù)據(jù)
public class UserDao {QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource()); //根據(jù)名字查找用戶(hù)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);}}//添加用戶(hù)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)完成業(yè)務(wù)邏輯層的編寫(xiě),service層
public class UserService {private UserDao userdao=new UserDao(); //注冊(cè)public int regist(User user){return userdao.addUser(user);}//通過(guò)用戶(hù)名查找用戶(hù)public User findByUsername(String username){return userdao.findUserByUsername(username);}}(5)創(chuàng)建web層,我們創(chuàng)建web層動(dòng)作類(lèi)
public class UserAction extends ActionSupport implements ModelDriven{private User user=new User();private UserService userservice=new UserService(); //注冊(cè)方法public String regist(){ User _user=userservice.findByUsername(user.getUsername()); //判斷用戶(hù)是否存在,存在返回exists字符串if(_user!=null){return "exists";} //獲取注冊(cè)成功更新的行數(shù) int count=userservice.regist(user); //如果>0,返回success if(count>0){return SUCCESS;}return null;}public Object getModel() {// TODO Auto-generated method stubreturn user;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}(6)我們編寫(xiě)注冊(cè)的jsp頁(yè)面
<body><form action="${pageContext.request.contextPath }/regist.action" method="post">用戶(hù)名:<input type="text" name="username"><br>密 碼:<input type="password" name="password"><br>生 日:<input type="text" name="birthday"><br>愛(ài)好:<input type="checkbox" name="hobby" value="籃球">籃球<input type="checkbox" name="hobby" value="足球">足球<input type="checkbox" name="hobby" value="寫(xiě)代碼">寫(xiě)代碼<br>已婚:<input type="checkbox" name="married" value="true"><br><input type="submit" name="注冊(cè)"><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>
?
轉(zhuǎn)載于:https://www.cnblogs.com/yuexiaoyun/p/9448178.html
總結(jié)
以上是生活随笔為你收集整理的(九)模型驱动和属性驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spark-1.4.0集群搭建
- 下一篇: 垂衣 Champzee