现在的位置: 首页 > 综合 > 正文

Struts2中使用ognl类型转换器

2013年08月06日 ⁄ 综合 ⁄ 共 6230字 ⁄ 字号 评论关闭

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

下面,我们来使用ognl来实现数据类型的转换,首先还是建立一个页面

Code:
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <html>  
  3.   <head>  
  4.   <title> 登录页面 </title>  
  5.   <link rel=stylesheet href="css/login.css" type="text/css">  
  6.   </head>  
  7.   <body>  
  8.   <h1 align="center">用户登录页面</h1>  
  9.   <hr>  
  10.    <div align="center">  
  11.    <form action="login.lp" method="post">  
  12.    <table  cellspacing=5 border=5 bodercolor=#ffaa00 >  
  13.     <tr><th colspan="3" align="center"  bgcolor=#ffaa00>用户登录</th></tr>  
  14.    <tr>  
  15.    <th rowspan="3" background="images/2.jpg" style="width=90px"></th>  
  16.    <td>用户名:</td><td><input type="text" class="message" name="user"></td></tr>  
  17.    <tr><td>密  码:</td><td><input class="message" type="password" name="user"></td></tr>  
  18.     <tr><td>日  期:</td><td><input class="message" type="text" name="user"></td></tr>  
  19.     <tr><td colspan="3" align="center"><input type="submit" value="登录">  <input type="reset" value="重置"></td></tr>  
  20.    </table>  
  21.       
  22.    </form>  
  23.    </div>  
  24.   </body>  
  25. </html>  

2、写一个User的From类,用来封装表单传递过来的值,

Code:
  1. package myclass.struts2.form;   
  2. import java.util.Date;   
  3. public class User {   
  4.     public String name;   
  5.     public String password;   
  6.     public Date birth;   
  7.     public String getName() {   
  8.         return name;   
  9.     }   
  10.     public void setName(String name) {   
  11.         this.name = name;   
  12.     }   
  13.     public String getPassword() {   
  14.         return password;   
  15.     }   
  16.     public void setPassword(String password) {   
  17.         this.password = password;   
  18.     }   
  19.     public Date getBirth() {   
  20.         return birth;   
  21.     }   
  22.     public void setBirth(Date birth) {   
  23.         this.birth = birth;   
  24.     }   
  25.        
  26. }   

3、接下来就要写一个转换的类UserFormTypeConverter,用于对象与字符等各种数据的转换,该类继承了DefaultTypeConverter我们需要重写其中的ConvertefromString和convertToString方法。即ConvertefromString是将客户端的数据转换成其他类型,convertToString是将服务器端的数据转换成在页面上要显示的内容

Code:
  1. //类型转换器   
  2. public class UserFormTypeConverter extends DefaultTypeConverter{   
  3.     SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");   
  4.   
  5.     @Override  
  6.     public Object convertValue(Map<String, Object> context, Object value,   
  7.             Class toType) {   
  8.         System.out.println("conver");   
  9.         //转换成对象   
  10.         if(toType==User.class){   
  11.             User user=  new User();   
  12.             String para[]=(String[])value;   
  13.             String name=para[0];   
  14.             String password=para[1];   
  15.             try {   
  16.             Date birth=sdf.parse(para[2]);   
  17.             user.setName(name);   
  18.             user.setPassword(password);   
  19.             user.setBirth(birth);   
  20.             } catch (ParseException e) {   
  21.                 e.printStackTrace();   
  22.             }   
  23.             return user;   
  24.         }   
  25.         else if(toType==String.class){//从对象转换成字符串   
  26.             User user=(User)value;   
  27.             return "<"+user.getName()+","+user.getPassword()+","+user.getBirth().toString()+">";   
  28.         }   
  29.         //转换成字符串   
  30.         return null;   
  31.     }   
  32. }  

