Struts2中使用ognl類型轉換器

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吧。

發佈了63 篇原創文章 · 獲贊 13 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章