• [JavaWeb基础] 019.Struts2 MVC架构之ModelDriven


    用过struts1的人接触struts2的时候,通常会产生一个疑惑,明明struts1已经把action的form分开了,为什么struts2确把模型放在action中定义。其实这个方式只是想让action更加直观,但是如果表单数据过多的话,action类就会出现过于冗长,所以struts2的ModelDriven就要出来解决问题了。下面讲讲ModelDriven的机制

    1.工作原理

    ModelDriven的机制背后就是ValueStack.界面可以通过直接指定对象的属性名就能给对象进行赋值

    ModelDriven其实实现的是一个缺省的拦截器ModelDrivenInterceptor,当一个请求通过该拦截器的时候,会判断该请求是否实现了ModelDriven接口如果实现了,那么就调用getModel方法,然后把返回值压入ValueStack

    public class ModelDrivenInterceptor extends AbstractInterceptor {
    
        protected boolean refreshModelBeforeResult = false;
    
        public void setRefreshModelBeforeResult(boolean val) {
            this.refreshModelBeforeResult = val;
        }
    
        @Override
    
        public String intercept(ActionInvocation invocation) throws Exception {
            Object action = invocation.getAction();
    
            if (action instanceof ModelDriven) {
    
                ModelDriven modelDriven = (ModelDriven) action;
    
                ValueStack stack = invocation.getStack();
    
                Object model = modelDriven.getModel();
    
                if (model !=  null) {
                  stack.push(model);
                }
    
                if (refreshModelBeforeResult) {
                    invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
                }
            }
            return invocation.invoke();
        }
    

     2.前面说的,我们应该在Action中实现ModelDriven并且实现其中的方法getModel,下面代码只是截取片段

    public class ManageStudentAction extends ActionSupport implements Action,ModelDriven<Student> {
    
    	private static final long serialVersionUID = 1L;
    	private Student student;
    	
    	@Override
    	public Student getModel() {
    		if(student == null){
    			student = new Student();
    		}
    		return student;
    	}
    }
    

     3.页面代码就跟直接定义属性是一样的,以student的属性作为name。

    <tr>
        <td align="right">学生名</td>
        <td> <input type="text" name="studentname" value="${theUser.studentname}"></td></tr>
    <tr>
        <td align="right">年龄:</td>
        <td> <input type="text" name="age" value="${theUser.age}"></td></tr>
        <td align="right">班级:</td>
        <td> <input type="text" name="classname" value="${theUser.classname}"></td></tr>
    <tr>
        <td colspan='2' align="center"><input type="submit" value="保存" name="btnSubmit">   <input type="reset" value="重置" name="btnCancel"></td>
    </tr>
    

     4.这样我们就可以把Action和Model分开,去实现Struts2的MVC架构

     

    本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 

    转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4824321.html

  • 相关阅读:
    线索二叉树
    正则表达式之后向引用
    进步的阶梯
    树和二叉树
    java 执行 exe 文件
    Electron + Vue如何实现不同窗口之间的通信(项目总结 第一个)
    liunx 修改 ip 地址
    桌面快捷工具
    微信小程序长列表组件 recycle-view 修改,使其可以下拉刷新
    微信小程序 textarea 文本滚动不了的bug
  • 原文地址:https://www.cnblogs.com/superdo/p/4824321.html
Copyright © 2020-2023  润新知