需要注意的是,局部使用时在Action的同目录下建立对应的XxxxAction-conversion.properties XxxxAction的名字对应Action类的名字,比如这里为 ChangeAction-conversion.properties 内容如下
对属性进行转换注册(其实是setter和getter方法)
user=ognls.UserTypeConverter如果在多个action中使用到UserBean类型转换器 那么建议采用全局的配置在src目录下建立 xwork-conversion.properties 内容如下jsp_servlet.UserBean=ognls.UserTypeConverter#key是bean对象类 value是对应的类型转换器对象。

也可以使用继承StrutsTypeConverter类再实现,这种方法在使用中很方便,通常建议使用这种方法,如下:

Code:
  1. package myclass.struts2.action;   
  2.   
  3. import java.text.ParseException;   
  4. import java.text.SimpleDateFormat;   
  5. import java.util.Date;   
  6. import java.util.Map;   
  7.   
  8. import myclass.struts2.form.User;   
  9.   
  10. import org.apache.struts2.util.StrutsTypeConverter;   
  11.   
  12. public class UserFormTypeConverter1 extends StrutsTypeConverter{   
  13. public SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");   
  14.     //转换成对象   
  15.     public Object convertFromString(Map context, String[] value, Class toType) {   
  16.         User user=new User();   
  17.         String para[]=value;   
  18.         String name=para[0];   
  19.         String password=para[1];   
  20.         try {   
  21.             Date birth=sdf.parse(para[2]);   
  22.             user.setName(name);   
  23.             user.setPassword(password);   
  24.             user.setBirth(birth);   
  25.         } catch (ParseException e) {   
  26.             System.out.println("日期转换异常!");   
  27.             e.printStackTrace();   
  28.         }   
  29.         return user;   
  30.     }   
  31.   
  32.     //转换成字符串   
  33.     public String convertToString(Map arg0, Object o) {   
  34.         String result=null;   
  35.         if(o instanceof User){   
  36.             User user=new User();   
  37.             result="<"+user.getName()+","+user.getPassword()+","+user.getBirth().toString()+">";   
  38.         }   
  39.         return result;   
  40.     }   
  41.   
  42. }   

4、下面就可以来建立action类了

Code:
  1. package myclass.struts2.action;   
  2.   
  3. import myclass.struts2.form.User;   
  4.   
  5. import com.opensymphony.xwork2.ModelDriven;   
  6.   
  7. public class LoginAction{   
  8. public User user;   
  9. public String execute(){   
  10.     System.out.println("我进来了呢");   
  11.     System.out.println(user.getName());   
  12.     System.out.println(user.getPassword());   
  13.     System.out.println(user.getBirth());   
  14.     if("liping".equals(user.getName())&"123456".equals(user.getPassword())){   
  15.         return "succ";   
  16.     }else{   
  17.         return "fail";   
  18.     }   
  19. }   
  20. public User getUser() {   
  21.     return user;   
  22. }   
  23. public void setUser(User user) {   
  24.     this.user = user;   
  25. }   
  26. public User getBoss() {   
  27.     return boss;   
  28. }   
  29. public void setBoss(User boss) {   
  30.     this.boss = boss;   
  31. }   
  32.   
  33. }   

5、最后配置struts.xml文件如下:

Code:
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2.  <!DOCTYPE struts PUBLIC    
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">   
  5.     <struts>   
  6.     <constant name="struts.action.extension" value="lp" />   
  7.     <package name="login" namespace="/" extends="struts-default">   
  8.     <action name="login" class="myclass.struts2.action.LoginAction">     
  9.     <result name="succ">/succ.jsp</result>   
  10.     <result name="fail">/failure.jsp</result>   
  11.     </action>   
  12.     </package>   
  13.     <package name="logout" namespace="/" extends="struts-default">   
  14.     <action name="logout" class="myclass.struts2.action.LogoutAction">    
  15.     <result name="exit">/exit.jsp</result>   
  16.     </action>   
  17.     </package>   
  18.     </struts>  

到这里,这个转换器的实例就建立好了,不过,实际运行中,发现转换后的日期的月份始终是一月,而且两种转换的方法都有这个问题,我想这可能ognl的一个bug吧。

抱歉!评论已关闭.