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}来分别的表示他们.
看下面的例子.
(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类
继承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
在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.属性名=出错信息
改写错误提示信息
全局信息
资源文件中加入:xwork.default.invalid.fieldvalue={0} 转换出错
属性信息
增加ActionName.properties文件
增加invalid.fieldvalue.属性名=出错信息