为什么一个Action类只要继承ModelDriven<User>接口,重写一下getModel方法,就可以访问到前台的数据(当然前台属性名要和user里面的属性名要一致)?
前台
- <form action="login.kk" method="post">
- <input type="text" name="username" placeholder="请输入用户名"/><br>
- <input type="password" name="password" /><br>
- <input type="submit" value="登录" />
- </form>
后台
- package cn.com.service;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.ServletActionContext;
- import org.hibernate.SessionFactory;
- import org.springframework.*;
- import com.opensymphony.xwork2.ModelDriven;
- import cn.com.bean.User;
- @Repository(value="regedit")
- public class Regedit implements ModelDriven<User>{
- @Autowired
- private SessionFactory sf;
- @Autowired
- private User user;
- @Transactional
- public String regedit_user(){
- System.out.println("用户名:"+user.getUsername());
- System.out.println("密码:"+user.getPassword());
- return null;
- }
- public User getModel() {
- return user;
- }
- }
在回答这个问题的时候,我们先想一个问题?
1、前台:有一个属性名username
2、后台:username属性,并且提供set和get方法
3、是什么起作用把前后台的属性值进行复制呢?
是params拦截器
Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中
属性username就是 Action对象名.username或者直接是
username,因为它在栈顶
params拦截器会把前台的属性名在action中的相关参数进行查找 ,有同名的,就把前台属性名的属性值赋值给Action中的属性
1、前台:有两个属性名username password
2、后台:一个User对象的属性名
3、ModelDriven<User>为什么可以把属性赋值给对象里面的属性呢,user和username名称又不一样
先看一下拦截器的操作流程
params拦截器(同名参数赋值)-------prepare拦截器(根据参数如User,去调用类,设置model对象)---------- modelDriven拦截器(将model对象压入valuestack)-params拦截器(同名参数赋值)- action的业务逻辑执行
分析如下
Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中,所以当前对象Action在栈顶
第一步经过params拦截器 由于username和user不同名,无法赋值
第二步经过prepare拦截器,生成Model<User>对象
第三步经过 modelDriven拦截器,如果这个类继承了 modelDriven接口就把第二步创建的model对象压入到栈顶
现在User对象在栈顶
user.username等同于username
第四步经过params拦截器,给栈顶的对象赋值
转自 https://blog.csdn.net/qq_37591637/article/details/88682592
联系客服