坠落凡间的struts2(3)---struts2的类型转换

来源:互联网 发布:相片美化软件 编辑:程序博客网 时间:2024/04/27 16:57

struts2中的通配符

在struts2的配置文件中可以使用通配符,这样可以减化配置文件,但是降低了可读性
我们使用通配符那就必须有一个统一的约定.否则通配符将无法成立
看下面的例子.
(1)先看我们的action配置
 <package name="user" extends="struts-default" namespace="/">
  <action name="user_*" class="com.test.action.UserAction" method="{1}">
   <result>/user_{1}.jsp</result>
  </action>
 </package>
带红字的解释下,第一个带"*" 表示的是 后面匹配任意字符...这个很容易理解
{1}表示的是第一个"*"的内容...注意,这里的大括号,比如,如果是user_add .那么{1}就是表示 add ..
当然,这里只有一个"*".你可以有两个,甚至三个四个..比如这样写 *_* 这样就是两个"*" .那么我们也可以用{1},{2}来分别的表示他们.
对于这样的花东西我们可以不使用,但一定要知道。

struts2中的模型驱动

struts2分为模型驱动和属性驱动,一般我们使用的都是属性驱动
而模型驱动,一般开发中基本不用,但我们还是需要知道,至少是用法。
模型类:
package org.senssic.model;public class MPer {private String name;private int age;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;}}

action类需要实现ModelDriven接口
package org.senssic.action;import org.senssic.model.MPer;import com.opensymphony.xwork2.ModelDriven;public class MAction implements ModelDriven<MPer> {private final MPer mPer = new MPer();//即是这个地方是mPer在jsp中也是使用model.xxx获取模型类的属性的private String name;//如果存在action中覆盖model中的属性,在struts的stack中哪个在头先会被现实,一般是不能覆盖model中的属性显示的public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic MPer getModel() {// TODO Auto-generated method stubreturn mPer;}public String execute() throws Exception {mPer.setName("啦啦啦德玛西亚。");mPer.setAge(20);this.name = "aaaaaaaa";return "success";}}
jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>名字:${name}<br>年龄:${age}或者<br>名字:${model.name}<br>年龄:${model.age}<s:debug></s:debug></body></html>
注:如果存在action中覆盖model中的属性,在struts的stack中哪个在头先会被现实,一般是不能覆盖model中的属性显示的

action的异常处理

异常类:需要继承exception类
package org.senssic.exception;public class MyEeption extends Exception {private static final long serialVersionUID = 1L;public MyEeption(String msg) {super(msg);}}

action类:
package org.senssic.action;import org.senssic.exception.MyEeption;public class EAction {public String execute() throws Exception {int i = 5;if (i > 4) {throw new MyEeption("你的数字大于5啦啦啦");}return "success";}}

struts.xml中的配置:

struts2的类型转换器

有三种方式可以写转换器
实现TypeConverter接口
继承DefaultTypeConverter类
继承StrutsTypeConverter类
三种方式的原理是一样的,因为strutsTypeConverter是继承DefaultTypeConverter,而DefaultTypeConverter是实现TypeConverter接口的,
内部通过拦截器实现调用的,我们写转换器只需要实现public Object convertValue(Map<String, Object> context, Object value,Class toType) 方法
一般继承DefaultTypeConverter,但是使用StrutsTypeConverter更为方便,直接将上面的那个函数拆分成两个函数利于理解
转换文件的配置:
局部转换配置文件XXX-conversion.properties:
在Action类目录下放置ActionName-conversion.properties文件 。
在properties文件中的内容为:
Action属性名称=类型转换器的全类名
score=org.senssic.convertion.MConvertion

全局转换配置文件xwork-conversion.properties:
在WEB-INF/classes下放置xwork-conversion.properties文件 。
在properties文件中的内容为:
待转换的类型=类型转换器的全类名
org.senssic.type.Score=org.senssic.convertion.MConvertion

继承DefaultTypeConverter类

需要转换的类型:
package org.senssic.type;public class Liger {private String tiger;private String lion;private int day;public String getTiger() {return tiger;}public void setTiger(String tiger) {this.tiger = tiger;}public String getLion() {return lion;}public void setLion(String lion) {this.lion = lion;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}}

转换处理器:
package org.senssic.action;import java.util.Map;import org.senssic.type.Liger;import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;public class TypeConverter extends DefaultTypeConverter {@Overridepublic Object convertValue(Map<String, Object> context, Object value,Class toType) {// 转向String类型的if (toType == String.class) {Liger liger = (Liger) value;return liger.getTiger() + "-" + liger.getLion() + "-"+ liger.getDay();} else if (toType == Liger.class) {String[] param = ((String[]) value)[0].split("-");Liger liger = new Liger();liger.setTiger(param[0]);liger.setLion(param[1]);liger.setDay(Integer.parseInt(param[2]));                          return liger;}return super.convertValue(context, value, toType);}}

jsp页面输入数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><s:form action="/converter">  <s:textfield name="liger" ></s:textfield>  <s:submit value="提交"></s:submit></s:form><s:debug></s:debug></body></html>

jsp页面输出:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>${msg}<br>老虎的名字:${liger.tiger}<br>狮子的名字:${liger.lion}<br>他们在一起的时间:${liger.day}<s:debug></s:debug></body></html>

action处理类:

package org.senssic.action;import org.senssic.type.Liger;public class ConverterAction {private Liger liger;private String msg;public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Liger getLiger() {return liger;}public void setLiger(Liger liger) {this.liger = liger;}public String execute() throws Exception {this.msg = "狮虎兽是因为老虎和狮子呆在一起时间长了,产生的一种动物。需要条件,一个狮子,一个老虎,一个时间";/* * this.liger = new Liger(); liger.setTiger("小白虎"); * liger.setLion("小黑狮"); liger.setDay(3); */return "success";}}

局部转换器:


输入:


输出:


继承StrutsTypeConverter类

package org.senssic.converter;import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;import org.senssic.type.Liger;public class TypeConverter extends StrutsTypeConverter {@Overridepublic Object convertFromString(Map paramMap, String[] paramArrayOfString,Class paramClass) {String[] pStrings = paramArrayOfString[0].split("-");Liger liger = new Liger();liger.setTiger(pStrings[0]);liger.setLion(pStrings[1]);liger.setDay(Integer.parseInt(pStrings[2]));return liger;}@Overridepublic String convertToString(Map paramMap, Object paramObject) {Liger liger = (Liger) paramObject;return liger.getTiger() + "-" + liger.getLion() + "-" + liger.getDay();}}


测试结果同上,注意全局转换的写法:



注:
类型转换出错提示


改写错误提示信息
全局信息
资源文件中加入:xwork.default.invalid.fieldvalue={0} 转换出错
属性信息
增加ActionName.properties文件
增加invalid.fieldvalue.属性名=出错信息
原创粉丝点击