Struts2框架的自定义类型转换器

Posted 葉子。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2框架的自定义类型转换器相关的知识,希望对你有一定的参考价值。

  前言:对于java的基本数据类型及一些系统类(如Date类、集合类),Struts2提供了内置类型转换功能,但是也有一定的限制。所以就演示出自定义类型转换器

一、应用于局部类型转换器

  eg、用户登录出生日期只能用2016-06-09的方式才能转化成功,那么2016/06/09就不能转换成功所以就引出来我们的自定义类型转换器

  1首先我们将做准备工作

    1)login.jsp注册页面  

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>注册</title>
   

  </head>
  
  <body>
    <form action="adduseraction" method="post">
        用户名:<input type="text" name="user.name"/><br/>
        年龄:<input type="text" name="user.age"/><br/>
        出生日期<input type="text" name="user.birthday"/><br/>
            <input type="submit" value="提交"/>
    </form>
  </body>
</html>

  2)将准备成功页面success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>成功页面</title>
    
  </head>
  
  <body>
    <s:property value="user.birthday"/>
  </body>
</html>

  3)将准备实体类User

public class User {
    private String name;
    private String age;
    private Date birthday;
        //省略get和set
}    

  4)将准备一个Action类

package cn.happy.action;

import cn.happy.entity.User;

import com.opensymphony.xwork2.ActionSupport;

public class AddUserAction extends ActionSupport{
    private User user;
    
    @Override
    public String execute() throws Exception {
        System.out.println(user.getBirthday());
        return SUCCESS;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    
}

  5)将准备AddUserAction-conversion.properties这个名字前部分AddUserAction要和Action类名相同;由于是局部的所以Action要和AddUserAction-conversion.properties放在同一个目录

6)准备转换器

package cn.happy.converter;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.opensymphony.xwork2.conversion.TypeConversionException;

public class DateConverter extends StrutsTypeConverter {
    
    
    private final DateFormat[] dfs={
            new SimpleDateFormat("yyyy/MM/dd")
    };
    @Override
    public Object convertFromString(Map context, String[] values, Class toType) {
        String dateStr=values[0];//获取日期的字符串
        for (int i = 0; i < dfs.length; i++) {
            try {
                return dfs[i].parseObject(dateStr);
            } catch (ParseException e) {
                
                continue;
            }
        }
        //如果遍历完毕后仍没有转换成功,表明出现转换异常
        throw new TypeConversionException();
        
    }

    @Override
    public String convertToString(Map context, Object obj) {
        
        return new SimpleDateFormat("yyyy/MM/dd").format(obj);
    }

}

  7)准备一个adduseraction.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts >
     <constant name="struts.devMode" value="true" />
   
    <!--创建一个default包,继承自Struts2的struts-default包  -->
    <package name="default" namespace="" extends="struts-default">
    
        
        
        <action name="adduseraction" class="cn.happy.action.AddUserAction" >
        <!-- 通过param参数设置保存目录路径 -->
        
        <result name="success">/Convert/success.jsp</result>
        <result name="input">/Convert/login.jsp</result>
        </action>
        
        
        
    </package>

        
    
    

</struts>

  8)在struts.xml引用一个adduseraction.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts >    
    </package> -->
    <include file="adduseraction.xml"></include>
</struts>

二、全局自定义类型转换器

在以上步骤下改

AddUserAction-conversion.properties--->复制到src的目录下----->改名为xwork-conversion.properties--->在文件里

三、我们将在出生日期中如果出错的话我们要给予提示!!!

  1)在全局变量的情况下我们首先要在改变类型转换器添加

   new SimpleDateFormat("yyyy年MM月dd日")
package cn.happy.converter;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.opensymphony.xwork2.conversion.TypeConversionException;

public class DateConverter extends StrutsTypeConverter {
    
    
    private final DateFormat[] dfs={
            new SimpleDateFormat("yyyy/MM/dd"),
            new SimpleDateFormat("yyyy年MM月dd日")
    };
    @Override
    public Object convertFromString(Map context, String[] values, Class toType) {
        String dateStr=values[0];//获取日期的字符串
        for (int i = 0; i < dfs.length; i++) {
            try {
                return dfs[i].parseObject(dateStr);
            } catch (ParseException e) {
                
                continue;
            }
        }
        //如果遍历完毕后仍没有转换成功,表明出现转换异常
        throw new TypeConversionException();
        
    }

    @Override
    public String convertToString(Map context, Object obj) {
        
        return new SimpleDateFormat("yyyy/MM/dd").format(obj);
    }

}

 

  如果你页面输入错误会报一个错误就是字段无效。-----》如何给英文字段转换给中文

在strurts.xml中配置 <constant name="struts.custom.i18n.resources" value="message"/>是国际化

在配置一个message.properties在根目录src下

 

 这样页面报错的就会显示中文了

 

以上是关于Struts2框架的自定义类型转换器的主要内容,如果未能解决你的问题,请参考以下文章

Struts2框架之类型转换 --Struts2框架

类型转换

struts2中的类型转换,自定义类型转换器需要继承啥类

struts2_struts类型转换

自定义类型转换器

Struts2-学习笔记系列(13)-类型转换异常和校验器