本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.类型转换概述
1)从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串.
2)HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服务器端, 必须把 String 转换为特定的数据类型
3)在 struts2 中, 把请求参数映射到 action 属性的工作由 Parameters 拦截器负责, 它是默认的 defaultStack 拦截器中的一员. Parameters 拦截器可以自动完成字符串和基本数据类型之间转换.
2.类型转换错误
如果类型转换失败:
- 若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样.
- 若 Action 类实现 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用其 Action 方法: Struts 将检查相关 action 元素的声明是否包含着一个 name=input 的 result. 如果有, Struts 将把控制权转交给那个 result 元素; 若没有 input 结果, Struts 将抛出一个异常。
3.自定义错误覆盖
问题1:如何覆盖默认的错误消息?
1)在对应的 Action 类所在的包中新建 ActionClassName.properties 文件, ClassName 即为包含着输入字段的 Action 类的类名
2)在属性文件中添加如下键值对: invalid.fieldvalue.fieldName= 自定义内容 >> invalid.fieldvalue.age=u9519u8BEFu7684u5E74u9F84u683Cu5F0F
1 <s:form action="testConversion" >
2 Age<s:textfield name="age" label="Age"></s:textfield>
3 <s:submit></s:submit>
4 </s:form>
问题2: 如果是simple 主题,还会自动显示错误消息么?如果不会显示,那怎么办?
1)通过debug 标签,可知若转化出错,则在值栈的Action(实现了 ValidationAware 接口)的对象中有一个fieldErrors 属性。该属性的类型为
Map<String,List<String>> 的键值对。键 字段(属性名),值:错误消息做成的List。所以可以使用 el 或者 ognl 的方式来显示错误消息
例如: ${filedErrors.age[0]}
1 <s:form action="testConversion" theme="simple">
2 Age<s:textfield name="age" label="Age"></s:textfield>
3 <br><br>
4 ${fieldErrors.age[0] }
5 <s:fielderror fieldName="age"></s:fielderror>
6 <s:submit></s:submit>
7 </s:form>
2)还可以使用 s:fielderror 标签来显示。可以通过fieldName 属性显示指定的字段的错误.z则消息在一个ul,li,span中。
在template.simple 下面的filederror.ftl 定义了simple主题下,s:fielderror 标签显示错误消息的格式。所以修改该配置文件即可。
在src 下新建template.simple 包,新建fielderror.ftl文件,
把原生的fielderror.ftl 中的内容复制到新建的fielderror.ftl 中。然后删除ul,li,span
4.如何自定义类型转换器
在大多数类型转换器里, 需要提供从 String 类型到非 String 类型和与此相反的转换功能。在 StrutsTypeConverter 中有两个抽象方法:
1)因为struts2不能自动的完成 字符串 到 引用类型 的转换
2)如何定义类型转换器
> 开发类型转换器:扩展StrutsTypeConverter 类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.jason.strut2.conversion; 2 3 import java.text.DateFormat; 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 import java.util.Map; 8 9 import javax.xml.crypto.Data; 10 11 import org.apache.struts2.util.StrutsTypeConverter; 12 13 import com.sun.jndi.url.dns.dnsURLContext; 14 15 public class DateConverter extends StrutsTypeConverter { 16 17 private DateFormat dateFormat; 18 19 public DateConverter(){ 20 21 System.out.println("DateConverter's constructor ... "); 22 dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); 23 24 } 25 26 @Override 27 public Object convertFromString(Map context, String[] values, Class toClass) { 28 29 System.out.println("convertFromString ... "); 30 if(toClass == Data.class){ 31 if(values != null && values.length > 0){ 32 String value = values[0]; 33 try { 34 return dateFormat.parseObject(value); 35 } catch (ParseException e) { 36 37 e.printStackTrace(); 38 } 39 } 40 } 41 //若没有转换成功,则返回values 42 return values; 43 } 44 45 @Override 46 public String convertToString(Map context, Object o) { 47 System.out.println("convertToString ..."); 48 if( o instanceof Date){ 49 Date date = (Date) o; 50 return dateFormat.format(date); 51 } 52 //若转换失败,则返回null 53 return null; 54 } 55 56 }
> 配置类型转换器:
① 基于字段配置:第一次使用该转换器时创建实例
>> 字段所在的Model(Action,可能是一个javabean) 的包下,新建一个ModelClassName-conversion.properties文件
>> 在文件中输入键值对:fieldName = 类型转换器的全类名
birth=com.jason.strut2.conversion.DateConverter
② 基于类型配置: 在当前web应用被加载的时候创建实例
>> 在src 下新建xwork-conversion.properties
>> 键入:待转换的类型=类型转换器的全类名
1 java.util.Date=com.jason.strut2.conversion.DateConverter
web.xml 中配置的初始化参数
1 <context-param>
2 <param-name>datePattern</param-name>
3 <param-value>yyyy-MM-dd hh:mm:ss</param-value>
4 </context-param>
5
DateConverter.java
1 package com.jason.strut2.conversion;
2
3 import java.text.DateFormat;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7 import java.util.Map;
8
9 import javax.servlet.ServletContext;
10 import javax.xml.crypto.Data;
11
12 import org.apache.struts2.ServletActionContext;
13 import org.apache.struts2.util.StrutsTypeConverter;
14
15 import com.opensymphony.xwork2.ActionContext;
16 import com.sun.jndi.url.dns.dnsURLContext;
17
18 public class DateConverter extends StrutsTypeConverter {
19
20 private DateFormat dateFormat;
21
22 public void setDateFormat(DateFormat dateFormat) {
23 //获取当前web应用下的初始化参数
24
25 ServletContext servletContext = ServletActionContext.getServletContext();
26 String pattern = servletContext.getInitParameter("datePattern");
27 dateFormat = new SimpleDateFormat(pattern);
28
29 }
30
31 public DateFormat getDateFormat() {
32 return dateFormat;
33 }
34
35 @Override
36 public Object convertFromString(Map context, String[] values, Class toClass) {
37
38 System.out.println("convertFromString ... ");
39 if(toClass == Data.class){
40 if(values != null && values.length > 0){
41 String value = values[0];
42 try {
43 return getDateFormat().parseObject(value);
44 } catch (ParseException e) {
45
46 e.printStackTrace();
47 }
48 }
49 }
50 //若没有转换成功,则返回values
51 return values;
52 }
53
54 @Override
55 public String convertToString(Map context, Object o) {
56 System.out.println("convertToString ...");
57 if( o instanceof Date){
58 Date date = (Date) o;
59 return getDateFormat().format(date);
60 }
61 //若转换失败,则返回null
62 return null;
63 }
64
65 }