Struts2框架支持動態方法調用(Dynamic Method Invocation,DMI),解決一個Action對應多個請求的處理,減小Action數量。可是動態方法調用會帶來安全隱患,經過URL能夠執行Action中的任意方法,這一點應該注意!css
動態方法調用有三種方法:html
同一個Action類中定義多個方法分別處理不同的請求,須要爲同一個Action類配置多個action節點。java
示例:apache
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="struts2" extends="struts-default" abstract="false"> <!-- 下面三個action節點的class屬性值都是cn.iborder.action.UserAction,其餘兩個屬性值不一樣action節點不同 --> <action name="logout" class="cn.iborder.action.UserAction" method="logout"> <result name="success">/login.jsp</result> </action> <action name="login" class="cn.iborder.action.UserAction" method="login"> <result name="success" type="redirect">/index.jsp</result> <result name="error" type="redirect">/error.jsp</result> </action> <action name="register" class="cn.iborder.action.UserAction" method="register"> <result name="success" type="redirect">/login.jsp</result> </action> </package> </struts>
在struts.xml文件中,設置constant元素的屬性struts.enable.DynamicMethodInvocation值爲true,開啓Struts2動態方法調用功能(感嘆號方式)。安全
經過在Action的名稱中使用感嘆號!來標識要調用的方法名稱,格式爲actionName!methodName.後綴。框架
示例:eclipse
User.javajsp
package cn.iborder.entity; public class User { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
UserAction.javapost
package cn.iborder.action; import com.opensymphony.xwork2.ActionSupport; import cn.iborder.entity.User; public class UserAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String login() { System.out.println("用戶:"+user.getUserName()); System.out.println("密碼:"+user.getPassword()); return "login"; } public String logout() { System.out.println("成功註銷"); return "logout"; } }
struts.xml測試
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- developerment Mode:開發模式,修改配置文件保存生效,不需重啓tmocat --> <constant name="struts.devMode" value="true" /> <!-- 開啓動態方法調用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> <package name="struts2" extends="struts-default" abstract="false"> <!-- 這個action節點的name屬性值不能是user(全小寫),不然報錯,緣由未知; 測試發現,Action類類名去掉「Action」剩下前面那部分(全小寫)不能是用做action節點的name屬性值。 前面使用的是myeclipse自帶的Struts2.1版本,後改爲2.3.31版本中沒有這個問題 --> <action name="User" class="cn.iborder.action.UserAction"> <result name="login" type="redirect" >/index.jsp</result> <result name="logout" type="redirect">/login.jsp</result> </action> </package> </struts>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <!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> <h1>登陸</h1> <form action="${pageContext.request.contextPath }/User!login.action" method="post"> 用戶<input type="text" name="user.userName" /><br/> 密碼<input type="password" name="user.password" /><br/> <input type="submit" value="提交"/> </form> </body> </html>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>hello world</h1> <a href="${pageContext.request.contextPath }/User!logout.action">註銷</a> </body> </html>
示例:
Student.java
package cn.iborder.entity; public class Student { private String stuName; private String password; public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
StuAction.java
package cn.iborder.action; import com.opensymphony.xwork2.ActionSupport; import cn.iborder.entity.Student; public class StuAction extends ActionSupport { private Student student; public Student getUser() { return student; } public void setUser(Student student) { this.student = student; } public String login() { System.out.println("用戶:"+student.getStuName()); System.out.println("密碼:"+student.getPassword()); return "login_success"; } public String logout() { System.out.println("成功註銷"); return "logout_success"; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- developerment Mode:開發模式,修改配置文件保存生效,不需重啓tmocat --> <constant name="struts.devMode" value="true" /> <package name="struts2" extends="struts-default" abstract="false"> <!-- action節點的name屬性值中的"*"表明通配符,能夠匹配任意最字符,method屬性值和第一個"*"的內容相同 例:jsp文件中的一個鏈接${pageContext.request.contextPath }/Stu_logout.action,其中Stu_logout.action 中的logout表明"*"匹配的字符此時method的屬性值也是logout --> <action name="Stu_*" class="cn.iborder.action.StuAction" method="{1}"> <result name="login_success" type="redirect" >/index.jsp</result> <result name="logout_success" type="redirect">/login.jsp</result> <result name="error" type="redirect">/error.jsp</result> </action> </package> </struts>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <!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> <h1>登陸</h1> <!-- 表示調用Action類中的login方法 --> <form action="${pageContext.request.contextPath }/Stu_login.action" method="post"> 用戶<input type="text" name="user.stuName" /><br/> 密碼<input type="password" name="user.password" /><br/> <input type="submit" value="提交"/> </form> </body> </html>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>hello world</h1> <!-- 表示調用Action類中的logout方法 --> <a href="${pageContext.request.contextPath }/Stu_logout.action">註銷</a> </body> </html>