自定义类型转换器

Posted 南山南

tags:

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

这里只讲日期类型转换器的自定义

Struts2中有一些自定义类型转化器位置:

但是此处的日期类型转换器只是将yyyy-MM-dd日期格式转化成为Tue Jun 06 00:00:00 CST 2017

而对于产品来说可能涉及到yyyy/MM/dd和yyyyMMdd等,接下来就看例子吧!

首先定义表单界面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib uri="/struts-tags" prefix="s"%>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>My First Struts2 Project</title>
 9 </head>
10 <body>
11 
12 <!-- struts2的标签能够实现数据的回显,变返回那条数据出现了错误 -->
13 <s:form action="system/login1_login.action" method="post">
14     <s:textfield name="birthday" label="生日"/>
15     <s:textfield name="age" label="年龄"/>
16     <s:submit value="登录"></s:submit>
17 </s:form>
18 <!-- 
19 <form action="system/login1_login.action" method="post">
20         生日<input type="text" name="birthday"><br>
21         年龄<input type="text" name="age"><br>
22         <input type="submit" value="登录">
23 </form> -->
24 </body>
25 </html>

 

定义Action方法,这里用的是属性驱动进行的参数的请求和接收:

 1 package com.bjyinfu.struts.actions;
 2 
 3 import java.util.Date;
 4 
 5 import com.opensymphony.xwork2.ActionSupport;
 6 
 7 //当Action方法继承这个ActionSupport类的时候,若输入的值不符合规定会自动跳到视图结果为input的视图上
 8 //即在struts.xml中在定义一个<result name="input">/输入视图.jsp</result>
 9 //这样做是为了当数据出现失误的时候能够进行数据回显
10 
11 public class LoginAction1 extends ActionSupport{
12 
13     private Date birthday;
14     private int age;
15     
16 
17     public Date getBirthday() {
18         return birthday;
19     }
20 
21     public void setBirthday(Date birthday) {
22         this.birthday = birthday;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     public String login(){
34         System.out.println("执行了登录方法");
35         return "success";
36     }
37 }

将Action注册到Struts2中:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6 
 7     <package name="login" namespace="/system" extends="struts-default">
 8         <action name="login1_*" class="com.bjyinfu.struts.actions.LoginAction1" method="login">
 9             <result name="success">/welcome04.jsp</result>
10             <result name="input">/login1.jsp</result>
11         </action>    
12     </package>
13 </struts>

自定义日期类型转换器:

 1 package com.bjyinfu.typeConvertr;
 2 
 3 import java.text.ParseException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 import java.util.regex.Pattern;
 7 
 8 import com.opensymphony.xwork2.ActionContext;
 9 import com.opensymphony.xwork2.conversion.TypeConversionException;
10 import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
11 
12 public class MyTypeConverter extends DefaultTypeConverter {
13 
14     //在局部类型转换定义完后要进行注册,在Action类的同包下创建后缀为properties的文件
15     //文件命名格式:ActionClassName-conversion.properties
16     //ActionClassName是Action方法的类名,conversion.properties为固定写法
17 //    value:将要被转化的数据
18 //    toType:被转换成的目标类型
19 //    页面--->服务器端  String[]-->Date,为了兼顾复选框
20 //    服务器端-->页面  Date-->String
21     @Override
22     public Object convertValue(Object value, Class toType) {
23         
24         SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
25         try {
26             if(toType == Date.class){//实现从页面到服务器端的String-->Date
27                 String dateStr=((String[])value)[0];
28                 sdf=getSimpleDateFormat(dateStr);
29                 //把数据放到session中然后会显得时候再从session中去取
30                 ActionContext.getContext().getSession().put("sdf", sdf);
31                 /*if(!Pattern.matches("^\\\\d{4}/\\\\d{2}/\\\\d{2}", dateStr)){
32                     throw new TypeConversionException();
33                 }*/
34                 
35                 return sdf.parse(dateStr);
36             }else {//实现服务端到页面的转换 Date-->String
37                 Date date=(Date)value;
38                 sdf=(SimpleDateFormat)ActionContext.getContext().getSession().get("sdf");
39                 return sdf.format(date);
40             }
41             
42         } catch (ParseException e) {
43             
44             e.printStackTrace();
45         }
46         
47         return super.convertValue(value, toType);
48     }
49 
50     private SimpleDateFormat getSimpleDateFormat(String dateStr) {
51         SimpleDateFormat sdf=null;
52         if(Pattern.matches("^\\\\d{4}/\\\\d{2}/\\\\d{2}$", dateStr)){
53             sdf=new SimpleDateFormat("yyyy/MM/dd");
54         }else if(Pattern.matches("^\\\\d{4}-\\\\d{2}-\\\\d{2}$", dateStr)){
55             sdf=new SimpleDateFormat("yyyy-MM-dd");
56         }else if(Pattern.matches("^\\\\d{4}\\\\d{2}\\\\d{2}$", dateStr)){
57             sdf=new SimpleDateFormat("yyyyMMdd");
58         }else{
59             throw new TypeConversionException();
60         }
61         return sdf;
62     }
63 
64     
65 }

将自定义的类型转换器注册到struts2中:(在Action类的同包下创建后缀为properties的文件,文件名定义规范:ActionClassName-conversion.properties;其中ActionClassName对应的是Action的方法名,而-conversion.properties是固定的,将需要被转换的属性进行定义,值为自定义转换器的权限类名)

1 birthday = com.bjyinfu.typeConvertr.MyTypeConverter

Action执行完毕后展现的视图,即接收数据的页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3     <%@taglib uri="/struts-tags" prefix="s" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>My First Struts2 Project</title>
 9 </head>
10 <body>
11 <s:debug></s:debug><br>
12     birthday=<s:property value="birthday"/><br>
13     age=<s:property value="age"/><br>
14     <!-- 下面显示的日期是Tue Jun 06 00:00:00 CST 2017这种格式,上面显示的日期是输入的原值 -->
15     birthday=${birthday }<br>
16     age=${age }<br>
17 </body>
18 </html>

 

如果输入值不符合情况,会将数据进行回显,并且有跟随的回显错误内容,下面将回显内容进行自定义:

(在Action类的同包下创建后缀为properties的文件,文件名定义规范:ActionClassName.properties;

其中ActionClassName对应的是Action的方法名;用invalid.fieldvalue.带出错误属性,值为自定义)

1 invalid.fieldvalue.age=\\u5E74\\u9F84\\u5E94\\u8BE5\\u4E3A\\u6574\\u6570
2 invalid.fieldvalue.birthday=\\u65E5\\u671F\\u683C\\u5F0F\\u4E0D\\u6B63\\u786E

 注:一定要将这两个properties文件放到与对应的Action方法类相同包下,否则会找不到文件;

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

在片段中创建自定义列表视图时出错。必需的活动,找到的片段

vs code 自定义代码片段

在片段中创建自定义列表视图时出错所需活动,找到片段

VSCode创建自定义用户片段

springmvc:自定义类型转换器代码编写

在python 3.6中处理自定义编码时遇到类型错误