Struts2自定义类型转换


原理:
 struts2的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2已经为我们提供了几乎所有的primitive类型以及常用类型(如Date)的类型转换器,我们也可以为我们自定义类添加自定义类型转化器.
 struts2为我们提供了一个类型转化器的入口: ognl.DefaultTypeConverter,或继承org.apache.struts2.util.StrutsTypeConverter,由于StrutsTypeConverter提供了更好的封装,所以建议大家在写转换器时通常采用继承StrutsTypeConverter方式来实现.
 StrutsTypeConverter类实质上是DefaultTypeConverter的扩展

在jsp页面提交的都是string类型的

但是在action中,数据类型可以是各种类型

例如int,Date等等   对于这些,struts将会自动进行转化

当用户自定义一个类型时,需要进行自定义类型的转化

以下一个例子:

1.自定义类型  com.test.bean.Point.java

  package com.test.bean;

  public class Point {

//坐标

 private int x;
 private int y;
   //省略get,set方法,自己加上
 }

 

2.定义一个Action,使用到Point     com.test.action.PointAction.java

 package com.test.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;

public class PointAction extends ActionSupport {

 private Point point;
 private int age;
 private String username;
 private Date date;


 public String execute() throws Exception {
  return SUCCESS;//直接返回成功
 }

}

 

3.定义对应类型转化类  com.test.converter.PointConverter.java

   package com.test.converter;

import java.util.Map;

import com.test.bean.Point;

import ognl.DefaultTypeConverter;

public class PointConverter extends DefaultTypeConverter {

 
 public Object convertValue(Map context, Object value, Class toType) {
  //转化为point   从客户端到服务器端输入读取
  if(Point.class == toType)
  {
   Point point = new Point();
   String[] str = (String[])value;
   //point在输入时用逗号间隔,见input.jsp
   String[] xy = str[0].split(",");
   //转换
   int x = Integer.parseInt(xy[0]);
   int y = Integer.parseInt(xy[1]);
   
   point.setX(x);
   point.setY(y);
   
   return point;
  }
  //转化为String    从服务端到客户端输出显示
  if(String.class == toType)
  {
   Point point = (Point)value;
   
   int x = point.getX();
   int y = point.getY();
   
   String result="x="+x+"  y="+y;
   return result;
  }
  return null;
 }

}


 

4.在 该Action所在包下定义一个properties文件,以标示属性需转化

     properties文件名为      Action类名-conversion.properties

     以本例     PointAction-conversion.properties

     【注意拼写】

     其内容为   需转化属性=转化类

     本例       point=com.test.converter.PointConverter

     【只有一行】


5.配置对应的struts.xml  添加action

   <action name="pointCoverter" class="com.test.action.PointAction">
   <result name="success">/output.jsp</result>
   </action>

6.input.jsp【引入标签,以下只给出body】

   <body>
    <h3><font color="red">使用逗号将点的坐标隔开 </font></h3>

   <s:form action="pointCoverter">
    <s:textfield name="point" label="坐标"></s:textfield>
    <s:textfield name="age" label="年龄"></s:textfield>
    <s:textfield name="date" label="生日"></s:textfield>
    <s:textfield name="username" label="姓名"></s:textfield>
    <s:submit label="提交"></s:submit>
   </s:form>
  </body>

7.output.jsp  <%@ taglib prefix="s" uri="/struts-tags" %>

 坐标<s:property value="point"/><br>
 年龄:<s:property value="age"/><br>
姓名:<s:property value="username"/><br>
生日:<s:property value="date"/><br>

 

 

整体流程描述

   jsp页面-->struts.xml查找对应action-->

action在对属性point进行set前检测是否有action-conversiong.properties文件-->

有该文件,找到其对应转化类,调用convertValue的方法,根据输出需要类型自动转化-->

转化得到point对象,调用对应set方法-->

执行execute方法,返回SUCCESS-->

output.jsp显示时,有point属性,查找Action的properties文件,调用转化类的转换方法-->

优质内容筛选与推荐>>
1、使用VideoToolbox硬解码H.264
2、微信小程序商城社交+电商购物获取流量多样化更能提高拉新与转化
3、一次线上tomcat应用请求阻塞的排查经过
4、基于HTML5实现3D热图Heatmap应用
5、面试中问的话题Spring工作原理


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号