一、接收請求參數(shù)
接收請求參數(shù),按照參數(shù)的類型可以分為兩種:
1、采用基本類型接收請求參數(shù)(包含get/post)
接收的方式就是,在Action類中定義與請求參數(shù)同名的屬性,框架源碼已經(jīng)利用反射原理將同名的參數(shù)傳入同名的屬性中,所以必需有public的setter方法。
2、采用復合類型接收請求參數(shù)
和方法1參不多,不過參數(shù)變?yōu)閺秃闲汀?br>
Struts2首先通過反射技術調(diào)用Person默認的構(gòu)造器創(chuàng)建person對象,然后再通過反射技術調(diào)用person中與請求參數(shù)同名的屬性的setter方法來獲取請求參數(shù)值。
例子如下:
配置文件的配置:
<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>
二、自定義類型轉(zhuǎn)換器
<1>定義局部類型轉(zhuǎn)換器
日期類作為特殊類型,Struts2只有對xxxx-xx-xx的String類型才能自動轉(zhuǎn)換為日期類,當是非該種格式類型的日期,我們需要自定義類型轉(zhuǎn)換器。
例如我們有一個person對象,含有生日屬性,類型為Date。
1、此時可以編寫一個DateConverter類繼承DefaultTypeConverter,重寫里面的方法convertValue.
2、可以將上面的類型轉(zhuǎn)換器注冊為局部類型轉(zhuǎn)換器:
在Action類所在的包下放置ActionClassName-conversion.prperties文件,ActionClassName是Action的類名,后面的-conversion.properties是固定寫法,對于本例而言,文件的名稱應該為LoginAction-conversion.properties,
且文件里面的內(nèi)容是
person.birthday=cn.winney.type.converter.DateTypeConverter
一般內(nèi)容的格式都是:
屬性名稱=類型轉(zhuǎn)換器的全類名(即包名加類名)
其中步驟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) {//將字符串類型轉(zhuǎn)換為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("轉(zhuǎn)換出錯!");
}
System.out.println("null那你呢");
return null;
}
需要注意的是:
Person里面的生日屬性的類型Date要和轉(zhuǎn)換的Date來自同一個包~
<2>定義全局類型轉(zhuǎn)換器
全局類型轉(zhuǎn)換器和局部類型轉(zhuǎn)換器一樣,都是要定義類型轉(zhuǎn)換類,然后不一樣的就是配置文件的命名和內(nèi)容配置。
要將該類型注冊為全局類型轉(zhuǎn)換器:
在WEB-INF/classes(即放在src下就好)放置xwork-conversion.properties文件。在properties文件中的內(nèi)容為:
待轉(zhuǎn)換的類型=類型轉(zhuǎn)換器的全類名
對于本例就是:
java.util.Date=cn.winney.conversion.DateConverter