基本類型能夠完成自動轉換,主要轉換對象類型,基於OGNL
分爲:
----
局部類型轉換
1.自定義轉換類繼承DeaultTypeConverter
重寫convertValue(Map context, Object value, Class toType)
Xxx.class == toType (或用equals()) String --> Object
String.class == toTtpe Object --> String
2.或繼承StrutsTypeConverter
重寫
Object convertFromString(Map context,String[] values,Class toClass)
String convertToString(Map context, Object o)
3.配置文件:
Action類名-conversion.properties 須要和對應Action在同一目錄下
內容:
屬性名=轉換類名 (多個屬性就寫多行)
----
全局類型轉換
1. 2. 同局部轉換
3.配置文件:
xwork-conversion.properties(固定的)
內容:
須要類型轉換的
Action的全稱類名=轉換類名
【局部類型轉換】
=======================================
1. input.jsp
=======================================
1. input.jsp
<h1>用逗號將點的兩個座標分割開</h1> 如:20,30
<s:form action="pointConverter">
<s:textfield name="point" label="點" />
<s:textfield name="age" label="年齡" />
<s:textfield name="username" label="用戶名" />
<s:textfield name="date" label="生日" />
<s:textfield name="point" label="點" />
<s:textfield name="age" label="年齡" />
<s:textfield name="username" label="用戶名" />
<s:textfield name="date" label="生日" />
<s:submit label="提交" />
</s:form>
</s:form>
對於一個屬性來講,先進行類型轉化,轉化成功了再進行輸入驗證
=======================================
2.創建 模型類
.....test.bean 包
public class Point {
private int x;
private int y;
//setter...getter...方法
}
private int y;
//setter...getter...方法
}
=======================================
3.簡要說明
用於實現轉換的TypeCenverter接口:
主要使用DefaultTypeCenverter類
主要使用DefaultTypeCenverter類
重寫convertValue()方法
public Object convertValue(Map context, Object value, Class toType)
=======================================
4.創建自定義轉換類
創建....test.converter包
創建 轉換類
須要繼承DeaultTypeConverter,DeaultTypeConverter實現了TypeConverter轉換接口
public class PointConverter extends DeaultTypeConverter {
創建 轉換類
須要繼承DeaultTypeConverter,DeaultTypeConverter實現了TypeConverter轉換接口
public class PointConverter extends DeaultTypeConverter {
@Override
public Object convertValue(
Map context, //上下文
Object value, //要轉換的值(String數組)
Class toType //目標類型(轉換成什麼)
) {
//若是要轉換的類型是Point
if( Point.class == toType ) {
Point point = new Point();
String[] str = (String[])value;
//此處數組只有一個值,在0的位置上
String[] paramValues = str[0].split(",");
public Object convertValue(
Map context, //上下文
Object value, //要轉換的值(String數組)
Class toType //目標類型(轉換成什麼)
) {
//若是要轉換的類型是Point
if( Point.class == toType ) {
Point point = new Point();
String[] str = (String[])value;
//此處數組只有一個值,在0的位置上
String[] paramValues = str[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
point.setY(y);
return point;
}
//若是要轉換的類型爲String (也能夠用系統自動轉換)
if( String.class == toType ) {
Point point = (Point)value;
int x = point.getX();
int y = poitn.getY();
String result = "[x=" + x + " , y=" + y + "]";
if( String.class == toType ) {
Point point = (Point)value;
int x = point.getX();
int y = poitn.getY();
String result = "[x=" + x + " , y=" + y + "]";
return result;
}
}
return null;
}
注:爲何value是數組,由於頁面的字段能夠有一樣的名字,如:
<s:textfield name="username" />
<s:textfield name="username" />
這樣的話,得到username時就應該是多個,因此是字符串數組
=======================================
5.創建action
5.創建action
public class PointAction extends ActionSupport {
private Point point;
private int age;
private String username;
private Date date;
private Point point;
private int age;
private String username;
private Date date;
//setter...getter...
@Override
public String execute() throws Execption {
public String execute() throws Execption {
return SUCCESS;
}
}
}
}
--------------------
補充:
Action接口中:
Field Summary 字段摘要
補充:
Action接口中:
Field Summary 字段摘要
ERROR 執行失敗
INPUT 驗證沒有成功
LOGIN 沒有執行成功,由於沒有登錄
NONE 執行成功,但不相識任何題圖
SUCCESS 執行成功
INPUT 驗證沒有成功
LOGIN 沒有執行成功,由於沒有登錄
NONE 執行成功,但不相識任何題圖
SUCCESS 執行成功
=======================================
6. struts.xml
<package name="struts2" extends="struts-default">
<action name="pointConverter" class="com.test.action.PointAction">
<!-- 對應execute()中的SUCCESS,SUCCESS的值是success -->
<result name="success">/output.jsp</result>
</action>
</package>
<action name="pointConverter" class="com.test.action.PointAction">
<!-- 對應execute()中的SUCCESS,SUCCESS的值是success -->
<result name="success">/output.jsp</result>
</action>
</package>
=======================================
7.output.jsp
<%@ taglib prefix="s" uri="/strurs-tags" %>
property標籤自動調用value對應的字段的get方法,value="point"和getPoint()方法匹配
point: <s:property value="point"/><br/>
age:<s:property value="age"/><br/>
username:<s:property value="username"/><br/>
date:<s:property value="date"/><br/>
${point }<br/>
${point.x }<br/>
${point.y }
point: <s:property value="point"/><br/>
age:<s:property value="age"/><br/>
username:<s:property value="username"/><br/>
date:<s:property value="date"/><br/>
${point }<br/>
${point.x }<br/>
${point.y }
=======================================
8.定義屬性文件--用於指定轉換類
該文件必須和對應的轉換類在同一個包下
PointAction-conversion.properties
PointAction: 對應哪一個Action中的屬性進行轉換
-conversion.properties: 是固定不變的
-conversion.properties: 是固定不變的
PointAction-conversion.properties的內容
對那個屬性進行轉換=用那個類對其進行轉換,多個屬性就寫多行
point=com....converter.PointConverter
point=com....converter.PointConverter
【完成】
=======================================
總體流程
總體流程
1.提交請求->到struts.xml中去找對應的action,這裏是pointConverter,找到以後,知道了有指定的類(PointAction)來處理請求
2.生成PointAction的實例,到PointAction中,把請求中的值調用set方法賦給該類的每一個屬性
3.當調用set方法前,首先檢查,對於這個屬性有沒有自定義的類型轉換,沒有的時候就按照系統的行爲進行默認的轉換;
若是發現已經定義好了類型轉換(檢查PiontAction的目錄下有沒有PointAction-onversion.properties存在),而後到該.properties文件裏找,你到底要經過哪一個類轉換哪個屬性。
若是發現已經定義好了類型轉換(檢查PiontAction的目錄下有沒有PointAction-onversion.properties存在),而後到該.properties文件裏找,你到底要經過哪一個類轉換哪個屬性。
4.到相應的轉換類中,這裏是PointConverter,而後判斷轉換的方向,
Poitn.class==toType:經過字符串數組 轉換到 Point對象,進入到相應的if流程
return後,流程回到PointAction中的setPoint方法,而後使用轉換後的對象賦值給屬性
Poitn.class==toType:經過字符串數組 轉換到 Point對象,進入到相應的if流程
return後,流程回到PointAction中的setPoint方法,而後使用轉換後的對象賦值給屬性
5.將全部的屬性賦值成功後,執行execute方法,而後經過返回值找到struts.xml中的action中的result對應的頁面(output.jsp),顯示結果。
6.而後發現<s:property>,每找到value,就到PointAction中調用相應的get方法,查找該字段有沒有配置自動轉換類,對於沒有字段,應用系統默認的轉換後直接返回。對於配置的,流程同上,到PointConverter中執行對應的if流程(String.class==toType),return後回到PointAction中的get方法返回其轉換後的值,顯示到頁面。
【全局類型轉換】
=======================================
=======================================
需求:3個點的座標
=======================================
多個屬性的局部類型轉換
多個屬性的局部類型轉換
input.jsp中
添加兩個點的座標
<s:textfield name="point2" label="點2" />
<s:textfield name="point3" label="點3" />
添加兩個點的座標
<s:textfield name="point2" label="點2" />
<s:textfield name="point3" label="點3" />
PointAction中
添加兩個點字段
private Point point2;
private Point point3;
//setter...getter...
添加兩個點字段
private Point point2;
private Point point3;
//setter...getter...
PointAction-conversion.properties中
添加
point2=com........converter.PointConverter
point3=com........converter.PointConverter
result.jsp中
添加
點2:<s:property value="point2" /><br/>
點3:<s:property value="point3" /><br/>
=======================================
需求:要轉換的對象分佈在多個action裏面,上面的方式比較麻煩
應使用
全局的類型轉換:對系統裏全部知足要求的進行轉換
=======================================
配置文件:
配置文件:
配置文件名:xwork-conversion.properties(固定的)
應在classes目錄下,也就是struts.xml相同的目錄
放在src下就能夠了
應在classes目錄下,也就是struts.xml相同的目錄
放在src下就能夠了
內容:
要轉化那個類的全稱類名=使用哪一個類進行轉換
com.scorpio.jh.struts2.test.bean.Point=com.scorpio.jh.struts2.test.converter.PointConverter
用PointConverter類對系統中全部的須要轉換的類進行轉換
=======================================
經過繼承util包下的StrutsTypeConverter類進行轉換
=======================================
1. 創建一個新的轉換類,繼承StrutsTypeConverter
1. 創建一個新的轉換類,繼承StrutsTypeConverter
public class PointConverter2 extends StrutsTypeConverter {
//從String轉換到目標對象
@Override
public Object convertFromString(
Map context,
String[] values,
Class toClass) {
@Override
public Object convertFromString(
Map context,
String[] values,
Class toClass) {
Point point = new Point();
String[] paramValues = values[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
return point;
}
String[] paramValues = values[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
return point;
}
//從對象轉換到String
@Override
public String convertToString( Map context, Object o ) {
Point point = (Point)o;
int x = point.getX();
int y = point.getY();
String result = "[x=" + x + ", y=" + "]";
@Override
public String convertToString( Map context, Object o ) {
Point point = (Point)o;
int x = point.getX();
int y = point.getY();
String result = "[x=" + x + ", y=" + "]";
return result;
}
}
}
=======================================
2.修改配置文件 xwork-conversion.properties
2.修改配置文件 xwork-conversion.properties
com.scorpio.jh.struts2.test.bean.Point=com.scorpio.jh.struts2.test.converter.PointConverter2
【完成】
拓展:
=======================================
=======================================
需求:Action中用一個集合類型,存儲Piont對象
=======================================
1.action類
1.action類
public class PointAction extends ActionSupport {
private List<Piont> point;
private int age;
private String username;
private Date date;
private int age;
private String username;
private Date date;
//setter...getter...
public String execute() throws Exception { ... }
}
}
=======================================
2.input.jsp
2.input.jsp
<s:form action="pointConverter">
<s:textfield name="point" label="點1" /> name相同,會返回一個數組
<s:textfield name="point" label="點2" />
<s:textfield name="point" label="點3" />
<s:textfield name="age" label="年齡" />
<s:textfield name="username" label="用戶名" />
<s:textfield name="date" label="生日" />
<s:textfield name="point" label="點1" /> name相同,會返回一個數組
<s:textfield name="point" label="點2" />
<s:textfield name="point" label="點3" />
<s:textfield name="age" label="年齡" />
<s:textfield name="username" label="用戶名" />
<s:textfield name="date" label="生日" />
<s:submit label="提交" />
</s:form>
</s:form>
=======================================
3. result.jsp
point: <s:property value="point"/><br/>
age:<s:property value="age"/><br/>
username:<s:property value="username"/><br/>
date:<s:property value="date"/><br/>
age:<s:property value="age"/><br/>
username:<s:property value="username"/><br/>
date:<s:property value="date"/><br/>
=======================================
4.轉換類 PointConverter3
4.轉換類 PointConverter3
public class PointConverter3 extends StrutsTypeConverter {
//從String到對象
@Override
public Object convertFromString(
Map context,
String[] values,
Class toClass) {
@Override
public Object convertFromString(
Map context,
String[] values,
Class toClass) {
List<Point> list = new ArrayList<Point>();
for( String value : values ) {
Point point = new Point();
String[] paramValues = value.split.split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
Point point = new Point();
String[] paramValues = value.split.split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
point.setY(y);
list.add(point);
}
return list;
}
}
return list;
}
//從對象到String
@Override
public String convertToString( Map context, Object o ) {
List<Point> list = (List<Point>)o;
//StringBuilder 非同步版本的StringBuffer
StringBuilder sb = new StringBuilder();
sb.append("[");
int number = 0;
for( Point point : list ) {
++number;
int x = point.getX();
int y = point.getY();
@Override
public String convertToString( Map context, Object o ) {
List<Point> list = (List<Point>)o;
//StringBuilder 非同步版本的StringBuffer
StringBuilder sb = new StringBuilder();
sb.append("[");
int number = 0;
for( Point point : list ) {
++number;
int x = point.getX();
int y = point.getY();
sb.append(number).append(" x=").append(x).append(", y=").append(y).append(" ");
}
sb.append("]");
return sb.toString();
}
}
sb.append("]");
return sb.toString();
}
}
=======================================
5.採用局部轉換
5.採用局部轉換
PointAction-conversion.properties
point=com....converter.PointConverter3
【完成】
=======================================
注:
注:
若是須要轉換的字段沒有使用泛型 List<Point>
則要在局部類型轉換中加入 Element_ 頭 + 你要轉換的東西
可是建議使用泛型
=======================================
補充:
補充:
能夠用 屬性名.屬性的值 這樣一種方式賦值
<s:form action="pointConverter">
<s:textfield name="point.x" label="x座標" /> *********
<s:textfield name="point.y" label="y座標" /> *********
<s:textfield name="point.x" label="x座標" /> *********
<s:textfield name="point.y" label="y座標" /> *********
<s:textfield name="age" label="年齡" />
<s:textfield name="username" label="用戶名" />
<s:textfield name="date" label="生日" />
<s:textfield name="username" label="用戶名" />
<s:textfield name="date" label="生日" />
<s:submit label="提交" />
</s:form>
</s:form>
------------------------
public class PointAction extends ActionSupport {
private Piont point;
private int age;
private String username;
private Date date;
private int age;
private String username;
private Date date;
//setter...getter...
public String execute() throws Exception { ... }
}
}
------------------------
將全局和局部類型轉換註釋掉 用#號
將全局和局部類型轉換註釋掉 用#號
------------------------
重寫Point的toString()
pubic String toString() {
return "[x=" + x + ", y=" + y + "]";
}
重寫Point的toString()
pubic String toString() {
return "[x=" + x + ", y=" + y + "]";
}
【完成】
補充2:
=======================================
更改jsp默認的字符集
更改jsp默認的字符集
菜單window->Preferences->MyEclipse->FIles and Editors->JSP
從Encoding中選擇須要的 好比UTF-8
=======================================
要在eclipse中顯示struts2的源代碼,須要和源代碼進行連接,
鏈接到:struts-2.0.11\src\core\src\main\java\ 就能夠了