Struts2学习笔记三ModelDriven的使用

Struts2有三种方式接收参数

第一种:通过get,set方法。在Action中添加属性并为属性增加get,set方法。代码如下:

package com.test;

public class TestParamAction {
 private String userName;
 
 public String testParam(){
     System.out.println("username="+userName);
     return null;
 }

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}
 
}

struts.xml增加以下配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
    "http://struts.apache.org/dtds/struts-2.3.dtd">  
 
 
    <struts>
     <package name="default" namespace="/test" extends="struts-default">  
            <action name="login" class="HelloWorld" >  
                <result name="login">/index.jsp</result>  
                 <result name="list">/list.jsp</result>  
            </action>
             <action name="demo" class="com.DemoAction" >  
                 <result name="list">/list.jsp</result>  
            </action>
              <action name="demotest" class="com.test.TestAction" >  
                 <result name="list">/list.jsp</result>  
            </action>
            <action name="param" class="com.test.TestParamAction">
            </action>

     </package>  
    </struts>

访问的路径 http://localhost:8080/struts//test/param!testParam.action?userName=abc

Ecplise控制台打印  username=abc

第二种:模型驱动方式(不实现ModelDriven接口)

需要自定义model,此处的model其实就是一个普能的javabean 代码实现如下:

TestParamAction.java

package com.test;

public class TestParamAction {
    private User user;//必须要添加get,set方法
 
 public String testParam(){
     System.out.println("username="+user.getUserName());
     return null;
 }

public User getUser() {
    return user;
}

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

}

User.java

package com.test;

public class User {

    private String userName;
    
    private String userId;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
    
    
}

方法路径:http://localhost:8080/struts//test/param!testParam.action?user.userName=abc    //此处的user一定要跟TestParamAction里定义的变名相同

ecplise控制台打印 username=abc

第三种,实现ModelDriven接口

package com.test;

import com.opensymphony.xwork2.ModelDriven;

public class TestParamAction<T> implements ModelDriven<T> {
    private User user;
 
 public String testParam(){
     System.out.println("username="+user.getUserName());
     return null;
 }



    public T getModel() {
        // TODO Auto-generated method stub
        if(user == null){
               user = new User();
           }
        return (T) user;
    }


 
}

User.java同第二种方法里的一样

访问路径: http://localhost:8080/struts//test/param!testParam.action?userName=abc

Ecplise控制台打印如下:username=abc


注:ModelDriven能实现的根据原因是因为struts2中实现了一个默认的拦截器ModelDrivenInterceptor,在此拦截器中会将getModel()方法的返回结果压入到值栈(ValueStack)中

ModelDrivenInterceptor 源码如下:

publicclass ModelDrivenInterceptor extends AbstractInterceptor {

 

    protectedbooleanrefreshModelBeforeResult = false;

 

    publicvoid 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();

    }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值