Struts2开发--类型转换(一)

2014-11-24 07:11:42 · 作者: · 浏览: 0
一、Struts2 类型转换介绍

类型转换:解析HTTP请求参数,将Http请求参数赋值给Action的属性;比如:









此处将名为name、password、age的值赋值给Action的属性,类型转换是指这个赋值过程中可能出现的类型不一致问题而做出的转换,因为HTTP参数都是字符串类型的;因此从String类型的age参数传给int类型的age属性时,就需要类型转换,当然这些struts2框架已经做完了,开发人员不需要自行处理;
Struts2已经内建了对于String和基本类型的类型转换,比如String<-->int 、String<-->boolean等;
Action属性一定要有getter和setter方法!
Struts2提供了强大的类型转换支持,不仅提供了内置的类型转换器,还可以自定义类型转换器,以满足自定义需求;
Struts2类型转换是通过params拦截器进行转换;如果转换失败,则conversionError拦截器拦截该异常,并封装到fieldError中,放入ActionContext中;
Struts2类型转换还支持OGNL表达式,只需要在表单控件的name属性使用ognl表达式即可,比如表单控件的name属性为user.name,则此控件的数据将进入赋值给Action的user属性中的name属性;

二、通过一个例子初步了解Struts2类型转换


此处的类型转换因为是内建的,因此代码上和原来的struts2应用没有不同,struts2框架内部完成了所有了类型转换,以下程序是将name、age赋值给Action类的name、age属性,gender、salary赋值给p.gender、p.salary属性;struts.xml的配置和原来一样,所以就不给出了;

Conversion01Action.java


package org.conversion.action;

import org.person.Person;

import com.opensymphony.xwork2.ActionSupport;

public class Conversion01Action extends ActionSupport {

private String name;
private int age;
private Person p ;
public String execute()throws Exception{
System.out.println(name);
System.out.println(age);
System.out.println(p.getGender());
System.out.println(p.getSalary());
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}


}

1. jsp

此处需要注意的是性别、薪水的表单控件的name属性是OGNL表达式;

<%@ page language="java" contentType="text/ html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>




Insert title here













补充:List 和Map 的Action属性的类型转换问题

前面我们将的都是基本类型和自定义类型,因此这里我们将讲述集合类型的类型转换问题;
如果Action的属性为List类型,Listlists ,则表单控件的命名方式为lists[i] ,如lists[0]表示第1个元素;
如果Action的属性为Map类型,Map maps;则表单控件的命名方式为maps[ ' first ' ].salary ,表示map中key为'first'的value中的salary属性;

以上的list和map类型属性都通过泛型的方式说明集合元素的类型,如果在JDK1.5之前,泛型没有出现,则需要通过局部类型转换文件进行表示;
局部类型转换文件:对于特定Action的特定属性有效,位于特定Action同一目录下,命名规则:ActionName-conversion.properties;

对于List元素来说,内容如 :Element_attributeName=typeName;
对于Map元素来说,
(1)如果表示key的类型,则:Key_attributeName=typeName;
(2)如果表示value的类型,则为:Element_attributeName=typeName;


比如,此处没有使用泛型,而是使用了局部类型转换文件:

Conversion02Action.java

package org.conversion.action;

import java.util.List;
import java.util.Map;

import org.person.Person;

import com.opensymphony.xwork2.ActionSupport;

public class Conversion02Action extends ActionSupport {
private List lists;
private Map maps;
public String execute()throws Exception{
System.out.println(((Person)lists.get(0)).getGender());
System.out.println(((Person)lists.get(0)).getSalary());
System.out.println(((Person)maps.get("one")).getGender());
System.out.println(((Person)maps.get("one")).getSalary());
return SUCCESS;
}
public List getLists() {
return lists;
}
public void setLists(List lists) {
this.lists = lists;
}
pub