struts类型转换(二)自定义类型转换器

1 自定义类型转换器

         Struts2已经实现了常用的类型转换器,但是开发者自己定义数据类型,就必须使用自定义的类型转换器类来转换

1.1新建typeConversion.jsp,假设要转化的数据为person 的name,数据形式为:字符串;字符串。请在person input中输入如:id:name(分号间隔)的数据由类型转换器来进行转换。

<body>

    <form action="typeConvertor2.action">

    person:<input type="text" name="person" />

    submit:<input type="submit" value="提交"><br/>

</form>


1.2新建ConverterAction.java


package com.mycom.action;

import com.mycom.bean.Person;

import com.sun.net.httpserver.Authenticator.Success;

public class ConverterAction {

         private Person person;

         public Person getPerson() {

                   return person;

         }

         public void setPerson(Person person) {

                   this.person = person;

         }

         public String execute(){
                   return "success";

         }
} 

1.3 创建转换器类PersonConverter.java


package com.mycom.conversion;

import java.util.Map;

import java.util.StringTokenizer;

import javax.xml.registry.infomodel.User;

import com.mycom.bean.Person;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;


public class PersonConverter extends DefaultTypeConverter {

         @Override

         public Object convertValue(Map<String, Object> context, Object value, Class toType) {

                   if(Person.class == toType) { //从页面数据向后台转换

                            String[] str = (String[])value;

                            String valueString = str[0];

                            System.out.println(valueString);


                            String[] values = valueString.split(";");

                            String id = values[0];

                            String name = values[1];

       
                            Person person = new Person();

                            person.setId("id");

                            person.setName("name");


                            return person;


                   } else if(String.class == toType) { //从后台数据向页面转换

                            Person person  = (Person)value;

                            String str = person.getId()+person.getName()+"HelloWorld";

                            return str;

                   }

                   return super.convertValue(context, value, toType);

         }

 

}

1.4 注册自定义类型自定义类型转换器

         在对应的Action同目录定义actionName-conversion.propertiess属性文件,命名规则为:对应的Action的名-conversion.properties.故此处应命名ConverterAction-conversion.propertise

# syntax: <propertyName>=<converterClassName>

person =com.mycom.conversion.PersonConverter

1.5 在struts.xml中配置action

<action name="typeConvertor2"

class="com.mycom.action.ConverterAction">

           <result name="success">converterResult2.jsp</result>

           <result name="input">TypeConversion2.jsp</result>

        </action>

1.6 显示页面converterResult.jsp

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

............. <body> <s:property value="person"/> </body>
注意:

定义全局类型转化器

在上述中,如果要对多个action中对传过来的字符串转化成同一类型,难道要定义多个属性文件来配置,这里定义全局的转化器就可以了,例子:

注册局部类型转化器:属性=对应的转化器类

ConverterAction3-conversion.properties

person =com.mycom.conversion.PersonConverter


如要注册全局类型转化器:要进行转化的类=对应的局部类型转化器

xwork-conversion.properties

com.mycom.bean.Person =com.mycom.conversion.PersonConverter


 2 自定义数组类型转换器和集合类型转换器;

这里我们将展示如何来实现类似struts2内置的数组集合类型转换器的功能,这里示例将用户传过来的字符串数据转化成对应的数组类型和集合类型。

2.1用户请求文件typpeConvesion.jsp

<s:form action="typeConverter3" method="get">

   <s:textfield name="names" label="name1" ></s:textfield>

   <s:textfield name="names" label="name2" ></s:textfield>

   <s:textfield name="sports" label="sport1" ></s:textfield>

   <s:textfield name="sports" label="sport2" ></s:textfield>

   <s:textfield name="sports" label="sport3" ></s:textfield>

   <s:textfield name="sports" label="sport4" ></s:textfield>

   <s:submit value="提交"></s:submit>

</s:form>

2.2配置struts.xml文件的action,定义与处理结果对应的视图资源


<action name="typeConverter3" class="com.mycom.action.ConverterAction3" >

           <result name="success">converterResult3.jsp</result>

           <result name="input">TypeConversion3.jsp</result>

</action>

2.3相应的action处理类ConverterAction3.java


package com.mycom.action;

import java.util.ArrayList;

import java.util.List;

import com.mycom.bean.Name;
 
public class ConverterAction3 {

         private Name[] names;

         private List<String> sports = new ArrayList<String>();

         public Name[] getNames() {

                   return names;

         }

         public void setNames(Name[] names) {

                   this.names = names;

         }

         public List<String> getSports() {

                   return sports;

         }

         public void setSports(List<String> sports) {

                   this.sports = sports;

         }

         public String execute(){

                   return "success";

         }

}

2.4创建类型转化器NameConverter,ListConverter


package com.mycom.conversion;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.mycom.bean.Name;

public class NameConverter extends StrutsTypeConverter {

         @Override
         public Object convertFromString(Map context, String[] values, Class toClass) {

                   System.out.println("fromString invoke");

                   Name[] names = new Name[values.length];

                   for(int i=0;i<values.length;i++){

                            String[] pramaValues = values[i].split(" ");

                            String firstName = pramaValues[0];

                            String lastName = pramaValues[1];

                            /*names[i].setFirstName(firstName);

                            names[i].setLastName(lastName);

                            此时namess数组中的name均为null,直接调用set方法报nullPointException

                            正解:

                            */

                            Name nb = new Name();

                            nb.setFirstName(firstName);

                            nb.setLastName(lastName);

                            names[i] = nb;

                   }

                   System.out.println(names);

                   return names;

         }

         @Override

         public String convertToString(Map context, Object o) {

                   Name[] names = (Name[])o;

                   String str = "";

                   for(int i=0;i<names.length;i++){

                            str+="firstName:"+names[i].getFirstName()+" lastName:"+names[i].getLastName()+"||||";

                   }

                   System.out.println(str);

                   return str;

         }

}

ListConverter


package com.mycom.conversion;

 

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

public class ListConverter extends StrutsTypeConverter {

         @Override

         public Object convertFromString(Map context, String[] values, Class toClass) {
                
                   List<String> lists = new ArrayList<String>();                 

                   for(String str:values){

                            lists.add(str);

                   }                

                   return lists;

         }

         @Override

         public String convertToString(Map context, Object o) {
                
                   List<String> lists = (List<String>)o;
                 
                   StringBuffer paramString = new StringBuffer("sprots: ");

                   for(String str:lists){

                            paramString.append(str).append(",");

                   }

     
                   return paramString.toString();

         }

}
2.5在注册转换器ConverterAction3-conversion.properties,在对应的Action的同一目录下


names=com.mycom.conversion.NameConverter

sports=com.mycom.conversion.ListConverter

2.6输出结果ConverterResult3.jsp


<body>

    <s:property value="names"/><br/>

<s:property value="sports"/>

</body>

3类型转换的处理流程

用户请求提交请求数据>>>核心控制器>>>业务控制器action>>读取转换器注册文件properties文件或调用内建的转化器>>>调用注册文件对应的转换器返回自定义的类型转换器set到action的属性中

将结果返回给用户:业务控制器action>>>读取转换器注册文件properties文件或调用内建的转化器>>>调用注册文件对应的转换器返回字符串类,通过action的get把字符串数据方法返回返回给用户,显示在页面上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值