Action配置----class
具体视图的返回可以由用户自己定义的Action来决定
具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容
具体Action的实现可以是一个普通的java类,里面有public String execute方法即可
或者实现Action接口
不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法
struct.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- Add packages here -->
<constant name="struts.devMode" value="true" />
<package name="front" extends="struts-default" namespace="/">
<action name="index" class="com.bjsxt.struts2.front.action.IndexAction3">
<result name="success">/ActionIntroduction.jsp</result>
<result name="succe">/Hello.jsp</result>
</action>
</package>
</struts>
<!-- Add packages here -->
<constant name="struts.devMode" value="true" />
<package name="front" extends="struts-default" namespace="/">
<action name="index" class="com.bjsxt.struts2.front.action.IndexAction3">
<result name="success">/ActionIntroduction.jsp</result>
<result name="succe">/Hello.jsp</result>
</action>
</package>
</struts>
action默认calss返回success,result默认name为success
所以action配置可以简化为<action name="index">
<result>/hello.jsp</result>
</action>
package com.bjsxt.struts2.front.action;
import com.opensymphony.xwork2.ActionSupport;
public class IndexAction3 extends ActionSupport {
@Override
public String execute() {
return "succe";
}
}
public String execute() {
return "succe";
}
}
action类实现的三种办法 自己创建类,添加返回字符串的excute()的方法,第二种实现Action接口实现excute()的方法最常用的是继承ActionSupport类,重写excute()方法,根据返回的字符串匹配到result name的参数,找到jsp文件进行返回
Action配置----method
Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法 也可以在url地址中动态指定(动态方法调用DMI)(推荐)
前者会产生太多的action,所以不推荐使用
Struts.xml文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" extends="struts-default" namespace="/user">
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
</struts>
<package name="user" extends="struts-default" namespace="/user">
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
</struts>
com.bjsxt.struts2.user.action.UserAction类中只有add方法,没有excute()方法 第一个action是直接指定调用第二种动态调用
http://localhost:8088/Struts2_0500_ActionMethod/user/user访问到user_add_success.jsp
在index.jsp定义连接
<a href="<%=context %>/user/userAdd">添加用户</a> method调用
<br />
<a href="<%=context %>/user/user!add">添加用户</a> 动态调用
<br />
注意:在myeclipse2017要动态调用方法,在struts.xml文件中一定要设置
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
注意:在myeclipse2017中拷贝一个项目,一定要设置web context root,在2017版本中的位置要看好
通配符的使用
使用通配符,将配置量降到最低
不过,一定要遵守"约定优于配置"的原则
<action name="Student*" class="xidianlili.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="xidianlili.struts2.action.{1}Action" method="{2}">
<result>/{1}{2}_success.jsp</result>
那么对应的acion类和jsp文件命名一定与通配符的路径名称一致
默认action
在struts.xml文件中配置<default-action-ref name="index"></default-action-ref>当url只到namespace下或者namespace后接没有对应的action name的地址,则返回default action的result
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
</struts>
result配置
name参数:默认是success,设置值的时候根据action类的返回结果找到对应名字的result的name,显示对应的jsp文件
type参数:默认是dispatcher,有如下几种类型
对应的index.jsp文件是:
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<% String context = request.getContextPath(); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
Result类型
<ol>
<li><a href="r/r1">dispatcher</a></li>
<li><a href="r/r2">redirect</a></li>
<li><a href="r/r3">chain</a></li>
<li><a href="r/r4">redirectAction</a></li>
<li>freemarker</li>
<li>httpheader</li>
<li>stream</li>
<li>velocity</li>
<li>xslt</li>
<li>plaintext</li>
<li>tiles</li>
</ol>
</body>
</html>
对应的struts.xml文件是:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
<result type="chain">r1</result>
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
</package>
</struts>
第一种dispatcher: 应用服务器跳转,forward到一个具体的jsp文件中,在index.jsp中dispatcher的连接是
<li><a href="r/r1">dispatcher</a></li> 找到/r/r1的action,默认返回success,forward到r1.jsp
点击连接,结果如下:这是服务器端跳转,显示的action的url
第二种是redirect:客户端跳转,在index.jsp中redirect的连接是
<li><a href="r/r2">redirect</a></li> 找到/r/r2的action,默认返回success,跳转到到r2.jsp
点击连接,结果如下:显示的是r2.jsp的url,这是客户端跳转
客户端发起请求,服务端是redirect,返回给客户端,客户端又重新发起请求,显示jsp的url
第三种是chain:用forward的凡是访问action。index.jsp文件的chain连接是<li><a href="r/r3">chain</a></li>
找到/r/r2的action,默认返回success,跳转r1 action,所以结果是显示r1.jsp的内容
若chain是跳转到别的package下的action,struts.xml应该这样配置:
跳转到别的package的action示例
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r3">
<result type="chain">
<param name="actionName">chainother</param>
<param name="namespace">/r</param>
</result>
</action>
</package>
<package name="resultTypes2" namespace="/r" extends="struts-default">
<action name="chainother">
<result>/r4.jsp</result>
</action>
</package>
</struts>
第四种是redirectAction,redirect到另一个action。同理根据<result type="redirectAction">r2</result>找到r2 action,进行客户端挑战结果:
result----全局结果集
对应的inedx.jsp连接如下:
<ol>
<li><a href="user/user?type=1">返回success</a></li>
<li><a href="user/user?type=2">返回error</a></li>
<li><a href="user/user?type=3">返回global result</a></li>
<li><a href="admin/admin">admin,继承user包</a></li>
</ol>
struts.xml配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
<action name="index">
<result>/index.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_success.jsp</result>
<result name="error">/user_error.jsp</result>
</action>
</package>
<package name="admin" namespace="/admin" extends="user">
<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
</struts>
action name为user的有action类的UserAction,拥有属性type,可以用属性接受参数,比如第一个连接<li><a href="user/user?type=1">返回success</a></li>那么参数type=1,返回success,跳转到/user_success.jsp
比如第一个连接<li><a href="user/user?type=2">返回error/a></li>那么参数type=2,返回error,跳转到/user_error.jsp
第三个连接<li><a href="user/user?type=3">返回global result</a></li>
type=3返回mainpage,但是user/user下没有mainpage 的result,会找到global result对应的result name并返回结果
global result中的result是全局的,在该package中是公用的。所有的action class返回的值在本action没有对应的result name,就会在global result中查找
public class UserAction extends ActionSupport {
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) return "success";
else if (type == 2) return "error";
else return "mainpage";
}
}
第四个连接:<li><a href="admin/admin">admin,继承user包</a></li>
找到struts.xml文件对应的action类是ActionSupport,返回mainpage,但是admin action下并没有对应的mainpage的result,但是这个package继承user package,所以也会公用user package中的<global-results>
<result name="mainpage">/main.jsp</result>
一个包中的global-results是不管action
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class AdminAction extends ActionSupport {
@Override
public String execute() throws Exception {
return "mainpage";
}
}
传递参数:
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
</struts>