今天学习了一下struts2中的通配符映射机制和动态方法的调用。
1.我们为什么需要使用通配符映射机制呢?
一个Web应用下有很多的成百上千个action的声明。有很多的action的声明都是有相似之处的。那么我们就可以通过通配符映射机制来把多个彼此相似的映射关系简化为一个映射关系。
下面就通过一个简单的例子来具体的说明一下struts2的通配符映射机制。
index.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>首页</title>
</head>
<body>
<a href="/Struts2_3/method/MyUser-save">save</a><br><br>
<a href="/Struts2_3/method/MyUser-add">add</a><br><br>
<a href="/Struts2_3/method/MyUser-delete">delete</a><br><br>
<a href="/Struts2_3/method/MyUser-select">select</a><br><br>
</body>
</html>
add.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
ADD
</body>
</html>
Action类Myuser类:
package com.yd.action;
public class MyUser {
public String add(){
System.out.println("This is a method of add");
return "add";
}
public String delete(){
System.out.println("This is a method of delete");
return "delete";
}
public String save(){
System.out.println("This is a method of save");
return "save";
}
public String select(){
System.out.println("This is a method of select");
return "select";
}
}
struts.xml添加的配置如下:
<package name="happy" extends="struts-default" namespace="/method">
<action name="*-*" class="com.yd.action.{1}" method="{2}">
<result name="{2}">/{2}.jsp</result>
</action>
</package>
index.jsp运行截图:
结果显示截图:
从上面的例子可以很简单的看出来请求的uri为Myuser-add,那么根据配置class的值则为"com.yd.action.Myuser",method的值为"add",add()返回的值为add那么就跳转到add.jsp。同样如果点击其他链接映射关系也是一样的所以如上通配符映射机制很好的解决了相似映射关系的问题。
接下来总结一下通配符映射关系的规则:
①若找到多个匹配的结果则以精确匹配的为准。
②被通配符匹配到的uri的子字符串可以通过使用{1} ,{2}....来引用。{1}匹配第一个*通配符字符串,{2}匹配第二个*通配符字符串
③{0}配置整个uri字符串
④若找到带有通配符的匹配不知一个那么按照配置文件中的先后循序匹配,也就是先配置的先匹配到。
2.那么什么是动态方法的调用呢?
说简单一点就是在声明action的时候不明确定义调用Action类的哪个方法,而是在客户端发出请求的时候,动态的决定调用那个方法。因为struts2默认情况下是禁止使用动态方法调用的,所以在使用动态方法调用之前需要配置允许使用动态方法的调用。
struts.xml配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 打开动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="happy" extends="struts-default" namespace="/method">
<!-- 一般情况下不配置method 默认调用execute方法在struts-default中定义了
这样的配置还有一种可能就是动态方法调用
-->
<!-- <action name="dynamic" class="com.yd.action.MyUser">
<result name="add">/add.jsp</result>
</action> -->
</package>
</struts>
Action类还是之前的Myuser类,页面还是之前的add.jsp,index.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>首页</title>
</head>
<body>
<a href="/Struts2_3/method/dynamic!add.action">add</a><br><br>
</body>
</html>
如上面可以看出来我们可以通过在action请求的uri后面就上(!方法名)来动态调用Action类的方法。如上面代码的!add来动态的调用Myuser类的add方法。不过开发当中一般不这么使用,因为这样会暴露出我们代码调用的是哪个方法,安全性大打折扣。