zoukankan      html  css  js  c++  java
  • 8.Struts2类型转换器

    类型转换器
    1、引入
    在Struts2中,请求参数类型不仅可以是String,还可以是其它类型。
    如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,
    则birthday接收到的不是字符串“1949-10-1”,而是日期类型。
    但,需注意的是,对于基本数据类型,需将其定义为包装类型。
    实例:请求参数值的类型-- typeconverter
    Step1:编写index.jsp与show.jsp
    Step2:编写Birthday_Action
    Step3:编写web.xml与struts.xml

    新建web项目工程源码文档目录如下:

     Birthday_Action.java源码如下:

    package actions;
    
    import java.util.Date;
    
    public class Birthday_Action {
        private Date birthday;
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        
        public String execute(){
            System.out.println("--------birthday------"+birthday);
            return "success";
        }
    }

     index.jsp源码如下:

    <%@ page pageEncoding="utf-8"%>
    
    <html>
      <head>
        
        <title>login.jsp</title>
    
      </head>
      
      <body>
      <form action="birthday.action">
    
               中华人名共和国的建国日期是:
                 <input type="text" name="birthday"/><br/>
                 <input type="submit" value="提交"/>
       </form>
      </body>
    </html>

     show.jsp源码如下:

    <%@ page pageEncoding="utf-8" isELIgnored="false"%>
    
    <html>
      <head>
        
        <title>show page</title>
    
      </head>
      
      <body>
          中国人民共和国的建国日期是:${birthday}
    
      </body>
    </html>

     web.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        
            <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
            </filter>
    
            <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
            </filter-mapping>
        
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     struts.xml配置如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <struts>
    
        <package name="one" extends="struts-default">
        
            <action name="birthday" class="actions.Birthday_Action">
                <result>/show.jsp</result>
            </action>
            
        </package>
    </struts>

     部署发布,启动tomcat,输入地址:

    http://127.0.0.1:8080/typeconverter/



    当在表单中填入1949-10-1时,提交,便可看到Sat Oct 01 00:00:00 CST 1949的显示结果。
    说明,Struts2将1949-10-1作为Date类型接收了。
    若在表单中填入的是19491001时,发现也可看到相应的结果,但,控制台报错:
    java.lang.NoSuchMethodException: actions.BirthdayAction.setBirthday([Ljava.lang.String;)
    错误信息指,没有发现形参为String类型的setBirthday方法。即,将19491001当作了String,而非Date
    输入地址:
    http://127.0.0.1:8080/typeconverter/

     


     


     

     那么,如何能够让Struts2将19491001当作Date类型?

    更一般化地讲,如何将某种非基本类型的请求参数值,让Struts2直接当作该非基本类型,而非当作String类型?
    此时就需要使用类型转换器。
    类型转换器
    自定义类型转换器类,是继承自com.opensymphony.
    xwork2.conversion.impl.DefaultTypeConverter类的。在使用时,一般需要覆盖其父类的方法
    public Object convertValue(
              Map<String, Object> context,   //OGNL表达式上下文
              Object value,   //待转换的值
              Class toType    //要转换为的类型
    )

     注意:定义convertValue方法时需要注意,其转换一般是定义为双向的。

    实例步骤:
    在上例中定义类型转换器类:
                              typeconverters.Date_String_Converter
              需要注意第二个参数value,若转换方向为从请求到action,则value为字符串数组。因为请求中是允许携带多个同名参数的,而这时的这个同名参数,其实就是数组。
    Struts2为了兼顾到这种多个同名参数的情况,就将从请求到action方向的转换的value指定为了String[],而非String。
    在定义好类型转换器后,需要注册该转换器,用于通知Struts2框架在遇到指定类型变量时,需调用类型转换器。

     具体解决方法:

    在原有代码基础上新建继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类的String_Date_Converter.java。

     

     

     String_Date_Converter.java完成源码如下:

    package typeconverters;
    
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    public class String_Date_Converter extends DefaultTypeConverter {
    
        @Override
        public Object convertValue(Map<String, Object> context, Object value,Class toType) {
            //MM代表两位数的月,不可以小写,小写mm就成了两位数的分
            SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
            try {
                if(toType==Date.class){
                    String[] params=(String[]) value;
                    //将字符串解析为日期类型
                    return sf.parseObject(params[0]);
                }else if(toType==String.class){
                    
                    //注意这里导入import java.util.Date;
                    Date date=(Date)value;
                    
                    //将日期类型格式化为指定格式的字符串
                    return sf.format(date);
                }
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        
    
    }
    根据注册方式的不同及其应用范围的不同,可以将类型转换器分为两类:
    1.局部类型转换器
    2.全局类型转换器
    局部类型转换器
    局部类型转换器,仅仅对指定Action的指定属性起作用。
    注册方式:
    在Action类所在的包下放置名称为如下格式的属性文件:
    ActionClassName-conversion.properties文件。
    其中ActionClassName是Action类名,-conversion.properties是固定写法。
    就本例而言,该注册文件的名称应为BirthdayAction-conversion.properties 。
    此文件的内容也遵循一种格式:
                               属性名称=类型转换器的全类名
                对于本例而言,文件中的内容为:
            birthday=typeconverters.Date_String_Converter
    注册方式:
    在actions包中新建属性文件BirthdayAction-conversion.properties。
    全局类型转换器
    全局类型转换器,会对所有Action的指定类型的属性生效。
    注册方式:
    在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。
    该文件的内容格式为:待转换的类型=类型转换器的全类名。
     
    局部类型转换器
    具体方法:
    在actions包中新建属性文件BirthdayAction-conversion.properties。
    局部类型转换器注册成功!

    重新部署发布,启动tomcat,输入地址:

    http://127.0.0.1:8080/typeconverter/


     

    注意:这时候1949-10-01提交就会错误,要想实现19491001和1949-10-01都可用,只需多定义几个转换器即可。

     全局类型转换器:

    注册方式:
    在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。
    该文件的内容格式为:待转换的类型=类型转换器的全类名。
     

     

     


    重新部署发布,启动tomcat,输入地址:

    http://127.0.0.1:8080/typeconverter/

  • 相关阅读:
    JS分页条插件
    C#Lambda
    常用CSS样式速查
    简易表格编辑器
    使用template
    js 时间类函数
    数据库表增删查改帮助类
    使用github
    box-shadow属性
    box-sizing属性
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/4008105.html
Copyright © 2011-2022 走看看