zoukankan      html  css  js  c++  java
  • Struts2类型转换(一)-类型转换概述,错误消息显示与定制

    一、类型转换概述

    1、 从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串。
      因为HTTP 没有 “类型” 的概念,每一项表单输入只可能是一个字符串或一个字符串数组。因此, 在服务器端, 必须把 String 转换为特定的数据类型。(详细讲述可参考《Struts2技术内幕-深入解析Struts2架构设计与实现原理》的第6章-“OGNL,数据流转的催化剂”中的6.1.1节-数据流转的困境)
    2、 在 struts2 中, 把请求参数映射到 action  属性的工作由 Parameters 拦截器负责, 它是默认的拦截器栈defaultStack中的一员。
    Parameters 拦截器可以自动完成字符串和基本数据类型之间转换

    二、类型转换出错时如何进行处理

    如果类型转换失败:
    –若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样。
    –若 Action 类实现 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用其 Action 方法, Struts 将检查相关 action 元素的声明是否包含着一个 name=input 的 result。 如果有, Struts 将把控制权转交给那个 result  元素;若没有 input 结果, Struts 将抛出一个异常。
    (注:一般Action通过继承ActionSupport类来间接的实现ValidationAware接口。) 

    三、类型转换错误消息的显示与定制

    当Action实现了ValidationAware接口时,若类型转换出错,则Struts会查找配置文件中定义的“name=input”的result,而
    作为默认的 defaultStack 拦截器栈的一员, ConversionError 拦截器负责添加与类型转换有关的出错消息(前提: Action 类必须实现了 ValidationAware 接口)和保存各请求参数的原始值,以便
    在页面上显示错误提示消息和回显表单(只有在Struts2的非simple主题下才会自动显示错误消息)。
     
    示例一:
    1)JSP页面主要代码如下:
    1 <s:debug></s:debug>
    2 
    3 <s:form action="testConversion">
    4     <s:textfield name="age" label="Age"></s:textfield>
    5     <br><br>
    6 <s:submit></s:submit>
    7 </s:form>

    2)Java主要代码如下:

     1 package com.atguigu.struts2.app;
     2 
     3 import com.opensymphony.xwork2.ActionSupport;
     4 
     5 public class ConversionAction extends ActionSupport{
     6 
     7     private int age;
     8     
     9     public int getAge() {
    10         return age;
    11     }
    12 
    13     public void setAge(int age) {
    14         this.age = age;
    15     }
    16 
    17     public String execute(){
    18         System.out.println("age: " + age);
    19         return "success";
    20     }
    21     
    22 }

    3)struts.xml基本配置如下:

    <package name="default" namespace="/" extends="struts-default">
        <action name="testConversion" class="com.atguigu.struts2.app.ConversionAction">
            <result>/success.jsp</result>
            <result name="input">/index.jsp</result>
        </action>        
     </package>

    将项目发布后运行,当我们输入非整数字符提交后的运行结果如下图:

     
    可以看到,在Struts2的非simple主题下,非法输入字段将导致一条有着以下格式的出错消息:Invalid field value for field "fieldName".
    针对以上结果提出如下问题

    问题1: 如何覆盖默认的错误消息?

    1). 在对应的 Action 类所在的包中新建ActionClassName.properties 属性文件, ActionClassName 即为包含着输入字段的 Action 类的类名
    2). 在属性文件中添加如下键值对: invalid.fieldvalue.fieldName=custom error message(注意:在这里只是写出了字段名,并没有写Action的名称,因为通过properties文件名已经可以定位到Action对象了。)

    示例二:

    为示例一添加属性文件:ConversionAction.properties,并在文件中提交键值对:invalid.fieldvalue.age=u9519u8BEFu7684u5E74u9F84u683Cu5F0F.(即“错误的年龄格式.”)

    运行结果如下图:


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

    修改主题为simple后,可以看到此时不能自动的显示错误消息,因此,我们可以通过下述方法来显示错误消息:

    1). 通过 debug 标签,可知若转换出错, 则在值栈的 Action(实现了 ValidationAware 接口) 对象中有一个 fieldErrors 属性
    该属性的类型为 Map<String, List<String>>(通过Debug标签中的fieldErrors属性格式初步判断其为数组类型或集合类型,之后可以在ActionSupport中的set/getFieldErrors方法中进一步验证其类型),其中键: 字段(属性名), 值: 错误消息组成的 List。 所以可以使用 EL 或 OGNL 的方式显示错误消息: ${fieldErrors.age[0]}

    2). 还可以使用 s:fielderror 标签来显示,可以通过 fieldName 属性显示指定字段的错误。

      示例三: 
      修改示例一中的JSP页面代码如下:
    1 <s:form action="testConversion" theme="simple">
    2     Age: <s:textfield name="age" label="Age"></s:textfield>
    3     ${fieldErrors.age[0]}
    4     <s:fielderror fieldName="age"></s:fielderror>
    5     <br><br>
    6     <s:submit></s:submit>
    7 </s:form>

      运行结果如下图:

      
      从运行结果可以看到,使用<s:fielderror>标签来显示错误提示信息时,其所产生的ul,li格式并不是我们想要的,那么如何修改以便定制出错消息的样式呢?

    问题3: 若是 simple 主题,且使用 <s:fielderror fieldName="age"></s:fielderror>标签来显示错误消息,则该消息在一个 ul, li, span 中。 如何去除 ul, li, span 呢 ?

    思路一:由于每一条出错消息都被打包在一个 HTML span 元素里, 可以通过覆盖其行标为 errorMessage 的那个 css 样式来改变出错消息的格式。但是这种方法不利于我们系统整体样式的维护。

    ★★★思路二:在 Struts2的template.simple包下面的 fielderror.ftl 文件里定义了 simple 主题下 s:fielderror 标签显示错误消息的样式,所以修改该配置文件即可。
    ★★★修改模板的方法:在 src 下新建 template.simple 包, 新建 fielderror.ftl 文件,把原生的 fielderror.ftl 中的内容复制到新建的 fielderror.ftl 中,然后剔除 ul, li, span 部分即可。

     
     
     
     
  • 相关阅读:
    Uniprot Accession的格式以及正则表达式
    python正则表达式统计字符串的个数
    apache开启图片缓存压缩
    mysql之备份表和备份数据库
    linux下lampp的启动和停止脚本
    linux下tomcat的启动,停止,重启脚本
    文件上传PHP
    Assembly测试
    List之Sort使用
    Ienumerable和Ienumerator的使用
  • 原文地址:https://www.cnblogs.com/KnightKitt/p/3919904.html
Copyright © 2011-2022 走看看