struts2 類型轉換很智能,他會幫咱們自動轉換類型,struts會自動轉換4類8種原生數據類型和String ,Date,當咱們本身定義的類型就不會轉換了,須要咱們本身去編寫類型轉換器。java
原理:類型轉換有兩個類,DefaultTypeConverter和Struts2TypeConverter,Struts2TypeConverter繼承DefaultTypeConveter,DefaultTypeConverter裏面就一個方法convertValue。apache
package com.shengsiyuan.converter; import java.util.Map; import java.util.StringTokenizer; import ognl.DefaultTypeConverter; import com.shengsiyuan.bean.User; public class UserConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(User.class == toType) //從前臺頁面String轉到後臺對象 { String[] str = (String[])value; String firstValue = str[0]; StringTokenizer st = new StringTokenizer(firstValue, ";"); String username = st.nextToken(); String password = st.nextToken(); User user = new User(); user.setUsername(username); user.setPassword(password); return user; } else if(String.class == toType) //從後臺對象轉換到前臺頁面string { User user = (User)value; String username = user.getUsername(); String password = user.getPassword(); String userInfo = "username: " + username + ", password: " + password; return userInfo; } return null; } }
咱們在這個方法裏面進行了一個if elseif的判斷,究竟是從頁面仍是轉到頁面而Struts2TypeConverter,還提供了另外兩個方法。ide
package com.shengsiyuan.converter; import java.util.Map; import java.util.StringTokenizer; import org.apache.struts2.util.StrutsTypeConverter; import com.shengsiyuan.bean.User; public class UserConverter2 extends StrutsTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { User user = new User(); String value = values[0]; StringTokenizer st = new StringTokenizer(value, ";"); user.setUsername(st.nextToken()); user.setPassword(st.nextToken()); return user; } @Override public String convertToString(Map context, Object o) { User user = (User)o; String username = user.getUsername(); String password = user.getPassword(); String userInfo = "username: " + username + ", password: " + password; return userInfo; } }
這裏面的兩個方法就至關於實現了那個if elseif功能了,只不過是將他們寫到兩個方法裏面了。code
咱們定義了類型轉換的類以後,還必須寫一個配置文件,這個配置文件就是用來指定那個變量來使用咱們所定義的類來進行轉換,對於全部的類型轉換的屬性文件都是同樣的,名字的後面部分都是-conversion.properties , 前面是action名字,這就表明的是Action裏面須要類型轉換的變量的名字。對象
局部或者全局:局部是須要在UserAction-convision.properties中定義UserAction中的屬性名字,放在那個Action的目錄下,而全局是須要在xwork-conversion.properties中指定好。
這個須要轉換的類的名字,以下:com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter2,放在src目錄下。最後會編譯到classes目錄下面。繼承
類型轉換器怎麼知道轉換那個類型呢?好比action中有個屬性是User類型的,那麼有屬性是User類型的,那麼這個屬性就會被自定義轉換器轉換了。get