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

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值