所有MVC框架都需要負責解析HTTP請求參數,並將請求參數傳給控制器組件,而HTTP請求參數都是字符串類型,因此,MVC框架必須將這些字符串參數轉換成相應的數據類型。
struts2提供了強大的類型轉換機制,支持轉換的類型有boolean、char、int、long、float、double、Date(日期格式使用用戶請求所在Locale的SHORT格式)、數組、集合。有些特殊情況,需要把字符串轉換成符合對象時,需要使用自定義類型轉換器。
在OGNL項目中定義了一個TypeConverter接口,該接口是自定義轉換器必須實現的接口,該接口提供了一個實現類:DefaultTypeConverter,通常採用擴展該類來實現自定義轉換器,此時只需重寫該類的convertValue方法。該方法定義如下:
public Object convertValue(Map context, Object value, Class toType),參數含義如下:
context:類型轉換環境的上下文
value:需要轉化的參數,隨着轉換方向的不同,該參數的值也不同。
toType:需要轉換的目標類型,當toType是複合對象時,表明需要將字符串類型轉爲複合對象實例,當toType是String類型時,表明需要將複合對象實例轉換成String類型。
對於DefaultTypeConverter轉換器而言,它必須考慮到最通用的情況,因此它把所有請求參數都視爲字符串數組,而非字符串。
爲了簡化實現,struts2提供了一個StrutsTypeConverter抽象類,該類是DefaultTypeConverter類的子類,已實現了DefaultTypeConverter類的convertValue方法。實現該方法時,它將兩個不同轉換方向替換成不同的方法——當需要把字符竄轉換成複合合類型時,調用convertFromString方法,需要把複合類型轉換成字符串類型時,調用convertToString方法。
1、Point類(需要轉換的對象)
- public class Point {
- private int x;
- private int y;
- public int getX() {
- return x;
- }
- public void setX(int x) {
- this.x = x;
- }
- public int getY() {
- return y;
- }
- public void setY(int y) {
- this.y = y;
- }
- }
2、LoginAction類:
- public class LoginAction extends ActionSupport {
- private List<Point> points;
- public List<Point> getPoints() {
- return points;
- }
- public void setPoints(List<Point> points) {
- this.points = points;
- }
- @Override
- public String execute() throws Exception {
- return SUCCESS;
- }
- }
3、 PointConverter類(轉換器):
4、LoginAction-conversion.properties文件:
- public class PointConverter extends StrutsTypeConverter {
- @SuppressWarnings("rawtypes")
- @Override
- public Object convertFromString(Map context, String[] values, Class toClass) {
- List<Point> points = new ArrayList<Point>();
- for (String value : values) {
- Point point = new Point();
- String[] paramValues = value.split(",");
- int x = Integer.parseInt(paramValues[0]);
- int y = Integer.parseInt(paramValues[1]);
- point.setX(x);
- point.setY(y);
- points.add(point);
- }
- return points;
- }
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @Override
- public String convertToString(Map context, Object o) {
- List<Point> points = (List<Point>) o;
- StringBuilder result = new StringBuilder();
- result.append("{");
- for (Point point : points) {
- int x = point.getX();
- int y = point.getY();
- result.append("[").append("x=").append(x).append(",y=").append(y)
- .append("],");
- }
- result.append("}");
- result.deleteCharAt(result.length() - 2);
- return result.toString();
- }
- }
轉換器寫完後需要註冊,包括全局轉換器和局部轉換器,局部類型轉換器只對指定Action的特定屬性起作用,文件命名爲ActionName-conversion.properties,與對應Action位於同一目錄下,”-conversion.properties”爲固定部分;全局類型轉換期對該類型的所有屬性起作用,文件命名固定爲xwork-conversion.properties,該文件內容由多想”<propType>=<ConvertClass>”組成,<propType>爲需要轉換的類的全名(包名+類名),<ConvertClass>爲對應類型轉換器的實現類(類的全名)。
- points=com.wgy.struts2.PointConverter
5、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" extends="struts-default">
- <action name="login" class="com.wgy.struts2.LoginAction">
- <result name="success">/result.jsp</result>
- </action>
- </package>
- </struts>
6、index.jsp頁面:
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>index</title>
- </head>
- <body>
- <h3>
- <font color="red">用逗號分割點的座標</font>
- </h3>
- <s:form action="login">
- <s:textfield name="points" label="point1" />
- <s:textfield name="points" label="point2" />
- <s:textfield name="points" label="point3" />
- <s:submit value="提交" />
- </s:form>
- </body>
- </html>
7、result.jsp頁面:
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>result</title>
- </head>
- <body>
- points:<s:property value="points" /> <br />
- <s:debug />
- </body>
- </html>