Struts2中的Action详解

1.Action的由来 

struts2框架中有一种java类叫做Action,这种说法就像J2EE项目中有一种java类加Servlet.(人们的生活中有一种人的职业叫警察)struts2框架底层还是封装了Servlet的相关内容而实现出来的.只不过struts2框架除了servlet的功能以外还扩展出了很多其他的功能,同时还大大简化了以前在servlet中繁琐的操作.


   在struts2框架中有一种类就是用代替以前我们在web项目中所使用到的servlet,那么这种类,在struts2框架中被称为Action.所以Action其实也是一种java类,比servlet功能更加强大的java类,同时还比servlet中的操作简单.

2.Action比servlet强大的功能的原因

因为我们在web.xml文件中配置了struts2框架中专门的过滤器,用作拦截访问action的请求,拦截住之后,struts2框架就可以给Action添加很多丰富的功能了.

3.如何写一个struts2框架中的Action

有三种方式:

一.只需要类中有一个固定的方法:
     public String execute(){
return "..."
     }
     不需要实现或者继承任何接口或者父类。
     注意:   execute方法一定要返回String类型的对象,每一个字符串都可以对应一个跳转的页面.(字符串是可以自己随便定义的,字符串对应哪一个跳转的页面也是自己定义,在struts.xml文件中定义)

步骤如下:

1.建立一个类TestAction,代码如下:

<span style="font-size:14px;">public class TestAction {

	private static final long serialVersionUID = 1L;
	
	public String execute(){
		// TODO Auto-generated method stub
		
		return "success";
	}

}
</span>
2.然后在struts.xml配置文件中要定义这个跳转的方法,代码如下:

<span style="font-size:14px;">                <!-- test.action -->
		<action name="test"
		    class="com.xu.struts2.web.action.TestAction">
		    <result name="success">/WEB-INF/jsp/index.jsp</result>
		</action></span>
3.在webcontent文件下新建jsp文件夹,在jsp文件夹下面新建jsp,名为index.jsp:

<span style="font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s"%>
<!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>index.jsp</title>
</head>
<body>
      <h4>index.jsp</h4>
      <hr>
</body>
</html></span>
4.在浏览器端运行,输入localhost:9999/Struts2/test.action
效果图如下:


好了,这时候第一种方式就学习完了~

二.实现指定的一个接口:com.opensymphony.xwork2.Action

这个接口中只有一个抽象方法 public abstract String execute()throws Exception;
同时还有5个String类型的静态属性:

<span style="font-size:14px;">     ERROR SUCCESS INPUT NONE LOGIN
     public static final String SUCCESS = "success";
     public static final String NONE = "none";
     public static final String ERROR = "error";
     public static final String INPUT = "input";
     public static final String LOGIN = "login";
</span>
步骤如下:

1.让我们上面建的TestAction实现Action接口,代码如下:

<span style="font-size:14px;">public class TestAction implements Action{

	private static final long serialVersionUID = 1L;
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		//SUCCESS就是“success”
		return SUCCESS;
	}
}</span>

2.struts.xml和index.jsp代码不变

3.在浏览器中输入http://localhost:9999/Struts2/test.action,运行效果也是不变的~

好了,这时候第二种方式也学习完了~

三.继承一个指定的父类:com.opensymphony.xwork2.ActionSupport

步骤如下:

1.让我们上面的TestAction继承ActionSupport,代码如下:

<span style="font-size:14px;">public class TestAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	@Override
	public String execute(){
		// TODO Auto-generated method stub
		
		//SUCCESS就是“success”
		return SUCCESS;
	}

}
</span>
第2和第3步都没变~

效果图也没变~

注意:第三种是我们之后一直使用的方式。

4.在struts.xml文件配置Action

    像之前写完servlet类一样,写完action类后需要在struts.xml文件中进行配置.
   在struts.xml配置action的目的和作用:通知struts2框架我们写的这个类是一个Action,将来struts2框架中要给这个类创建对象,调用方法以及这个Action加入更多丰富的功能。

例如:

<span style="font-size:14px;"><package name="default" namespace="/" extends="struts-default">
		<action name="test"
<span style="white-space:pre">		</span>    class="com.xu.struts2.web.action.TestAction">
<span style="white-space:pre">		</span>    <result name="success">/WEB-INF/jsp/index.jsp</result>
<span style="white-space:pre">		</span></action>
	</package></span>
1)配置中<package>标签及其属性的介绍:

<package>:一个struts.xml文件中可以配置多个<package>标签,一个<package>标签里面可以配置多个<action>标签,一个<action>标签里面可以配置多个<result> 
name="default"表示给当前package起一个名字为default
作用:1.唯一标识当前这个package。
                 2.方便package与package之间通过这个名字来实现继承的关系.(像类和类之间的继承一样,要通过父类的名字来继承)
                  extends="struts-default" 
          表示当前这个package继承了另外一个名字叫做struts-default的package,这个package在struts2的核心jar包中的struts-default.xml文件中定义的,里面定义了很默                            认的配置.
     注意:我们在struts2中定义的所有package,都会是直接或者间接的继承了struts-default这个package.(像java中所有类都是直接或间接的继承了Object类一样)
          namespace="/" 
