Struts2第十二篇【模型驱动】[亲测有效]

Struts2第十二篇【模型驱动】[亲测有效]tags:Struts2什么是模型驱动在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装.为什么要使用模型驱动?我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器


tags: Struts2


什么是模型驱动

在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装.

为什么要使用模型驱动?

我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的…既然有了params拦截器,为啥还要模型驱动??

当我们使用params拦截器完成数据自动封装的时候,如果要封装的是JavaBean对象,那么在web表单中就必须的name写上javaBean.属性名….

这样的话,web层和Action层就耦合了…因为在web层必须要知道封装的JavaBean对象是什么才能够实现自动封装

模型驱动就解决了这个问题!即时不知道Action层的JavaBean对象是什么,也能够完成数据自动封装!

模型驱动的实现原理

实现模型驱动功能也是由拦截器完成的,我们来看看拦截器到底做了什么吧….


         <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

拦截方法的源码是这样的:


	public String intercept(ActionInvocation invocation) throws Exception {

		//得到当前要执行的Action对象
		Object action = invocation.getAction();

		//判断该Action对象是否实现了ModelDriven接口
		if(action instanceof ModelDriven) {
			ModelDriven modelDriven = (ModelDriven)action;
			
			//获取值栈对象
			ValueStack stack = invocation.getStack();
			
			//得到model的对象
			Object model = modelDriven.getModel();
			
			//把对象存到值栈对象中
			if(model != null) {
				stack.push(model);
			}
			if(this.refreshModelBeforeResult) {
				invocation.addPreResultListener(new ModelDrivenInterceptor.RefreshModelBeforeResult(modelDriven, model));
			}
		}

		return invocation.invoke();
	}

把model对象放到值栈对象之后,**Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. **

也就是说,使用模型驱动是需要配合Params拦截器完成的!

使用数据模型驱动

实现ModelDriven接口

  • 实现ModelDriven接口,重写方法….实现接口时,要封装的对象是什么,形参类型就给什么

public class UserAction extends ActionSupport implements ModelDriven<User> {



    public String login() {

        return SUCCESS;
    }


    @Override
    public User getModel() {
        return null;
    }
}

对象实例化


public class UserAction extends ActionSupport implements ModelDriven<User> {


    //这里一定要实例化
    User user = new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public User getModel() {
        return user;
    }
}

测试

JSP提交页面,直接写上JavaBean对象的属性就行了..不需要写上JavaBean对象的名称!

<form action="${pageContext.request.contextPath}/user_execute">
    <table border="1">

        <tr>
            <td>用户名:<input type="text" name="username"></td>
        </tr>
        <tr>
            <td> 密码:<input type="password" name="password"></td>
        </tr>
        <tr>
            <td>电话:<input type="text" name="cellphone"></td>
        </tr>
        <tr>
            <td> 邮箱:<input type="text" name="email"></td>
        </tr>

        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>

    </table>


</form>
  • 在Action业务方法中输出User对象的数据

    @Override
    public String execute() throws Exception {

        System.out.println(user);
        return SUCCESS;
    }

这里写图片描述


如果您觉得这篇文章帮助到了您,可以给作者一点鼓励

Struts2第十二篇【模型驱动】[亲测有效]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13442.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注