struts2基于action的注解操作详细总结笔记

1.为什么我们要使用注解代替struts.xml配置文件

      我们知道通常情况下,Struts2是通过struts.xml配置的。但是随着系统规模的加大我们需要配置的文件会比较大,虽然我们可以根据不同的系统功能将不同模块的配置文件单独书写,然后通过<include>节点将不同的配置文件引入到最终的struts.xml文件中,但是毕竟还是要维护和管理这些文件,因此也会给维护工作带来很大的困扰。为了解决这个问题,可以考虑使用struts2的注解。实际上struts2中最主要的概念就是package、action以及Interceptor等等概念,所以只要明白这些注解就可以了。

2.完成Struts2的注解操作

如果希望使用struts2的注解功能,必须使用一个包struts2-convention-plugin-2.1.8.1.jar,我使用的环境是struts2.1.8.1。如果你使用了不同的版本,找名字就行。

在以上所述的jar文件中定义了一系列的注解,其中比较主要的是:

  • @ParentPackage,这个注解对应了xml文件中的package节点,它只有一个属性叫value,其实就是package的name属性;
  • @Namespace,命名空间,也就是xml文件中<package>的namespace属性;
  • @Action,这个注解对应<action>节点。这个注解可以应用于action类上,也可以应用于方法上。这个注解中有几个属性:

    • value(),表示action的URL,也就是<action>节点中的name属性;
    • results(),表示action的多个result;这个属性是一个数组属性,因此可以定义多个Result;
    • interceptorRefs(),表示action的多个拦截器。这个属性也是一个数组属性,因此可以定义多个拦截器;
    • params(),这是一个String类型的数组,它按照name/value的形式组织,是传给action的参数;
    • exceptionMappings(),这是异常属性,它是一个ExceptionMapping的数组属性,表示action的异常,在使用时必须引用相应的拦截器;
  • @Result,这个注解对应了<result>节点。这个注解只能应用于action类上。这个注解中也有几个属性:

    • name(),表示action方法的返回值,也就是<result>节点的name属性,默认情况下是【success】;
    • location(),表示view层文件的位置,可以是相对路径,也可以是绝对路径;
    • type(),是action的类型,比如redirect;
    • params(),是一个String数组。也是以name/value形式传送给result的参数;

实际上,struts2中的主要注解就是这些,当然了,还有上面提到的@interceptorRef和@exceptionMapping;、

需要注意的是:

一,引入支持Struts2支持注解开发jar包:

                 struts2-convention-plugin-2.1.8.1.jar(支持Struts2框架注解开发的jar包)

二,Struts2使用注解开发需要遵循一些规范:

              1,Action要必须继承ActionSupport父类;

              2,Action所在的包名必须以  .action 结尾。

三,action中常用的注解:

              1,@ParentPackage:对应xml配置文件中的package的父包,一般需要继承struts-default。

              2,@Namespace:对应配置文件中的nameSpace,命名空间。

              3,写在方法前边的注解:

  • @Action,这个注解对应<action>节点
    • value(),表示action的请求名称,也就是<action>节点中的name属性;
    • results(),表示action的多个result;这个属性是一个数组属性,因此可以定义多个Result;
    • interceptorRefs(),表示action的多个拦截器。这个属性也是一个数组属性,因此可以定义多个拦截器; 
    • exceptionMappings(),这是异常属性,它是一个ExceptionMapping的数组属性,表示action的异常,在使用时必须引用相应的拦截器

    4,看一下action中最常用的results中单个result注解的配置吧:

  • @Result,这个注解对应了<result>节点。这个注解只能应用于action类上。这个注解中也有几个属性:
    • name(),表示action方法的返回值,也就是<result>节点的name属性,默认情况下是【success】;
    • location(),表示view层文件的位置,可以是相对路径,也可以是绝对路径;
    • type(),是action的类型,比如redirect,不指定情况下,框架默认的是dispatcher

  配置对应举例:

@Action/@Actions:

@Action指定一个类为action,相应配置文件里的<action>....</action>标签,当中能够配置例如以下属性

  1. results:配置返回的结果集属性,相当于struts2中的<result>列表,能够在{}中配置属性,详细例如以下
  2. value:配置action的名字,相当于<action>中的name属性
  3. interceptorRefs:配置拦截器

@Action能够定义在类上,也能够定义在方法上

例如以下(@Result的作用后面讲,也能够和后面的配合着看)

@Action(value = "testAction",results = {@Result(name="success",location="/success.jsp")})
public class testAction extends ActionSupport {

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
}

这就相当于例如以下的xml配置

<action name="testAction" class="struts2.action.testAction">
	<result name="success">/success.jsp</result>
</action>

在xml配置中假设name不写,那么默认就是success,在注解中也是,假设results中的name不写。那么默认就是success

也能够使用@Actions来指定多个action映射,这样能够做到一个类相应多个地址映射。例如以下

@Actions({
	@Action(value = "testAction",results = {@Result(location="/success.jsp")}),
	@Action(value = "testAction2",results = {@Result(location="/success.jsp")})
})
public class testAction extends ActionSupport {

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
}

这是使用/testAction或者/testAction2都能够跳转到success.jsp上。由于配置了两个action映射

在xml配置中,我们有例如以下的配置方法

<action name="*" class="struts2.action.testAction" method={1}>
	<result name="{1}">/{1}.jsp</result>
</action>

这是xml配置中的通配符方式,即当我们以add来訪问action时。将会进到action的add方法进行处理。当返回add时会跳转到add.jsp页面

