-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------java
1.类型转换概述web
1)从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串.apache
2)HTTP 没有 “类型” 的概念. 每一项表单输入只多是一个字符串或一个字符串数组. 在服务器端, 必须把 String 转换为特定的数据类型数组
3)在 struts2 中, 把请求参数映射到 action 属性的工做由 Parameters 拦截器负责, 它是默认的 defaultStack 拦截器中的一员. Parameters 拦截器能够自动完成字符串和基本数据类型之间转换.服务器
2.类型转换错误ide
若是类型转换失败:学习
- 若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生同样.url
- 若 Action 类实现 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用其 Action 方法: Struts 将检查相关 action 元素的声明是否包含着一个 name=input 的 result. 若是有, Struts 将把控制权转交给那个 result 元素; 若没有 input 结果, Struts 将抛出一个异常。spa
3.自定义错误覆盖debug
问题1:如何覆盖默认的错误消息?
1)在对应的 Action 类所在的包中新建 ActionClassName.properties 文件, ClassName 即为包含着输入字段的 Action 类的类名
2)在属性文件中添加以下键值对: invalid.fieldvalue.fieldName= 自定义内容 >> invalid.fieldvalue.age=\u9519\u8BEF\u7684\u5E74\u9F84\u683C\u5F0F
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 类
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 }