一、接收请求参数
接收请求参数,按照参数的类型可以分为两种:
1、采用基本类型接收请求参数(包含get/post)
接收的方式就是,在Action类中定义与请求参数同名的属性,框架源码已经利用反射原理将同名的参数传入同名的属性中,所以必需有public的setter方法。
2、采用复合类型接收请求参数
和方法1参不多,不过参数变为复合型。
Struts2首先通过反射技术调用Person默认的构造器创建person对象,然后再通过反射技术调用person中与请求参数同名的属性的setter方法来获取请求参数值。
例子如下:
配置文件的配置:
<action name="index">
<result>/WEB-INF/index.jsp</result>
</action>
<action name="logon" class="cn.itcast.action.LoginAction" method="login">
<result name="success">/logon.jsp</result>
</action>
对应的index.jsp:
<form action="logon">
姓名:<input type="text" name="person.username"><br>
密码:<input type="password" name="person.password"><br>
<input type="submit" name="submit" value="提交"><br>
</form>
对应的处理Action:
public class LoginAction {
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String login() {
return "success";
}
}
对应的Bean类:
public class Person {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
对应的logon.jsp:
<body>
hello,${person.username }<br>
密码是:${person.password }
</body>
二、自定义类型转换器
<1>定义局部类型转换器
日期类作为特殊类型,Struts2只有对xxxx-xx-xx的String类型才能自动转换为日期类,当是非该种格式类型的日期,我们需要自定义类型转换器。
例如我们有一个person对象,含有生日属性,类型为Date。
1、此时可以编写一个DateConverter类继承DefaultTypeConverter,重写里面的方法convertValue.
2、可以将上面的类型转换器注册为局部类型转换器:
在Action类所在的包下放置ActionClassName-conversion.prperties文件,ActionClassName是Action的类名,后面的-conversion.properties是固定写法,对于本例而言,文件的名称应该为LoginAction-conversion.properties,
且文件里面的内容是
person.birthday=cn.winney.type.converter.DateTypeConverter
一般内容的格式都是:
属性名称=类型转换器的全类名(即包名加类名)
其中步骤1的代码是:
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class DateTypeConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
try {
if(toType == Date.class) {//将字符串类型转换为Date类型
String[] params = (String[])value;//request.getParameterValus()
return dateFormat.parse(params[0]);
} else if(toType == String.class) {
Date date = (Date)value;
return dateFormat.format(date);
}
} catch (ParseException e) {
System.out.println("转换出错!");
}
System.out.println("null那你呢");
return null;
}
需要注意的是:
Person里面的生日属性的类型Date要和转换的Date来自同一个包~
<2>定义全局类型转换器
全局类型转换器和局部类型转换器一样,都是要定义类型转换类,然后不一样的就是配置文件的命名和内容配置。
要将该类型注册为全局类型转换器:
在WEB-INF/classes(即放在src下就好)放置xwork-conversion.properties文件。在properties文件中的内容为:
待转换的类型=类型转换器的全类名
对于本例就是:
java.util.Date=cn.winney.conversion.DateConverter