04.struts动作类(Action)

1.创建动作类(三种方式)

1.使用普通方式javaBean作为Action动作类,不需要继承任何父类,也不需要实现接口。

  • 方法一定是public公用的,
  • 返回值是字符串用来决定跳转到哪个视图
  • 不需要参数
  • 方法名自定义,如果不自定义的话,有个默认的方法名execute

public class HelloAction {
	
	public String hello(){
		System.out.println("任亮讲师");
		return "success";
	}
	/**
	 * 当前请求没有绑定方法的时候自动找execute默认的方法
	 * @return
	 */
	public String execute(){
		System.out.println("任亮是一个好讲师");
		return "success";
	}

}

2.创建动作类实现接口com.opensymphony.xwork2.Action

 

配置完成如图所示:

public interface Action {

    /**
     * The action execution was successful. Show result
     * view to the end user.
     */
    public static final String SUCCESS = "success";

    /**
     * The action execution was successful but do not
     * show a view. This is useful for actions that are
     * handling the view in another fashion like redirect.
     */
    public static final String NONE = "none";

    /**
     * The action execution was a failure.
     * Show an error view, possibly asking the
     * user to retry entering data.
     */
    public static final String ERROR = "error";

Action接口中提供了一些常量

常量

说明

SUCCESS

Success

返回成功页面

NONE

None

不返回任何页面

ERROR

Error

返回错误提示页面

INPUT

Input

当提交表单时发生错误,就跳回表单页面

LOGIN

Login

返回登录页面

3.创建动作类继承父类

com.opensymphony.xwork2.ActionSupport

(推荐使用)

public class HelloAction2 extends ActionSupport{

}
//(ActionSupport可点击查看源码)

 2.配置动作类

<!-- 
			name:必须指定在一个包中唯一
			class:当前action所在的动作类
			method:当前action要访问的方法
		 -->
		<action name="as" class="com.rl.action.HelloAction2" method="helloAS">
			<result name="success">/success.jsp</result>
		</action>

3.action动作类的生命周期

创建:Action动作类每次请求的时候都会创建一个实例对象

销毁:当前action动作类的请求响应完后就消失了

javaweb中的HttpServletRequest的生命周期是一样的,struts2是多例的,线程安全的

 

4.action动作类的访问

通配符 (一个*)

原则:约定优于配置

在action中每一个方法有一定的规则:都以User结尾

public class HelloAction2 extends ActionSupport{
	
	public String saveUser(){
		System.out.println("我被保存了");
		return super.SUCCESS;
	}
	
	public String updateUser(){
		System.out.println("我被修改了");
		return super.SUCCESS;
	}
}
<struts>
	<package name="hello" extends="struts-default">
		<action name="*" class="com.zy.action.HelloAction2" method="{1}User">
			<result name="success">/{1}User.jsp</result>
		</action>
	</package>
</struts>

*如果是save的话,method= saveUser,则返回/saveUser.jsp。 

创建save.jsp和update.jsp

访问http://localhost:8080/strus2/save

结果:

通配符 (两个*)

public class HelloAction2 extends ActionSupport{
	
	public String save_User(){
		System.out.println("我被保存了");
		return super.SUCCESS;
	}
	
	public String update_User(){
		System.out.println("我被修改了");
		return super.SUCCESS;
	}
}
<struts>
	<package name="hello" extends="struts-default">
		<!-- <action name="*" class="com.zy.action.HelloAction2" method="{1}User">
			<result name="success">/{1}User.jsp</result>
		</action> -->

		<action name="*_*" class="com.zy.action.PersonAction" method="{1}_{2}">
			<result name="success">/{1}{2}.jsp</result>
		</action>
	</package>
</struts>

 

创建savePerson.jsp和updatePerson.jsp 

访问http://localhost:8080/strus2/update_Person

注意:同一个包中不能有多个通配符的action 

动态方法调用

首先要开启动态方法调用的开关

public class Hello extends ActionSupport{
	public String hello1(){
		System.out.println("hello1");
		return super.SUCCESS;
	}
	
