首页 技术 正文
技术 2022年11月9日
0 收藏 653 点赞 3,209 浏览 5012 个字

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在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=\u9519\u8BEF\u7684\u5E74\u9F84\u683C\u5F0F

    

  

  <s:form action="testConversion" >
Age<s:textfield name="age" label="Age"></s:textfield>
<s:submit></s:submit>
</s:form>

   问题2: 如果是simple 主题,还会自动显示错误消息么?如果不会显示,那怎么办?

    1)通过debug 标签,可知若转化出错,则在值栈的Action(实现了 ValidationAware 接口)的对象中有一个fieldErrors 属性。该属性的类型为
      Map<String,List<String>> 的键值对。键 字段(属性名),值:错误消息做成的List。所以可以使用 el 或者 ognl 的方式来显示错误消息
       例如: ${filedErrors.age[0]}

 <s:form action="testConversion" theme="simple">
Age<s:textfield name="age" label="Age"></s:textfield>
<br><br>
${fieldErrors.age[0] }
<s:fielderror fieldName="age"></s:fielderror>
<s:submit></s:submit>
</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 中有两个抽象方法:

    [原创]java WEB学习笔记67:Struts2 学习之路– 类型转换概述, 类型转换错误修改,如何自定义类型转换器

[原创]java WEB学习笔记67:Struts2 学习之路– 类型转换概述, 类型转换错误修改,如何自定义类型转换器

  1)因为struts2不能自动的完成 字符串 到 引用类型 的转换

  2)如何定义类型转换器

    > 开发类型转换器:扩展StrutsTypeConverter 类   

 package com.jason.strut2.conversion; import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import javax.xml.crypto.Data; import org.apache.struts2.util.StrutsTypeConverter; import com.sun.jndi.url.dns.dnsURLContext; public class DateConverter extends StrutsTypeConverter { private DateFormat dateFormat; public DateConverter(){ System.out.println("DateConverter's constructor ... ");
dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); } @Override
public Object convertFromString(Map context, String[] values, Class toClass) { System.out.println("convertFromString ... ");
if(toClass == Data.class){
if(values != null && values.length > 0){
String value = values[0];
try {
return dateFormat.parseObject(value);
} catch (ParseException e) { e.printStackTrace();
}
}
}
//若没有转换成功,则返回values
return values;
} @Override
public String convertToString(Map context, Object o) {
System.out.println("convertToString ...");
if( o instanceof Date){
Date date = (Date) o;
return dateFormat.format(date);
}
//若转换失败,则返回null
return null;
} }

DateConverter extends StrutsTypeConverter

  > 配置类型转换器:

        ① 基于字段配置:第一次使用该转换器时创建实例

           >> 字段所在的Model(Action,可能是一个javabean) 的包下,新建一个ModelClassName-conversion.properties文件

           >>  在文件中输入键值对:fieldName = 类型转换器的全类名      

birth=com.jason.strut2.conversion.DateConverter

        ② 基于类型配置: 在当前web应用被加载的时候创建实例

            >> 在src 下新建xwork-conversion.properties

            >> 键入:待转换的类型=类型转换器的全类名

 java.util.Date=com.jason.strut2.conversion.DateConverter

web.xml 中配置的初始化参数

 <context-param>
<param-name>datePattern</param-name>
<param-value>yyyy-MM-dd hh:mm:ss</param-value>
</context-param>
DateConverter.java
 package com.jason.strut2.conversion; import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import javax.servlet.ServletContext;
import javax.xml.crypto.Data; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.StrutsTypeConverter; import com.opensymphony.xwork2.ActionContext;
import com.sun.jndi.url.dns.dnsURLContext; public class DateConverter extends StrutsTypeConverter { private DateFormat dateFormat; public void setDateFormat(DateFormat dateFormat) {
//获取当前web应用下的初始化参数 ServletContext servletContext = ServletActionContext.getServletContext();
String pattern = servletContext.getInitParameter("datePattern");
dateFormat = new SimpleDateFormat(pattern); } public DateFormat getDateFormat() {
return dateFormat;
} @Override
public Object convertFromString(Map context, String[] values, Class toClass) { System.out.println("convertFromString ... ");
if(toClass == Data.class){
if(values != null && values.length > 0){
String value = values[0];
try {
return getDateFormat().parseObject(value);
} catch (ParseException e) { e.printStackTrace();
}
}
}
//若没有转换成功,则返回values
return values;
} @Override
public String convertToString(Map context, Object o) {
System.out.println("convertToString ...");
if( o instanceof Date){
Date date = (Date) o;
return getDateFormat().format(date);
}
//若转换失败,则返回null
return null;
} }

      

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,031
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,860