[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

原文地址:https://www.cnblogs.com/superdo/p/4824321.html