(九)Struts2模型驱动和属性驱动
出于结构清晰的考虑,应该采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动,
所谓模型驱动,就是使用单独的JavaBean来贯穿整个MVC流程。
所谓属性驱动,就是使用属性来作为贯穿MVC流程的信息携带者,当然属性必须依附于对象,
这个对象就是Action实例。 简单说,模型驱动就是使用单独的javaBean封装请求参数。 属性驱动就是把属性写在Action类中。
我们发现上一章的jsp中的name必须前面得加 user.username。。太过麻烦。我们使用模型驱动来解决这个问题。实际开发中使用这种方式
一、模型驱动的要求
1.动作类实现ModelDriven接口
2.实现接口中的getModel方法,返回我们的数据对象。(实现中用泛型将确定传入模型 implements ModelDriven<?>)
3.数据模型对象必须由我们实例化。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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只用我们的参数相同即可
1 2 3 4 5 6 7 | <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> |
原理:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 其实这时候表单的name已经不仅仅是一个简单的字符串了。 这一系列的操作是由ModelDriven和params拦截器帮我们做的 。 params拦截器负责提取请求参数,如果是属性驱动模式,则还负责将请求参数传给Action类的属性 模型驱动的话就只提取请求参数。 ModelDriven拦截器会先判断我们的动作类是否属于ModelDriven类型 属于的话,就调用我们实现的getModel方法,获取我们传入的对象 然后将我们的对象给压入栈中 |
附:struts2注册案例
(1)我们先创建数据库表
1 2 3 4 5 6 7 8 9 10 | 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实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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层处理数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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层
1 2 3 4 5 6 7 8 9 10 11 | 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层动作类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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页面
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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
1 2 3 4 5 6 7 | < 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 > |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步