	public String hello2(){
		System.out.println("hello1");
		return super.SUCCESS;
	}
	
	public String hello3(){
		System.out.println("hello1");
		return super.SUCCESS;
	}
}

 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"/>
	<package name="hello" extends="struts-default">
		<action name="zhangyan" class="com.zy.action.Hello">
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

这时我们的action的动作类不需要再指定方法method属性了,而是在url上指定

语法:      !方法名[.后缀名]

http://localhost:8080/strus2/zhangyan!hello1

 

 5.结果视图的配置

<result name="success">/success.jsp</result>

Result:要返回的视图

 属性:

 Name:action动作类要返回的值,如果返回的值匹配上了当前的name的值就跳转到相应的页面

 Type:跳转方式(type在struts-default.xml的文件中,自行查看,这里写主要学的几个type)

public class Hello extends ActionSupport{
	public String hello(){
		return super.SUCCESS;
	}
}
  1. Dispatcher:请求转发,相当于javaweb中的forward,地址栏不变,在我们不知道type的时候默认是dispatcher
  2. Redirect:页面重定向,地址栏变化
public class Hello extends ActionSupport{
	public String hello(){
		return super.SUCCESS;
	}
}
public class Hello1 extends ActionSupport{
	public String hello1(){
		return super.SUCCESS;
	}
}

访问 :http://localhost:8080/strus2/zhangyan

跳到:http://localhost:8080/strus2/success.jsp

3.Chain:请求转发到一个action动作类,地址栏不发生变化

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	<package name="hello" extends="struts-default">
		<action name="zhangyan" class="com.zy.action.Hello" method="hello">
			<result name="success" type="chain">zhangyan1</result>
		</action>
		<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
			<result name="success">/success1.jsp</result>
		</action>
	</package>
</struts>

4.redirectAction:重定向到一个action的动作类,地址栏变化

            1.同包内的重定向

访问 :http://localhost:8080/strus2/zhangyan

跳到:http://localhost:8080/strus2/zhangyan1.action

 

           2. 不同包内的重定向(result需要通过param来指定namespace和actionName)

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	<package name="hello" extends="struts-default">
		<action name="zhangyan" class="com.zy.action.Hello" method="hello">
			<result name="success" type="redirectAction">
                //重定向的action的name
				<param name="actionName">zhangyan1</param>
			</result>
		</action>
	</package>
	<package name="hello1" extends="struts-default">
		<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
			<result name="success">/success1.jsp</result>
		</action>
	</package>
</struts>

 

5.stream:文件的上传和下载。

6.局部结果视图和全局的结果视图

在一个action中配置的result是局部结果视图,外部的action是不能使用这个result

包内的全局的结果视图配置对于包内的每一个action动作类都有效

<?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"/>
	<package name="hello" extends="struts-default">
		<!--  包级别的全局结果视图-->
		<global-results>
			<result name="error">/error.jsp</result>
		</global-results>
		
		<action name="zhangyan" class="com.zy.action.Hello" method="hello">
			<result name="success" type="redirectAction">
				<param name="actionName">zhangyan1</param>
			</result>
		</action>
         <action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
			<result name="success">/success1.jsp</result>
		 </action>
	</package>
	
		
	
</struts>

在整个系统中的全局的结果视图,通过继承的方式来实现

<?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"/>
	<package name="basePackage" extends="struts-default" abstract="true">
		<global-results>
			<result name="error">/error.jsp</result>
		</global-results>
	</package>

	<package name="hello" extends="basePackage">
		<!--  包级别的全局结果视图-->
		<global-results>
			<result name="error">/error.jsp</result>
		</global-results>
		
		<action name="zhangyan" class="com.zy.action.Hello" method="hello">
			<result name="success" type="redirectAction">
				<param name="actionName">zhangyan1</param>
			</result>
		</action>
	</package>
	<package name="hello1" extends="basePackage">
		<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
			<result name="success">/success1.jsp</result>
		</action>
	</package>
</struts>

猜你喜欢

转载自blog.csdn.net/weixin_44199723/article/details/85451699
今日推荐