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,代码如下:

public class TestAction {

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

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

                
		
		    /WEB-INF/jsp/index.jsp
		
3.在webcontent文件下新建jsp文件夹,在jsp文件夹下面新建jsp,名为index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s"%>




index.jsp


      

index.jsp


4.在浏览器端运行,输入localhost:9999/Struts2/test.action
效果图如下:

Struts2中的Action详解_第1张图片

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

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

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

     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";
步骤如下:

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

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;
	}
}

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

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

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

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

步骤如下:

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

public class TestAction extends ActionSupport{

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

}
第2和第3步都没变~

效果图也没变~

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

4.在struts.xml文件配置Action

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

例如:


				    class="com.xu.struts2.web.action.TestAction">
		    /WEB-INF/jsp/index.jsp
		
	
1)配置中标签及其属性的介绍:

:一个struts.xml文件中可以配置多个标签,一个标签里面可以配置多个标签,一个标签里面可以配置多个 
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)配置中标签属性及其子标签介绍:

name="test"
表示当前配置这个action的名字为test,这个名字是随便起的,可以和action类的名字相同或者不同.同时将来浏览器中的地址栏里面就是要出现这个名字来访问当前这个action类
class=".."
表示当前配置的action对应的是哪一个java类,我们可以配置一个action,但是这个action可以没有对应任何java类。就像上面配置的TestAction的例子.

标签表示将来这个action访问完了之后有哪些跳转.   
/WEB-INF/jsp/index.jsp表示当前这个action如果返回的字符串是success,就那么页面就跳转到index.jsp中
注意:每一个action被访问完之后都会有一个字符串类型的返回值,即使访问一个每一个任何java类对应action的时候,这个action也会默         认返回字符串:success
/index.jsp  等价于  /index.jsp
标签中的name属性默认值就是success

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

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

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


	
		/successCh1.jsp
		/errorCh1.jsp
	

	
		/successCh2.jsp
		/errorCh2.jsp
	

	
		/successCh3.jsp
		/errorCh3.jsp
	
		
这时候,我们就可以使用通配符配置一个action来代替这个三个action:


		/success{1}.jsp
		/error{1}.jsp
	
   {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就可以访问的到.
    例如:
   
       
/index.jsp
       

   

     http://ip地址:端口号/项目名字/test/test1.action
     或者
     http://ip地址:端口号/项目名字/test/test1
     访问成功页面就会跳转到index.jsp页面了

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

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

    2.可以在标签里面加上一个method属性,来指明将来访问这个action的时候会调用哪一个方法.
      例如:

    
    注意:俩个不同名字的action可以对应的是相同的一个java类.


这样使用test1和test2俩个不同名字的action就是访问到同一个类中的俩个不同的方法:login和regist方法.但是login方法和                     register方法必须和execute方法类似的,都是返回String的值.
    3.地址栏中动态指定要调用的方法
        例如:

 
/index.jsp
           

       


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

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

 可以去看看加深印象~



你可能感兴趣的:(Struts2)