且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

OGNL和类型转换

更新时间:2022-06-06 23:19:10

JavaWeb -- Struts 数据传输:OGNL和类型转换

 

OGNL和类型转换

 

1. 数据传输:OGNL和类型转换

OGNL和struts2

OGNL:Object-Graph Navigation Language.

OGNL是集成进struts框架中比较强大的技术有助于数据传输和类型转换.OGNL由表达式语言和类型转换器组成.

OGNL和类型转换

内置类型转换器

用ognl表达式映射表单字段名到属性

<s:form action="Register">

<s:textfield name="user.username" label="Username"/>

<s:password name="user.password" label="Password"/>

<s:textfield name="user.portfolioName" label="Enter a name "/>

<s:textfield name="user.age" label="Enter your age as a double "/>

<s:textfield name="user.birthday" label="birthday. (mm/dd/yy)"/>

<s:submit/>

</s:form>

private User user;//get/set

User{

  private String username;

  private String password;

  private String portfolioName;

  private Double age;

  private Date birthday;//get/set

内置类型转换器

List

private List lastNames ;

private List middleNames ;

不必预初始化集合.默认转换成字符串.

<s:textfield name="middleNames[0]" label="middleNames"/>

<s:textfield name="middleNames[1]" label="middleNames"/>

<s:textfield name="middleNames[2]" label="middleNames"/>

<s:textfield name="lastNames" label="lastNames"/>

<s:textfield name="lastNames" label="lastNames"/>

<s:textfield name="lastNames" label="lastNames"/>

若想显式指定数据类型,可通过属性文件的方式指定[XxxAction-conversion.properties].属性文件和Action类放在一起.

内置类型转换器

Map<String,String>

<s:textfield name="maidenNames.mary" label="Maiden Name"/>

<s:textfield name="maidenNames.jane" label="Maiden Name"/>

<s:textfield name="maidenNames.hellen" label="Maiden Name"/>

<s:textfield name="maidenNames['beth']" label="Maiden Name"/>

<s:textfield name="maidenNames['sharon']" label="Maiden Name"/>

<s:textfield name="maidenNames['martha']" label="Maiden Name"/>

private Map maidenNames ;

Map<String,User>

Element_myUsers=manning.utils.User

<s:textfield name="myUsers['chad'].username" label="names"/>

<s:textfield name="myUsers.chad.birthday" label="birthday"/>

private Map myUsers ;

自定义类型转换器

实现ognl.TypeConverter接口

继承类org.apache.struts2.util.StrutsTypeConverter.

public abstract Object convertFromString(Map context, String[] values,Class toClass);

public abstract String convertToString(Map context, Object o);

在字符串和Date对象间转换(续)

public class DateTypeConverter extends StrutsTypeConverter {

  public Object convertFromString(Map context, String[] values, Class toClass) {

      String date = values[0];

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

    return sdf.parse(date);

  }

  public String convertToString(Map context, Object o) {

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

    return sdf.format((Date)o);

  }

}

配置自定义类型转换器

属性相关:

      属性文件同action类放在一起, action中list map使用泛型定义,无需配置转换类型

      private Date birthday;

      [CustomConverterTest-conversion.properties]

      birthday=manning.utils.DateTypeConverter

全局类型转换: 放在 src目录下

      [classpath]/xwork-conversion.properties

      manning.utils.Circle=manning.utils.DateTypeConverter

 

----------------  实例 address 转换, 输入 aa-bb-cc 转为 Address-----------

address.java   domain

[java] view plain copy
 
 OGNL和类型转换OGNL和类型转换
  1. /** 
  2.  * 地址类  
  3.  */  
  4. public class Address {  
  5.     private String province;  
  6.     private String city;  
  7.     private String street;  
  8.   
  9.     public String getProvince() {  
  10.         return province;  
  11.     }  
  12.   
  13.     public void setProvince(String province) {  
  14.         this.province = province;  
  15.     }  
  16.   
  17.     public String getCity() {  
  18.         return city;  
  19.     }  
  20.   
  21.     public void setCity(String city) {  
  22.         this.city = city;  
  23.     }  
  24.   
  25.     public String getStreet() {  
  26.         return street;  
  27.     }  
  28.   
  29.     public void setStreet(String street) {  
  30.         this.street = street;  
  31.     }  
  32.       
  33.     public String toString() {  
  34.         return province + "-" + city + "-" + street;  
  35.     }  
  36. }  

注册提交Jsp, reg,jsp

[html] view plain copy
 
 OGNL和类型转换OGNL和类型转换
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <html>  
  3.     <head>  
  4.         <title>reg.jsp</title>  
  5.     </head>  
  6.     <body>  
  7.         <s:debug />  
  8.         <s:form namespace="/ognl" action="OgnlAction_reg" method="post">  
  9.             <s:textfield name="names" label="UserName" />  
  10.             <s:textfield name="names" label="UserName" />  
  11.             <s:textfield name="ages[0]" label="UserAge" />  
  12.             <s:textfield name="ages[1]" label="UserAge" />  
  13.             <s:textfield name="namesListNoGen" label="namesListNoGen" />  
  14.             <s:textfield name="namesListNoGen" label="namesListNoGen" />  
  15.             <s:textfield name="agesListNoGen[0]" label="agesListNoGen" />  
  16.             <s:textfield name="agesListNoGen[1]" label="agesListNoGen" />  
  17.               
  18.             <s:textfield name="userList[0].name" label="userList[0].name" />  
  19.             <s:textfield name="userList[1].name" label="userList[1].name" />  
  20.             <s:textfield name="userList[0].age" label="userList[0].age" />  
  21.             <s:textfield name="userList[1].age" label="userList[1].age" />  
  22.               
  23.             <s:textfield name="userMap[100].name" label="userMap[100].name" />  
  24.             <s:textfield name="userMap[100].age" label="userMap[100].age" />  
  25.             <s:textfield name="userMap[200].name" label="userMap[200].name" />  
  26.             <s:textfield name="userMap[200].age" label="userMap[200].age" />  
  27.               
  28.             <s:textfield name="comAddress" label="comAddress"/>  
  29.             <s:submit />  
  30.         </s:form>  
  31.         <s:property value="comAddress"/>  
  32.         <s:url includeContext="true" />  
  33.     </body>  
  34. </html>  

action

[java] view plain copy
 
 OGNL和类型转换OGNL和类型转换
  1. /** 
  2.  * OgnlAction 
  3.  */  
  4. public class OgnlAction extends ActionSupport {  
  5.     private static final long serialVersionUID = -6933309304624396640L;  
  6.   
  7.     private String[] names = new String[2];  
  8.     private Integer[] ages = new Integer[2];  
  9.       
  10.     /** 
  11.      * 不带泛型的集合 
  12.      */  
  13.     private List namesListNoGen ;  
  14.     private List agesListNoGen ;  
  15.       
  16.     /* javabean集合 */  
  17.     private List userList ;  
  18.     /* map */  
  19.     private Map userMap;  
  20.       
  21.     /* 公司地址 */  
  22.     private Address comAddress ;  
  23.       
  24.     public Address getComAddress() {  
  25.         return comAddress;  
  26.     }  
  27.   
  28.     public void setComAddress(Address comAddress) {  
  29.         this.comAddress = comAddress;  
  30.     }  
  31.   
  32.     public List getUserList() {  
  33.         return userList;  
  34.     }  
  35.   
  36.     public void setUserList(List userList) {  
  37.         this.userList = userList;  
  38.     }  
  39.   
  40.     public Integer[] getAges() {  
  41.         return ages;  
  42.     }  
  43.   
  44.     public void setAges(Integer[] ages) {  
  45.         this.ages = ages;  
  46.     }  
  47.   
  48.     public String[] getNames() {  
  49.         return names;  
  50.     }  
  51.   
  52.     public void setNames(String[] names) {  
  53.         this.names = names;  
  54.     }  
  55.   
  56.     public String reg() {  
  57.         return "success";  
  58.     }  
  59.   
  60.     public String toRegView() {  
  61.         System.out.println("toRegView");  
  62.         return "loginView";  
  63.     }  
  64.       
  65.     /** 
  66.      * 保存数据, 
  67.      */  
  68.     public String saveData(){  
  69.         ServletActionContext.getRequest().setAttribute("username", "requestTom");  
  70.         ServletActionContext.getRequest().getSession().setAttribute("username", "sessionTom");  
  71.         ServletActionContext.getServletContext().setAttribute("username", "applicationTom");  
  72.         ServletActionContext.getContext().getValueStack().set("username", "vsTom");  
  73.         //  
  74.         popUserList();  
  75.         return "showView" ;  
  76.     }  
  77.       
  78.     /** 
  79.      * 组装用户集合 
  80.      */  
  81.     private void popUserList(){  
  82.         userList = new ArrayList<User>();  
  83.         User u = null ;  
  84.         for(int i = 0 ; i < 10 ; i ++){  
  85.             u = new User();  
  86.             u.setId(1 + i);  
  87.             u.setName("tom" + i);  
  88.             u.setAge(20 + i);  
  89.             userList.add(u);  
  90.         }  
  91.     }  
  92.   
  93.     public List getNamesListNoGen() {  
  94.         return namesListNoGen;  
  95.     }  
  96.   
  97.     public void setNamesListNoGen(List namesListNoGen) {  
  98.         this.namesListNoGen = namesListNoGen;  
  99.     }  
  100.   
  101.     public List getAgesListNoGen() {  
  102.         return agesListNoGen;  
  103.     }  
  104.   
  105.     public void setAgesListNoGen(List agesListNoGen) {  
  106.         this.agesListNoGen = agesListNoGen;  
  107.     }  
  108.   
  109.     public Map getUserMap() {  
  110.         return userMap;  
  111.     }  
  112.   
  113.     public void setUserMap(Map userMap) {  
  114.         this.userMap = userMap;  
  115.     }  
  116. }  

地址转换器

[java] view plain copy
 
 OGNL和类型转换OGNL和类型转换
  1. /** 
  2.  * 地址类型转换器 
  3.  */  
  4. public class AddressConverter extends StrutsTypeConverter {  
  5.   
  6.     /** 
  7.      * 将字符串转换成地址对象 
  8.      */  
  9.     public Object convertFromString(Map context, String[] values, Class toClass) {  
  10.         if(values != null && values.length > 0){  
  11.             String str = values[0];  
  12.             String[] ss = str.split("-");  
  13.             if(ss != null && ss.length > 2){  
  14.                 Address a = new Address();  
  15.                 a.setProvince(ss[0]);  
  16.                 a.setCity(ss[1]);  
  17.                 a.setStreet(ss[2]);  
  18.                 return a ;  
  19.             }  
  20.         }  
  21.         return null;  
  22.     }  
  23.   
  24.     /** 
  25.      * 将地址对象转换成字符串信息 
  26.      */  
  27.     public String convertToString(Map context, Object o) {  
  28.         if(o instanceof Address){  
  29.             return o.toString();  
  30.         }  
  31.         return null;  
  32.     }  
  33.   
  34. }  

OgnlAction-conversion.properties 转换类型配置, 放在action同目录,命名方式固定

[plain] view plain copy
 
 OGNL和类型转换OGNL和类型转换
  1. Element_agesListNoGen=java.lang.Integer  
  2. Element_userList=cn.itcast.struts2.model.User  
  3. Element_userMap=cn.itcast.struts2.model.User  
  4. Key_userMap=java.lang.Integer  
  5.   
  6. #comAddress=cn.itcast.struts2.ognl.AddressConverter  

xwork-conversion.properties 类型转换,全局配置文件,放在src目录下,命名固定

[plain] view plain copy
 
 OGNL和类型转换OGNL和类型转换
  1. cn.itcast.struts2.model.Address=cn.itcast.struts2.ognl.AddressConverter