Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335268
  • 博文数量: 96
  • 博客积分: 2041
  • 博客等级: 大尉
  • 技术积分: 1080
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-20 14:08
文章分类

全部博文(96)

文章存档

2015年(2)

2013年(1)

2012年(93)

分类: 系统运维

2012-01-20 14:39:42

struts2类型转换

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发现nameuserAction被请求时,原本会自动找到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转换成字符串(valueObject)

           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" %>

 

 

 

 

阅读(1145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~