在注解中没有通配符能够使用,可是也能够实现类似的效果,这时@Action就要写在方法上了,就像以下这样

public class testAction extends ActionSupport {
	@Action(value = "add",results = {@Result(name="add",location="/add.jsp")})
	public String add() throws Exception {
		return "add";
	}
	@Action(value = "delete",results = {@Result(name="delete",location="/delete.jsp")})
	public String delete() throws Exception {
		return "delete";
	}
}

这样便实现了上面的效果。这说明@Action也是能够在方法上声明的(@Actions也能够在方法上声明)

@Result/@Results:

@Result配置详细返回结果。在results中使用,也能够单独在类上使用,有例如以下属性

  1. name:相应<result>中的name属性
  2. location:相应<result></result>间的地址
  3. type:相应<result>的type属性

@Result能够在类上声明。也能够和Action配置声明,假设在类上声明,那么就是全局的结果,例如以下

@Result(name="delete",location = "/delete.jsp")
public class testAction extends ActionSupport {
	@Action(value = "add", results = { @Result(name = "add", location = "/add.jsp") })
	public String add() throws Exception {
		return "add";
	}

	@Action(value = "delete")
	public String delete() throws Exception {
		return "delete";
	}
}

尽管delete方法没有指定返回delete时要跳转到哪个页面页面。可是在类上用@Result声明了,那么就会找到类上面的这个@Result,然后跳转到delete.jsp页面

下面看两个个完整的struts2.xml使用注解的.action文件

例1.

<span style="font-size:18px;">@Controller//控制层的Spring注解
@Scope("prototype")//支持多例
@ParentPackage("struts-default")  //表示继承的父包
@Namespace(value="/user") //表示当前Action所在命名空间
public class LoginAction extends ActionSupport{
    
    @Resource
    private User user; //使用域驱动模式接收表单参数

    @Action( //表示请求的Action及处理方法
            value="login",  //表示action的请求名称
            results={  //表示结果跳转
                    @Result(name="success",location="/success.jsp",type="redirect"),
                    @Result(name="login",location="/login.jsp",type="redirect"),
                    @Result(name="error",location="/error.jsp",type="redirect")
            },
            interceptorRefs={ //表示拦截器引用
                    @InterceptorRef("defaultStack"),
                    @InterceptorRef("timer")
            },
            exceptionMappings={  //映射映射声明
                    @ExceptionMapping(exception="java.lang.Exception",result="error")
            }
    )
    public String login() throws Exception {

        int i = 1/0 ;
        
        if ("admin".equals(user.getUsercode()) && "admin".equals(user.getUserpswd())) {
            
            Map session = ActionContext.getContext().getSession();
            session.put("session_user", user);
            
            return "success";
        } else {
            return "login";
        }

    }
}
</span>

  例2.  

1.package com.action;
2.
3.
4.import org.apache.struts2.convention.annotation.Action;
5.import org.apache.struts2.convention.annotation.InterceptorRef;
6.import org.apache.struts2.convention.annotation.Namespace;
7.import org.apache.struts2.convention.annotation.Result;
8.import org.apache.struts2.convention.annotation.Results;
9.
10.import com.opensymphony.xwork2.ActionSupport;
11.
12.@Namespace(value="/admin") 
13.@Results({
14.			@Result(name="error",location="/error.jsp")
15.			}) //全局转发
16.public class UserAction  extends ActionSupport{
17.	//以标准的方式定义Action
18.	
19.	//以Action的调用的方法进行书写,一般情况下不写execute方法
20.
21. private String message;
22.
23.	public String getMessage() {
24.		return message;
25.	}
26.
27.	public void setMessage(String message) {
28.		this.message = message;
29.	}
30.	31.	
32.	//模拟几个Action中的操作
33.	
34.	//将该方法 映射成为一个Action的请求
35.	/*
36.	 *  注解的声明: 一般情况下表示在项目的根下进行Action的定义
37.	 * 				action的注解声明 一般配合namspace的共同使用
38.	 * */
39.	
40.	 //该方法被命名为addUser.action  value属性作为默认的缺省项出现,可以忽略
41.	@Action(value="addUser" , results={
42.	@Result( name="success" ,location="/index.jsp" ,type="redirect") //推荐使用绝对路径
43.														//默认的type类型是转发
44.				}
45.		)
46.	public String addUser(){
47.		this.message="这是一个添加的方法";
48.		return SUCCESS;
49.		
50.	}
51.	@Action(value="updateUser"  ,results={
52.			@Result( name="success" ,location="/index.jsp" ,type="redirect")}
53.			,params={"param_name","param_value"},

54.			interceptorRefs={
55.						@InterceptorRef("defaultStack"),
56.						@InterceptorRef("timer")
57.					}
58.			)
59.	
60.	public String updateUser(){
61.		this.message="这是一个修改的方法";
62.		return SUCCESS;
63.		
64.	}
65.	@Action(value="deleteUser")
66.	public String deleteUser(){
67.		this.message="这是一个删除的方法";
68.		return SUCCESS;
69.		
70.	}
71.
72.
73.}

综上可以见得,为Struts2框架中注解的开发。三大框架都利用注解开发,和配置文件开发,效率会大大提升的。各种框架,jar包等新的版本现在都是支持注解开发的,不断的学习,不断的优化,不断提高效率,注解开发利弊并存着,我们要懂的扬长避短,让每个框架,每种思想的优点都来为我们开发即可。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

试剑江湖。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值