zoukankan      html  css  js  c++  java
  • OGNL和类型转换

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

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

    OGNL和struts2

    OGNL:Object-Graph Navigation Language.

    OGNL是集成进struts框架中比较强大的技术有助于数据传输和类型转换.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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    1. cn.itcast.struts2.model.Address=cn.itcast.struts2.ognl.AddressConverter  
  • 相关阅读:
    Python:数据驱动测试DDT
    python-日志模块logging
    《测试架构师修炼之道》测试点
    Pycharm中使用Github
    MySql视图及存储过程
    MySQL游标和触发器
    MySQL事务处理及字符集和校对顺序
    MySQL安全管理、数据库维护及改善性能
    mysql-数据类型
    mysql-日期时间函数
  • 原文地址:https://www.cnblogs.com/keyi/p/7125305.html
Copyright © 2011-2022 走看看