ruts2的注解配置
使用前提
struts2框架,它不仅支持基于XML的配置方式,同时也支持基于注解配置的方式。接下来,我们就来讲解,struts2框架如何基于注解配置。
首先我们要明确一件事:
注解和XML的配置,都是告知struts2框架,当我们jsp页面发送请求,根据配置执行对应动作类的方法,并根据返回值,前往指定的结果视图(jsp页面或者其他动作)。它们只是配置的形式不一样。
其次要想使用struts2的注解,必须要导入一个新的jar包。该jar包是:
struts2-convention-plugin-2.3.24.jar
常用注解
@NameSpace
出现的位置:
它只能出现在package上或者Action类上。一般情况下都是写在Action类上。
作用:
指定当前Action中所有动作方法的名称空间。
属性:
value:指定名称空间的名称。写法和xml配置时一致。不指定的话,默认名称空间是""。
示例:
@Namespace("/customer")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
@ParentPackage
出现的位置:
它只能出现在package上或者Action类上。一般情况下都是写在Action类上。
作用:
指定当前动作类所在包的父包。由于我们已经是在类中配置了,所以无需在指定包名了。
属性:
value:指定父包的名称。
示例:
@ParentPackage("struts-default")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
@Action
出现的位置:
它只能出现在Action类上或者动作方法上。一般情况下都是写在动作方法上。
作用:
指定当前动作方法的动作名称。也就是xml配置时action标签的name属性。
属性:
value:指定动作名称。
results[]:它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用response输出响应正文。
interceptorRefs[]:它是一个数组,数据类型是注解。用于指定引用的拦截器。
示例:
/**
* 获取添加客户页面
* @return
*/
@Action(value="addUICustomer",results={
@Result(name="addUICustomer",location="/jsp/customer/add.jsp")
})
public String addUICustomer(){
return "addUICustomer";
}
@Result
出现的位置:
它可以出现在动作类上,也可以出现在Action注解中。
作用:
出现在类上,表示当前动作类中的所有动作方法都可以用此视图。
出现在Action注解中,表示当前Action可用此视图。
属性:
name:指定逻辑结果视图名称。
type:指定前往视图的方式。例如:请求转发,重定向,重定向到另外的动作。
location:指定前往的地址。可以是一个页面,也可以是一个动作。
示例:
/**
* 保存客户
* @return
*/
@Action(value="addCustomer",results={
@Result(name="addCustomer",type="redirect",location="/jsp/success.jsp")
})
public String addCustomer(){
customerService.saveCustomer(customer);
return "addCustomer";
}
@Results
出现的位置:
它可以出现在动作类上,也可以出现在Action注解中。
作用:
用于配置多个结果视图。
属性:
value:它是一个数组,数据类型是result注解。
示例:
@Results({
@Result(name="login",location="/login.jsp"),
@Result(name="error",location="/error.jsp")
})
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
@InterceptorRef
出现的位置:
它可以出现在动作类上或者Action注解中。
作用:
用于配置要引用的拦截器或者拦截器栈
属性:
value:用于指定拦截器或者拦截器栈
示例:
出现在动作方法上:
/**
* 查询所有客户
* @return
*/
@Action(value="findAllCustomer",results={
@Result(name="findAllCustomer",location="/jsp/customer/list.jsp")
},interceptorRefs={
@InterceptorRef("myDefaultStack")
})
public String findAllCustomer(){
customers = customerService.findAllCustomer();
return "findAllCustomer";
}
出现在动作类上:
@InterceptorRef("myDefaultStack")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
myDefaultInterceptor的定义需要写在配置文件中,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.devMode" value="true"></constant>
<!-- 修改默认拦截后缀 -->
<constant name="struts.action.extension" value="action"></constant>
<!-- 修改struts2的主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
<!-- 定义一个公共包,继承struts2的核心包struts-default,并且声明为抽象包 -->
<package name="myDefault" extends="struts-default" abstract="true">
<interceptors>
<!-- 声明拦截器 -->
<interceptor name="checkLogin"
class="cn.itcast.web.interceptors.CheckLoginInterceptor"/>
<!-- 声明拦截器栈,把检查登录拦截器和默认拦截器栈组合成一个新的拦截器栈 -->
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="checkLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 把声明的拦截器栈设置为当前项目的默认拦截器栈 -->
<default-interceptor-ref name="myDefaultStack"/>
</package>
</struts>