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