OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
下面,我们来使用ognl来实现数据类型的转换,首先还是建立一个页面
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <html>
- <head>
- <title> 登录页面 </title>
- <link rel=stylesheet href="css/login.css" type="text/css">
- </head>
- <body>
- <h1 align="center">用户登录页面</h1>
- <hr>
- <div align="center">
- <form action="login.lp" method="post">
- <table cellspacing=5 border=5 bodercolor=#ffaa00 >
- <tr><th colspan="3" align="center" bgcolor=#ffaa00>用户登录</th></tr>
- <tr>
- <th rowspan="3" background="images/2.jpg" style="width=90px"></th>
- <td>用户名:</td><td><input type="text" class="message" name="user"></td></tr>
- <tr><td>密 码:</td><td><input class="message" type="password" name="user"></td></tr>
- <tr><td>日 期:</td><td><input class="message" type="text" name="user"></td></tr>
- <tr><td colspan="3" align="center"><input type="submit" value="登录"> <input type="reset" value="重置"></td></tr>
- </table>
- </form>
- </div>
- </body>
- </html>
2、写一个User的From类,用来封装表单传递过来的值,
- package myclass.struts2.form;
- import java.util.Date;
- public class User {
- public String name;
- public String password;
- public Date birth;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Date getBirth() {
- return birth;
- }
- public void setBirth(Date birth) {
- this.birth = birth;
- }
- }
3、接下来就要写一个转换的类UserFormTypeConverter,用于对象与字符等各种数据的转换,该类继承了DefaultTypeConverter我们需要重写其中的ConvertefromString和convertToString方法。即ConvertefromString是将客户端的数据转换成其他类型,convertToString是将服务器端的数据转换成在页面上要显示的内容
- //类型转换器
- public class UserFormTypeConverter extends DefaultTypeConverter{
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
- @Override
- public Object convertValue(Map<String, Object> context, Object value,
- Class toType) {
- System.out.println("conver");
- //转换成对象
- if(toType==User.class){
- User user= new User();
- String para[]=(String[])value;
- String name=para[0];
- String password=para[1];
- try {
- Date birth=sdf.parse(para[2]);
- user.setName(name);
- user.setPassword(password);
- user.setBirth(birth);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return user;
- }
- else if(toType==String.class){//从对象转换成字符串
- User user=(User)value;
- return "<"+user.getName()+","+user.getPassword()+","+user.getBirth().toString()+">";
- }
- //转换成字符串
- return null;
- }
- }
需要注意的是,局部使用时在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类再实现,这种方法在使用中很方便,通常建议使用这种方法,如下:
- package myclass.struts2.action;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Map;
- import myclass.struts2.form.User;
- import org.apache.struts2.util.StrutsTypeConverter;
- public class UserFormTypeConverter1 extends StrutsTypeConverter{
- public SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
- //转换成对象
- public Object convertFromString(Map context, String[] value, Class toType) {
- User user=new User();
- String para[]=value;
- String name=para[0];
- String password=para[1];
- try {
- Date birth=sdf.parse(para[2]);
- user.setName(name);
- user.setPassword(password);
- user.setBirth(birth);
- } catch (ParseException e) {
- System.out.println("日期转换异常!");
- e.printStackTrace();
- }
- return user;
- }
- //转换成字符串
- public String convertToString(Map arg0, Object o) {
- String result=null;
- if(o instanceof User){
- User user=new User();
- result="<"+user.getName()+","+user.getPassword()+","+user.getBirth().toString()+">";
- }
- return result;
- }
- }
4、下面就可以来建立action类了
- package myclass.struts2.action;
- import myclass.struts2.form.User;
- import com.opensymphony.xwork2.ModelDriven;
- public class LoginAction{
- public User user;
- public String execute(){
- System.out.println("我进来了呢");
- System.out.println(user.getName());
- System.out.println(user.getPassword());
- System.out.println(user.getBirth());
- if("liping".equals(user.getName())&"123456".equals(user.getPassword())){
- return "succ";
- }else{
- return "fail";
- }
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public User getBoss() {
- return boss;
- }
- public void setBoss(User boss) {
- this.boss = boss;
- }
- }
5、最后配置struts.xml文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.action.extension" value="lp" />
- <package name="login" namespace="/" extends="struts-default">
- <action name="login" class="myclass.struts2.action.LoginAction">
- <result name="succ">/succ.jsp</result>
- <result name="fail">/failure.jsp</result>
- </action>
- </package>
- <package name="logout" namespace="/" extends="struts-default">
- <action name="logout" class="myclass.struts2.action.LogoutAction">
- <result name="exit">/exit.jsp</result>
- </action>
- </package>
- </struts>
到这里,这个转换器的实例就建立好了,不过,实际运行中,发现转换后的日期的月份始终是一月,而且两种转换的方法都有这个问题,我想这可能ognl的一个bug吧。