(三)Struts2接收参数的方法
Struts2接收参数的方法有3种分别是:
1.用Action的属性接收参数
2.用DomainModel接收参数
3.用ModelDriven接收参数
一:用Action的属性接收参数的例子如下:
UI页面代码如下:
<body>
使用action属性接收参数<a href="user/user!add?name=credo&age=25">添加用户</a>
</body>
Action代码如下:
package org.credo.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
private int age;
public String add() {
System.out.println("name=" + name);
System.out.println("age=" + age);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
可以看到,在action种定义了name和age,并且get和set.
那么就可以直接进行传参,?name=credo&age=25
在action种将获取到这些值.
二.用DomainModel接收参数例子如下:
DomainModel是指域模型,就是model.最常用的一种.
UI代码:
<body>
使用Domain Model接收参数<a href="user/user!add?user.name=credo&user.age=25">添加用户</a>
Action代码:
public class UserAction extends ActionSupport {
private User user;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
DoMainModel代码:
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
像上面这样就是使用dimainmodel来接收参数.
如果说User只有name,age,但是页面有额外的其他参数,如sex等.
可以使用一个VO来接收参数.
public class UserVO {
private String name;
private String password;
private String confirmingPassword;
//GET AND SET
}
这里的dimainmodel就是为了公用吧.VO针对点.
三.用ModelDriven接收参数,不常用
模型驱动这种方法并不常用.
UI代码:
<body>
使用ModelDriven接收参数<a href="user/user!add?name=credo&age=25">添加用户</a>
Action代码:
注意:实现了ModelDriven.<User>,并且需要new一个User.
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
Model->User.java代码:
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
实现了ModelDriven.<User>,进入action,将给新new出的User的name和age进行自动赋值.这种方法不常用.如图所示:
(四)Struts2传参的中文问题
1.首先提到的就是如果参数是中文,就不要用get,用post.
2.在struts.xml中:
<!-- 让参数可以传中文 -->
<constant name="struts.i18n.encoding" value="GBK" />
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
<include file="example.xml"/>
-->
<!-- 下面是设定开发模式,设定为true,方便修改action name后的热部署 -->
<constant name="struts.devMode" value="true" />
<!-- 让参数可以传中文 -->
<constant name="struts.i18n.encoding" value="GBK" />
<!-- package区分包,name space是访问路径,如 name是user,namespace就是/user,按模块划分 -->
<!-- namespace不写,就等于namespace="",URL为任意项目名/xxx下的index -->
<package name="default" namespace="/" extends="struts-default">
不过好像貌似没用.