表示当前package的命名空间为/test,将来这个package里面的所有的action在被访问的时候,路径里面都要加上这个命名空间.
2)配置中<action>标签属性及其子标签介绍:

<span style="font-size:14px;">name="test"
表示当前配置这个action的名字为test,这个名字是随便起的,可以和action类的名字相同或者不同.同时将来浏览器中的地址栏里面就是要出现这个名字来访问当前这个action类</span>
<span style="font-size:14px;">class=".."
表示当前配置的action对应的是哪一个java类,我们可以配置一个action,但是这个action可以没有对应任何java类。就像上面配置的TestAction的例子.</span>
<span style="font-size:14px;"><result>
标签表示将来这个action访问完了之后有哪些跳转.   
<result name="success">/WEB-INF/jsp/index.jsp</result>表示当前这个action如果返回的字符串是success,就那么页面就跳转到index.jsp中</span>
注意:每一个action被访问完之后都会有一个字符串类型的返回值,即使访问一个每一个任何java类对应action的时候,这个action也会默         认返回字符串:success
<result name="success">/index.jsp</result>  等价于  <result>/index.jsp</result>
<result>标签中的name属性默认值就是success

5.特殊的Action配置--使用通配符来配置

使用前提:原本需要配送的多个action名字或者类的名字是有一定规律的.

例如:原来需要配置这样三个action:


	<action name="testCh1" class="com.briup.web.action.ActionTestCh1">
		<result>/successCh1.jsp</result>
		<result name="error">/errorCh1.jsp</result>
	</action>

	<action name="testCh2" class="com.briup.web.action.ActionTestCh2">
		<result>/successCh2.jsp</result>
		<result name="error">/errorCh2.jsp</result>
	</action>

	<action name="testCh3" class="com.briup.web.action.ActionTestCh3">
		<result>/successCh3.jsp</result>
		<result name="error">/errorCh3.jsp</result>
	</action>
		
这时候,我们就可以使用通配符配置一个action来代替这个三个action:

<action name="test*" class="com.briup.web.action.ActionTest{1}">
		<result>/success{1}.jsp</result>
		<result name="error">/error{1}.jsp</result>
	</action>
   {1}代表的时候前面name属性中所出现的第一个*号如果有第二个*号,可以用{2}来表示。
   test*就是将来在浏览器中输入的这个action名字,如果输入的时候test1,那么这个*号就代表1,如果输入的是testlogin,那么这个*号就是代表login.

   注意:如果原本需要配置的多个action没有非常明显的规律,那么就不要用这种方式来配置了.
上一篇我也涉及到了action的配置与使用:Struts2的简单使用

这里我就不写例子了~

6.action的特点及其访问
  特点:
    servlet是线程不安全的,因为servlet是单例。
    struts2框架中的action是线程安全的,因为每次访问都会创建一个新的Action对象.所有在action里面可以随便的定义成员变量(只有成员变量才有线程安全的问题)

 访问:
    默认情况下,访问action的时候,使用namespace/actionName.action或者namespace/actionName就可以访问的到.
    例如:
    <package name="test" extends="struts-default" namespace="/test">
        <action name="test1" class="类A">
<result>/index.jsp</result>
        </action>
    </package>
     http://ip地址:端口号/项目名字/test/test1.action
     或者
     http://ip地址:端口号/项目名字/test/test1
     访问成功页面就会跳转到index.jsp页面了

注意:但是由于不加任何后缀名也可以访问到这个action,这样容易和其他资源的访问产生冲突,
    比如servlet的访问(本来是访问项目的servlet的,但是Struts2框架却当成了这是访问action的请求来处理).
    所以我们需要配置一下,把action访问规定成,只能使用后缀名.action或者是.do 或者是其他形式来访问.代码如下:

 //可以使用.action或者.do来访问
    <constant name="struts.action.extension" value="action,do"></constant>
    //只能使用.action
    <constant name="struts.action.extension" value="action"></constant>
7.访问action的时候,action中方法的调用
    1.默认情况下,访问action的时候会调用action中的execute方法,这个方法执行完返回一个字符串,然后根据字符串进行跳转.

    2.可以在<action>标签里面加上一个method属性,来指明将来访问这个action的时候会调用哪一个方法.
      例如:
<action name="test" class=".." method="login">
    
    注意:俩个不同名字的action可以对应的是相同的一个java类.
<action name="test1" class="类A" method="login">
<action name="test2" class="类A" method="register">
这样使用test1和test2俩个不同名字的action就是访问到同一个类中的俩个不同的方法:login和regist方法.但是login方法和                     register方法必须和execute方法类似的,都是返回String的值.
    3.地址栏中动态指定要调用的方法
        例如:
<package name="test" extends="struts-default" namespace="/test">
  <action name="MyTest" class="类A">
<result>/index.jsp</result>
           </action>
        </package>

类A里面有俩个方法:register login

默认情况下地址栏中通过MyTest.action来访问这个action会访问到它的execute方法,同时我们还可以在地址栏中动态的指定要访问的方法:
MyTest!login.action  这样就能访问到名字为MyTest的action对应类A中的login方法了.
        http://ip地址:端口号/项目名字/test/MyTest!login.action
上一篇我也涉及到了action的配置与使用: Struts2的简单使用

 可以去看看加深印象~



  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值