Struts学习(二)-----action参数设置+result参数设置+通配符+默认action

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>

 

猜你喜欢

转载自blog.csdn.net/wangdongli_1993/article/details/81059470