zoukankan      html  css  js  c++  java
  • Struts2系列笔记(7)---Struts2类型转换

    Struts2类型转换     

           struts2中内置了大量的类型转换器用来完成数据类型转换的问题,这篇随笔主要通过两个方面来写Struts类型转换

           1:Struts2内置的类型转换器

           2:如何自定义类型转换器

          那么首先我们来学习有关Struts2内置的类型

             1:Struts2内置的类型转换器

    Struts2的内置类型转换器,可以为你处理大多数的类型转换,这包括了以下类型和String类型之间的转换!

    1.String

    将int,double,boolean,String类型的数组或java.util.Date类型转换成字符串。

    2:boolean和Boolean

    在字符串与boolean之间转换

    3:char/Character

    在字符串和字符之间转换

    4:int/Integer,float/Float,long/Long,double/Double 

    在字符串与数值类型之间进行转换 

    5:date

    在字符串和日期类型之间进行转换,默认格式是:YYYY-MM-DD

    6:数组

    由于数组本身就有类型,可以将多个同名参数,转换到数组中(在之前总结的兴趣爱好多选择,如果你选择多个,同时他们name属性相同就自动变为数组)

    7:集合

    支持将数据保存到 List 或者 Map 集合

    关于内置类型转换器举例:

     Action类

     1 import java.util.Date;
     2 import com.opensymphony.xwork2.ActionSupport;
     3 
     4 public class CustomerAction extends ActionSupport {
     5 
     6     private String username;
     7 
     8     private int age;
     9 
    10     private Date birthday;
    11 
    12     @Override
    13     public String execute() throws Exception {
    14         System.out.println("客户姓名是:" + username + ",年龄是:" + age + ",生日:" + birthday);
    15 
    16         return NONE;
    17     }
    18     public void setUsername(String username) {
    19         this.username = username;
    20     }
    21     public void setAge(int age) {
    22         this.age = age;
    23     }
    24     public void setBirthday(Date birthday) {
    25         this.birthday = birthday;
    26     }
    27 }
    28 /*控制台输出结果:客户姓名是:zhangsan,年龄是:12,生日:Tue Jul 09 00:00:00 CST 1996
    29 */

     jsp界面

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <html>
     3   <head>
     4   </head>
     5   <body>
     6     <form action="${pageContext.request.contextPath }/customer.action">
     7      客户姓名:<input type="text" name="username"><br/>
     8      年龄:<input type="text" name="age"><br/>
     9      生日:<input type="text" name="birthday"><br/>
    10      <input type="submit" value="提交">     
    11     </form>    
    12   </body>
    13 </html>

     界面输入:这里年龄只能输入合法年龄,日期的默认格式:yyyy-MM-dd,如果你输入不合规则网页会报错,比如你输入1996/7/9页面就会报错

         2:如何自定义类型转换器

           为什么需要自定义类型转换器,这个问题相信大家都知道,就像我上面所说的,日期的默认格式是yyyy-MM-dd,那如果你想输入yyyy/mm/dd或者其它的

    这个时候就需要你修改你自己的类型转换器,否则会报错。下面我写一个有关自定义类型转换器的方法: 继承StrutsTypeConverter

    DateConverter 
     1 import java.text.DateFormat;
     2 import java.text.ParseException;
     3 import java.text.SimpleDateFormat;
     4 import java.util.Date;
     5 import java.util.Map;
     6 
     7 import javax.xml.bind.TypeConstraintException;
     8 import org.apache.struts2.util.StrutsTypeConverter;
     9 
    10 public class DateConverter extends StrutsTypeConverter {
    11     //为方便支持多种日期格式的转换,可增加时间格式
    12     private final DateFormat [] dateformats={
    13             new SimpleDateFormat("yyyy-MM-dd"),
    14             new SimpleDateFormat("yyyy年MM月dd日"),
    15             new SimpleDateFormat("yyyy.MM.dd"),
    16             new SimpleDateFormat("yyyy/MM/dd")
    17     };
    18     /* 将一个或多个字符串值转换为指定的类型
    19      * 
    20      */
    21     @Override
    22     public Object convertFromString(Map arg0, String[] values, Class toType) {
    23         //从表单获取的日期字符串
    24         String dateStr = values[0];//思考:这里为什么是数组而不是字符串?我自己也没有搞明白,希望大神看到后宰评论区给予解答,谢谢
    25         for(int i = 0;i<dateformats.length;i++){//遍历日期类型进行转换
    26             
    27             try { //SimpleDateFormat类中parse()方法用于将输入的特定字符串转换成Date类的对象
    28                 return dateformats[i].parse(dateStr);
    29             } catch (Exception e) {
    30                 continue; //很关键
    31             }
    32         }
    33         throw new TypeConstraintException("遍历结束仍没有指定的类型转换");
    34     }
    35 
    36     /* 将指定对象转化为字符串
    37      * method:这个方法是用来回显用的,就是你需要回显成什么样的格式就可以设置什么样的格式
    38      */
    39     @Override
    40     public String convertToString(Map context, Object object) {
    41         Date date = (Date) object;
    42         //指定输出的格式
    43         return new SimpleDateFormat("yyyy年MM月dd日").format(date);
    44     }
    45 }
    46 /*主要讲这里的continue,就是如果你是输入的是1992-2-2,那么dateformats[0]和你直接匹配
    47  * 那么直接返回,当如果你开始输入的是1992/2/2那么就和dateformats[0]不匹配,那么出现异常执行
    48  * catch中的内容,而catch中是continue代表终止本次循环进入下一次循环,那么有和dateformats[1]
    49  * 进行匹配,如果都不匹配才会异常,所以这里用的太关键了
    50  *

     Aation(类)

     1 import java.util.Date;
     2 import com.opensymphony.xwork2.ActionSupport;
     3 
     4 public class RegisterAction1 extends ActionSupport {  
     5     private Date brithday1;
     6     private Date brithday2;
     7     private Date brithday3;
     8     private Date brithday4;
     9     /*
    10      * 为上面四个提供set和get方法
    11      */
    12 
    13     @Override
    14     public String execute() throws Exception {
    15         //获取表单的数据
    16        System.out.println("生日1"+brithday1);
    17        System.out.println("生日2"+brithday2);
    18        System.out.println("生日3"+brithday3);
    19        System.out.println("生日4"+brithday4);     
    20         return SUCCESS;
    21     }
    22 } 
    23 /*后台输出结果:
    24  * 生日1Sun Feb 02 00:00:00 CST 1992
    25  * 生日2Sun Feb 02 00:00:00 CST 1992
    26  * 生日3Sun Feb 02 00:00:00 CST 1992
    27  * 生日4Sun Feb 02 00:00:00 CST 1992 
    28  */

    register.jsp(登录界面)

     1 <html>
     2   <head>
     3     <title>注册</title>
     4   </head> 
     5   <body>
     6      <!-- 这里有四个生日 -->
     7      <form action="${pageContext.request.contextPath }/register1.action" method="post">
     8             生日1:<input type="text" name="brithday1"><br/><br/>
     9             生日2:<input type="text" name="brithday2"><br/><br/>
    10             生日3:<input type="text" name="brithday3"><br/><br/>
    11             生日4:<input type="text" name="brithday4"><br/><br/>
    12           <input type="submit" value="注册">
    13      </form>
    14   </body>
    15 </html>

    struts.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 <struts>
     6     <!-- 开发者模式 -->
     7     <constant name="struts.devMode" value="true"></constant>
     8     
     9     <package name="default"  extends="struts-default">    
    10         <action name="register1" class="com.guigu.struts2.action.RegisterAction1">
    11            <result>/result.jsp</result>
    12         </action>
    13     </package>
    14 </struts>
    result.jsp
     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="/struts-tags"  prefix="s"%>
     3 <html>
     4   <head>
     5   </head>
     6   <body>
     7   <!-- 回显的时候发现尽管前面输入格式不一样,但输出格式是一样的 -->
     8   生日1:<s:property value="brithday1"/><br/>
     9   生日2:<s:property value="brithday2"/><br/>
    10   生日3:<s:property value="brithday3"/><br/>
    11   生日4:<s:property value="brithday4"/><br/> 
    12   </body>
    13 </html>
    界面:

    最终返回界面

    注意:这中间还有很重要的东西需要配置配置转换器

    4、配置转换器
         Struts2提供了两种方式配置转换器
    方式一:应用于全局范围的类型转换器,在src目录下创建xwork-conversion.properties
         转换类全名=类型转换器类全名
        java.util.Date=com.sytudy.struts2.action.DateConverter  (前面是你需要转换的类型,后面是类型转换器类
    方式二:应用于特定类的类型转换器,在特定类的相同目录下创建一个名为ClassName-conversion.properties的属性文件
         特定Action类的属性名=类型转换器类全名  

      这篇文字就讲到这里,如果哪里有不足,欢迎大家指点,谢谢

  • 相关阅读:
    php下的jsonp使用实例
    jquery ajax jsonp跨域调用实例代码
    js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
    jsonp实现跨域访问
    jsonp调用实例
    Jsonp和java操作例子
    JSONP实例
    跨平台移动开发工具:PhoneGap与Titanium全方位比拼
    混合开发模式下主流移动开发平台分析
    企业移动信息化应用开发模式选型指南
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6407512.html
Copyright © 2011-2022 走看看