• 类型转换


    struts2的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2已经为我们提供了几乎所有的primitive类型以及常用类型(如Date)的类型转换器,我们也可以为我们自定义类添加自定义类型转化器.

    下面来看一下自定义类型转换

    先定义实体类

    复制代码
    package entity;
    
    import java.util.Date;
    
    public class User {
        private String name;//姓名
        private Integer age;//年龄
        private Date birthday;//出生日期
        public String getName() {
            return name;
        }
        public Integer getAge() {
            return age;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        
        
    }
    复制代码

    接下来我们创建一个AddUserAction

    复制代码
    package action;
    
    
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import entity.User;
    
    
    
    public class AddUserAction extends ActionSupport  {
        //调用实体类
        private User user;
        public String execute() throws Exception{
            //在此我们就用出生日期来实现一下
            System.out.println(user.getBirthday());
            return SUCCESS;
            
        }
    
    
        public User getUser() {
            return user;
        }
    
    
        public void setUser(User user) {
            this.user = user;
        }
        
    
    }
    复制代码

    接下来我们创建出自己的类型转换器

    复制代码
    package converter;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Map;
    
    import org.apache.struts2.util.StrutsTypeConverter;
    
    import com.opensymphony.xwork2.conversion.TypeConversionException;
    
    public class Dateconverter extends StrutsTypeConverter{
           //将前台获取到的值转换成Date类型
           private final DateFormat[] dfs={
                   new SimpleDateFormat("yyyy/MM/dd"),
                   new SimpleDateFormat("yyyy年MM月dd日"),
                   new SimpleDateFormat("yyyy-MM-dd"),
                   new SimpleDateFormat("yyyy.MM.dd"),
                   new SimpleDateFormat("yyyyMMdd"),
                   new SimpleDateFormat("MM/dd/yyyy"),
           };
    
        
        /**
         * String类转换成特定的类
         * 用于前台传值到后台
         */
        @Override                //context里的map对象     前台创来的值                
        public Object convertFromString(Map context, String[] values, Class toType) {
            String value=(String)values[0];
            for (int i = 0; i < dfs.length; i++) {
                try {
                    return dfs[i].parse(value);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    continue;
                }
            }
            throw new TypeConversionException();
        }
        /**
         * 前台取值
         * 
         */
        @Override
        public String convertToString(Map context, Object obj) {
            
            
            return new SimpleDateFormat("yyyy-MM-dd").format(obj);
        }
    
    }
    复制代码

     创建AddUserAction-conversion.properties关联关系

    当我们用到user.birthday属性时会自动调用converter.Dateconverter.java类型转换器

    接下来写配置adduser.xml文件

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <constant name="struts.devMode" value="true"></constant>
        <package name="default" namespace="/" extends="struts-default">
            <action name="AddUser" class="action.AddUserAction">
                <result name="success">/success.jsp</result>
            </action>
        </package>
        
    </struts>
    复制代码

    接下来配置struts.xml文件并引用adduser.xml文件

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    <constant name="struts.ui.theme" value="simple"></constant>
    <constant name="struts.devMode" value="false"></constant>
    <constant name="struts.enable.DynamicMethodInvoaction" value="true"></constant>
    <package name="main" namespace="/" extends="struts-default">
    
    </package>
    <include file="action/adduser.xml"></include>
    </struts>
    复制代码

    接下来编写输入与展示页面

    复制代码
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.jsp' starting page</title>
        
      </head>
      
      <body>
      <s:fielderror/>
       <form action="AddUser" method="post">
           姓名:<input type="text" name="user.name"/><br/>
           年龄:<input type="text" name="user.age"/><br/>
           出生日期:<input type="text" name="user.birthday"/><br/>
           <input type="submit" value="提交"/>
       </form>
      </body>
    </html>
    复制代码

    展示页面

    复制代码
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'success.jsp' starting page</title>
       
      </head>
      
      <body>
        <s:date name="user.birthday"  format="yyyy-MM-dd"/>
      </body>
    </html>
    复制代码

    效果展示

    补充

    分类

    struts2自定义类型转换从大的方面来讲分两种:

    u      局部类型转换

    u      全局类型转换

    局部类型转换又分为三种:

    ²       普通实体bean的自定义类型转换

    ²       基于领域模型的自定义类型转换

    ²       基于模型驱动的自定义类型转换

    无论是全局类型转换还是局部类型转换,转换器与Action之间是用properties文件来关联的,properties文件指明了转换规则

           全局类型转换规则:

           在classpath下新建文件xwork-conversion.properties(固定名称)

           其内容为:目标转换对象=转换器类(包名+类名)

           局部类型转换规则:

           在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)

           其内容为: 目标转换对象=转换器类(包名+类名)

           在局部类型转换中又存在一种特殊情况

           基于领域模型的自定义类型转换

       它不但要在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)文件,还需在引用模型同级目录下建properties文件取名规则为引用名- conversion.properties

  • 相关阅读:
    Hoppz板子
    [cf] Invoking the Magic
    [acm]关于字符的处理
    [acm]排序总结
    [acm]循环队列(不是自己写queue)
    [acm]关于map的一些知识
    [acm]二进制枚举
    P1005 矩阵取数游戏 区间DP
    ICPC North Central NA Contest 2017 (部分)
    灾后重建 弗洛伊德最短路
  • 原文地址:https://www.cnblogs.com/superws/p/5960116.html
Copyright © 2020-2023  润新知