`
longzijian
  • 浏览: 39372 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Struts2学习笔记(2)--类型转换

阅读更多

基本类型可以完成自动转换,主要转换对象类型,基于OGNL

分为:

----局部类型转换

                1.自定义转换类继承DeaultTypeConverter                                   

                  重写convertValue(Map context, Object value, Class toType)

                  Xxx.class == toType (或用equals())  String --> Object

                  String.class == toTtpe              Object --> String

                2.或继承StrutsTypeConverter

                  重写

                     Object convertFromString(Map context,String[] values,Class toClass)

                     String convertToString(Map context, Object o)

                3.配置文件:

                   Action类名-conversion.properties  需要和对应Action在同一目录下

                   内容:

                      属性名=转换类名         (多个属性就写多行)

----全局类型转换

                1.  2.  同局部转换

                3.配置文件:

                   xwork-conversion.properties(固定的)

                   内容:

                      需要类型转换的Action的全称类名=转换类名

【局部类型转换】
=======================================
1. input.jsp

<h1>用逗号将点的两个坐标分割开</h1>    如:20,30

<s:form action="pointConverter">
 <s:textfield name="point" label="点" />
 <s:textfield name="age" label="年龄" />
 <s:textfield name="username" label="用户名" />
 <s:textfield name="date" label="生日" />

 <s:submit label="提交" />
</s:form>


对于一个属性来说,先进行类型转化,转化成功了再进行输入验证


=======================================
2.建立 模型类

.....test.bean 包

public class Point {

 private int x;
 private int y;
 //setter...getter...方法
}


=======================================
3.简要说明

用于实现转换的TypeCenverter接口:
主要使用DefaultTypeCenverter类


重写convertValue()方法

public Object convertValue(Map context, Object value, Class toType)

 

 


=======================================
4.建立自定义转换类

建立....test.converter包
建立 转换类
需要继承DeaultTypeConverter,DeaultTypeConverter实现了TypeConverter转换接口
public class PointConverter extends DeaultTypeConverter {

 @Override
 public Object convertValue(
  Map context, //上下文
  Object value, //要转换的值(String数组)
  Class toType  //目标类型(转换成什么)
 ) {  
  //如果要转换的类型是Point
  if( Point.class == toType ) {
   Point point = new Point();
   String[] str = (String[])value;
   
   //此处数组只有一个值,在0的位置上
   String[] paramValues = str[0].split(",");

   int x = Integer.parseInt(paramValues[0]);
   int y = Integer.parseInt(paramValues[1]);

   point.setX(x);
   point.setY(y);

   return point;

  }

  //如果要转换的类型为String (也可以用系统自动转换)
  if( String.class == toType ) {
  
   Point point = (Point)value;
   int x = point.getX();
   int y = poitn.getY();
   String result = "[x=" + x + " , y=" + y + "]";

   return result;
  }

  return null;

 }


:为什么value是数组,因为页面的字段可以有同样的名字,如:
        <s:textfield name="username" />
        <s:textfield name="username" />
        这样的话,获得username时就应该是多个,所以是字符串数组

 

=======================================
5.建立action

public class PointAction extends ActionSupport {
 private Point point;
 private int age;
 private String username;
 private Date date;

 //setter...getter...

 @Override
 public String execute() throws Execption {

  return SUCCESS;
 }
}

--------------------
补充:
Action接口中:
Field Summary  字段摘要

ERROR  执行失败
INPUT  验证没有成功
LOGIN   没有执行成功,因为没有登陆
NONE   执行成功,但不相识任何题图
SUCCESS 执行成功


=======================================
6. struts.xml

<package name="struts2" extends="struts-default">
 <action name="pointConverter" class="com.test.action.PointAction">
  <!-- 对应execute()中的SUCCESS,SUCCESS的值是success -->
  <result name="success">/output.jsp</result>
 </action>
</package>


=======================================
7.output.jsp

<%@ taglib prefix="s" uri="/strurs-tags" %>

property标签自动调用value对应的字段的get方法,value="point"和getPoint()方法匹配
point: <s:property value="point"/><br/>
age:<s:property value="age"/><br/>
username:<s:property value="username"/><br/>
date:<s:property value="date"/><br/>
${point }<br/>
${point.x }<br/>
${point.y }  

 


=======================================
8.定义属性文件--用于指定转换类

该文件必须和对应的转换类在同一个包下

PointAction-conversion.properties

PointAction: 对应哪个Action中的属性进行转换
-conversion.properties: 是固定不变的

PointAction-conversion.properties的内容

对那个属性进行转换=用那个类对其进行转换,多个属性就写多行
point=com....converter.PointConverter


【完成】

=======================================
整体流程

1.提交请求->到struts.xml中去找对应的action,这里是pointConverter,找到之后,知道了有指定的类(PointAction)来处理请求

2.生成PointAction的实例,到PointAction中,把请求中的值调用set方法赋给该类的每个属性

3.当调用set方法前,首先检查,对于这个属性有没有自定义的类型转换,没有的时候就按照系统的行为进行默认的转换;
  如果发现已经定义好了类型转换(检查PiontAction的目录下有没有PointAction-onversion.properties存在),然后到该.properties文件里找,你到底要通过哪个类转换哪一个属性。

4.到相应的转换类中,这里是PointConverter,然后判断转换的方向,
Poitn.class==toType:通过字符串数组 转换到 Point对象,进入到相应的if流程
return后,流程回到PointAction中的setPoint方法,然后使用转换后的对象赋值给属性

5.将所有的属性赋值成功后,执行execute方法,然后通过返回值找到struts.xml中的action中的result对应的页面(output.jsp),显示结果。

6.然后发现<s:property>,每找到value,就到PointAction中调用相应的get方法,查找该字段有没有配置自动转换类,对于没有字段,应用系统默认的转换后直接返回。对于配置的,流程同上,到PointConverter中执行对应的if流程(String.class==toType),return后回到PointAction中的get方法返回其转换后的值,显示到页面。

 

 

【全局类型转换】
=======================================

需求:3个点的坐标

=======================================
多个属性的局部类型转换

input.jsp中
添加两个点的坐标
<s:textfield name="point2" label="点2" />
<s:textfield name="point3" label="点3" />

PointAction中
添加两个点字段
private Point point2;
private Point point3;
//setter...getter...


PointAction-conversion.properties中
添加
point2=com........converter.PointConverter
point3=com........converter.PointConverter


result.jsp中
添加
点2:<s:property value="point2" /><br/>
点3:<s:property value="point3" /><br/>

 

=======================================

需求:要转换的对象分布在多个action里面,上面的方式比较麻烦

应使用全局的类型转换:对系统里所有满足要求的进行转换

=======================================
配置文件:

配置文件名:xwork-conversion.properties(固定的)
应在classes目录下,也就是struts.xml相同的目录
放在src下就可以了

内容:

要转化那个类的全称类名=使用哪个类进行转换

com.scorpio.jh.struts2.test.bean.Point=com.scorpio.jh.struts2.test.converter.PointConverter

用PointConverter类对系统中所有的需要转换的类进行转换

 


=======================================

通过继承util包下的StrutsTypeConverter类进行转换

=======================================
1. 建立一个新的转换类,继承StrutsTypeConverter

public class PointConverter2 extends StrutsTypeConverter {

 //从String转换到目标对象
 @Override
 public Object convertFromString(
  Map context,
  String[] values,
  Class toClass) {

  Point point = new Point();
  String[] paramValues = values[0].split(",");
  int x = Integer.parseInt(paramValues[0]);
  int y = Integer.parseInt(paramValues[1]);
  
  point.setX(x);
  point.setY(y);
 
  return point;
 }

 //从对象转换到String
 @Override
 public String convertToString( Map context, Object o ) {
 
  Point point = (Point)o;
  int x = point.getX();
  int y = point.getY();
 
  String result = "[x=" + x + ", y=" + "]";

  return result;
 }

}

=======================================
2.修改配置文件 xwork-conversion.properties

com.scorpio.jh.struts2.test.bean.Point=com.scorpio.jh.struts2.test.converter.PointConverter2


【完成】

 

拓展:
=======================================

需求:Action中用一个集合类型,存储Piont对象

=======================================
1.action类

public class PointAction extends ActionSupport {

 private List<Piont> point;
 private int age;
 private String username;
 private Date date;

 //setter...getter...

 public String execute() throws Exception { ... }
 
}

 

=======================================
2.input.jsp

<s:form action="pointConverter">
 <s:textfield name="point" label="点1" /> name相同,会返回一个数组
 <s:textfield name="point" label="点2" />
 <s:textfield name="point" label="点3" />
 <s:textfield name="age" label="年龄" />
 <s:textfield name="username" label="用户名" />
 <s:textfield name="date" label="生日" />

 <s:submit label="提交" />
</s:form>


=======================================
3. result.jsp

point: <s:property value="point"/><br/>
age:<s:property value="age"/><br/>
username:<s:property value="username"/><br/>
date:<s:property value="date"/><br/>

 

=======================================
4.转换类 PointConverter3

public class PointConverter3 extends StrutsTypeConverter {

 //从String到对象
 @Override
 public Object convertFromString(
  Map context,
  String[] values,
  Class toClass) {

  List<Point> list = new ArrayList<Point>();

  for( String value : values ) {
   Point point = new Point();
   String[] paramValues = value.split.split(",");
   int x = Integer.parseInt(paramValues[0]);
   int y = Integer.parseInt(paramValues[1]);

   point.setX(x);
   point.setY(y);

   list.add(point);   
  }
  return list;
 }

 //从对象到String
 @Override
 public String convertToString( Map context, Object o ) {
 
  List<Point> list = (List<Point>)o;
  
  //StringBuilder 非同步版本的StringBuffer
  StringBuilder sb = new StringBuilder();
  sb.append("[");
  int number = 0;
 
  for( Point point : list ) {
  
   ++number;
   int x = point.getX();
   int y = point.getY();

   sb.append(number).append(" x=").append(x).append(", y=").append(y).append(" ");
  }
  sb.append("]");
  return sb.toString();
 }

}

=======================================
5.采用局部转换

PointAction-conversion.properties

point=com....converter.PointConverter3


【完成】

=======================================
注:

如果需要转换的字段没有使用泛型 List<Point>

则要在局部类型转换中加入 Element_ 头 + 你要转换的东西

但是建议使用泛型

 

=======================================
补充:

 可以用 属性名.属性的值 这样一种方式赋值

<s:form action="pointConverter">
 <s:textfield name="point.x" label="x坐标" /> *********
 <s:textfield name="point.y" label="y坐标" /> *********

 <s:textfield name="age" label="年龄" />
 <s:textfield name="username" label="用户名" />
 <s:textfield name="date" label="生日" />

 <s:submit label="提交" />
</s:form>


------------------------
public class PointAction extends ActionSupport {

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

 //setter...getter...

 public String execute() throws Exception { ... }
 
}

------------------------
将全局和局部类型转换注释掉 用#号

------------------------
重写Point的toString()
pubic String toString() {
 return "[x=" + x + ", y=" + y + "]";
}

【完成】

 

补充2:

=======================================
更改jsp默认的字符集


菜单window->Preferences->MyEclipse->FIles and Editors->JSP
从Encoding中选择需要的 比如UTF-8

=======================================

要在eclipse中显示struts2的源代码,需要和源代码进行链接,

连接到:struts-2.0.11\src\core\src\main\java\ 就可以了

分享到:
评论

相关推荐

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2学习笔记(完美总结)——转自OPEN经验库

    在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...

    struts2学习笔记

    **二.Struts2类型转换** Struts2支持自动类型转换,它可以将HTTP请求参数自动转换为Action类中相应字段的类型。例如,如果请求参数为字符串,而Action字段为整型,Struts2会尝试将字符串转换为整型。 **三.Struts...

    struts2学习笔记四(第4讲.Struts2的类型转换续)

    在"Struts2学习笔记四(第4讲.Struts2的类型转换续)"中,我们将会深入探讨Struts2中的类型转换机制,这是一个核心特性,用于处理Action类属性与HTTP请求参数之间的数据类型转换。 在HTTP请求中,数据通常是字符串...

    Struts2学习笔记

    ### Struts2学习笔记知识点梳理 #### 一、Struts2框架概述 - **背景**:Struts2作为Struts1的升级版本,融合了WebWork框架的优点,由Apache基金会维护,是一个开源、免费的MVC框架。尽管随着时间的推移,Spring MVC...

    struts2学习笔记!

    ### Struts2学习笔记 #### 一、Struts2配置文件详解 在深入理解Struts2框架之前,我们首先需要了解其核心配置文件——`struts.xml`。 **1. struts.xml配置** ```xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!...

    Struts2学习笔记2012

    ### Struts2学习笔记2012 #### 一、建立一个Struts2工程 **步骤详解:** 1. **创建Web项目:** - 在MyEclipse中选择“File” &gt; “New” &gt; “Dynamic Web Project”,创建一个新的Web项目。 2. **解压并配置...

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    struts2课程笔记

    本课程笔记主要涵盖了Struts2的基础概念、核心功能及其工作流程。 首先,Struts2的处理流程是通过一系列的组件协作完成的,包括Filter Dispatcher(过滤器调度器)、Action、Interceptor(拦截器)和Result。当用户...

    传智播客struts2全程学习笔记

    ### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...

Global site tag (gtag.js) - Google Analytics