分类: 系统运维
2012-01-20 14:39:42
1 struts2对于8个原生数据类型以及Data,String等常见类型,struts2可以使用内建的类型转换器实现自动的转换;但对于自定义的对象来说,就需要我们自己指定类型转换的方式了。
2 对于自定义的类型转换来说,需要提供3个信息:Action的名字、Action中待转换的属性名以及该属性对应的类型转换器。其中Action的名字是通过属性文件名来获得的、Actoin中待转换的属性名是通过属性文件中的key来获得的,该属性对应的类型转换器是通过key所对应的value来获得的。
文件分布如图:
test.jsp
<%@ page contentType = "text/html" pageEncoding="gbk"%>
<html>
<body>
使用分号;隔开用户名和密码
<form action = "userAction.action">
user info :<input type = "text" name = "user"><br>
<input type = "submit" value = "submit">
form>
body>
html>
struts.xml
xml version="1.0" encoding="UTF-8"?>
DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"">
<struts>
<package name = "struts2" extends = "struts-default">
<action name = "login" class = "com.shengsiyuan.struts2.LoginAction">
<result name = "SUCCESS">/result.jsp result>
action>
<action name = "userAction" class = "com.shengsiyuan.struts2.UserAction">
<result name = "SUCCESS">/output.jspresult>
action>
package>
struts>
其中<action name = "userAction" class = com.shengsiyuan.struts2.UserAction">即当struts2.xml中的action发现name为userAction被请求时,原本会自动找到com.shengsiyuan.struts2.UserAction并实例化一个对象,并试图调用setUser()设置user属性。但此时发现有UserActoin-conversion.properties属性文件,而properties有很高的优先级,所以在实例化UserActoin对象前,先进入properties文件。
UserAction-conversion.properties
user=com.shengsiyuan.converter.UserConverter
左边user是待转换的对象,右边com.shengsiyuan.converter.UserConverter是类型转换器。即从这里找到UserConverter文件,执行转换操作。
注意:UserAction-conversion.properties的名字,其中左边UserAction必须与UserAction.java名字一致,右边的-conversion.properties为固定形式不可更改(这样struts.xml才会在找UserAction时提前找到UserAction-conversion.properties)。
UserConverter.java
package com.shengsiyuan.converter;
import java.util.Map;
import java.util.StringTokenizer;
import com.shengsiyuan.bean.User;
import ognl.DefaultTypeConverter;
public class UserConverter extends DefaultTypeConverter
{
@Override
public Object convertValue(Map context, Object value, Class toType)
{
//totype:转换到什么类型,转后的目标 类型是什么
if(User.class == toType) //equals也可以。即要往user转换,从页面向后台对象转换
{
//value:即文本框中输入的值
//将value转换成字符串(value是Object)
String[] str = (String[])value ;//一个name可能对应多个值,所以用字符串数组
String firstValue = str[0] ;
//将;两边的信息分别取出
StringTokenizer st = new StringTokenizer(firstValue,";") ;
String username = st.nextToken() ;
String password = st.nextToken() ;
//将其封装到User对象中
User user = new User() ;
user.setUsername(username) ;
// user.setUsername(password) ;
user.setPassword(password) ;
return user ;
}
else if(String.class == toType) //从后台对象转换到前台字符串页面
{
User user = (User)value ;
String username = user.getUsername() ;
String password = user.getPassword() ;
String userInfo = "username:"+username +"password:"+password ;
return userInfo ;
}
return null ;
}
}
转换器xxxConverter需要继承DefaultTypeConverter
执行完properties中的转换器UserConverter之后,就开始进入UserAction.java中
可以认为DefaultTypeConverter是通过HttpServletRequest的getParameterValues(name)方法来获取请求参数值的。因此它获取的请求参数总是字符串数组,如果请求参数只包含一个单个的值,则该请求参数的值是一个长度为1的字符串数组。
UserAction.java
package com.shengsiyuan.struts2;
import com.opensymphony.xwork2.ActionSupport;
import com.shengsiyuan.bean.User;
public class UserAction extends ActionSupport
{
private User user ;
public User getUser()
{
return user;
}
public void setUser(final User user)
{
this.user = user;
}
@Override
public String execute() throws Exception
{
System.out.println("username:"+user.getUsername());
System.out.println("password:"+user.getPassword());
return "SUCCESS" ;
}
}
一般的xxxAction类都需要继承ActionSupport
通过setter方法设置user属性,并执行execute()方法,return为”SUCCESS”。
“SUCCESS”被struts.xml捕捉到:
<action name = "userAction" class = "com.shengsiyuan.struts2.UserAction">
<result name = "SUCCESS">/output.jspresult>
action>
之后跳转到output.jsp之中。
output.jsp
<%@ page language="java" pageEncoding="gbk"%>
<%@taglib prefix = "s" uri = "/struts-tags" %>
<html>
<body>
<s:property value = "user"/>
body>
html>
其中使用了struts2标签库,所以在头文件中写入:
<%@taglib prefix = "s" uri = "/struts-tags" %>