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

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;
	}

	@Override
	public MPer getModel() {
		// TODO Auto-generated method stub
		return 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 {

	@Override
	public 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 {

	@Override
	public 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;
	}

	@Override
	public 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.属性名=出错信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值