在2005年之前,所有的开发框架几乎都由一个特点,除了框架本身的代码需要编写之外,还需要编写大量的XML文件,并且利用这些文件决定项目的执行,想法很好,但是在实际的使用中会发现并不怎么好,一旦项目开发很大,那么对于整个项目的控制文件就非常难以维护了.从2005年之后(正是在这一年Apache收购;1WebWork),所以现在跨度比较大的框架都开始进行一些结构的修改,Sturts2.x就支持了Annotation(Struts1.x依然不支持),
如果要想在Struts里面使用Annotation,那么需啊进行一些配置才可以
实际上依然无法使用Annotation开发,因为在Struts2.x前面强调了,如果要使用Annotation配置依然需要在web.xml文件的过滤器上进行修改.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>SAProject</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPages</param-name> <!-- 设置Anntation扫描包 -->
<param-value>cn.zwb.action</param-value> <!-- 所有Action的保存路径 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
以后只要是保存在了cn.zwb.action包中的所有程序类都支持Annotation的使用
Annotation的基本使用
在整个Struts2.x项目里面最为核心的肯定是Action以及每一个Action对应的跳转路径,但是通过分析也应该知道在整个Struts2.x项目里面是绝对离不开sturts.xml文件的,因为在这个文件里面需要配置一些公共的操作.
范例:修改struts.xml文件,定义公共配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="root" namespace="/" extends="struts-default">
<global-results><!-- 公共跳转路径 -->
<result name="forward">/pages/forward.jsp</result>
<result name="input">/pages/error.jsp</result>
</global-results>
<!-- 定义拦截器 -->
</package>
</struts>
随后所有的Action里面依然需要延续使用以上的配置操作.
范例:定义Action使用Annotation配置
package cn.zwb.action;
import org.apache.struts2.convention.annotation.Action;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
@Action(value="MemberAction")
public class MemberAction extends ActionSupport {
public void insert(){
System.out.println("增加=============");
}
}
如果从一个实际的开发来讲,所有的Action应该都有其对应的父路径
范例:进一步配置
package cn.zwb.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
@ParentPackage(value="root") //继承了root包
@Namespace(value="/pages/back") //定义了自己的命名空间
@Action(value="MemberAction")
public class MemberAction extends ActionSupport {
public void insert(){
System.out.println("增加=============");
}
}
但是从实际来讲,每一个Action都有可能配置自己的跳转路径,那么这些result也可以通过Annotation配置
范例:配置跳转路径
package cn.zwb.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
@ParentPackage(value="root") //继承了root包
@Namespace(value="/pages/back") //定义了自己的命名空间
@Action(value="MemberAction")
@Results(value={
@Result(name="success",location="/pages/back/insert.jsp",type="redirect"), //表示客户端跳转
@Result(name="list",location="/pages/back/list.jsp")
})
public class MemberAction extends ActionSupport {
public String insert(){
System.out.println("增加=============");
return ActionSupport.SUCCESS;
}
}
在整个Struts2.x里面对于Annotation的配置的时候还给了一些比较神奇的支持,例如,可以为每一个方法设置自己的路径
@Actions(value={@Action("Update"),@Action("hello")})
public void update(){
System.out.println("------[MemberAction]数据修改操作");
}
从此之后,一个Action中的方法就可以轻松的实现多个路径的映射,但是这样的操作并不好用,还是建议在一个Action里面只定义个路径
拦截器配置
<interceptors>
<interceptor-stack name="zwbStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
随后在Action里面去引用这些拦截器.
@InterceptorRef(value="zwbStack")
@InterceptorRefs(value={
@InterceptorRef(value="timer"),
@InterceptorRef(value="defaultStack")
})
那么为什么需要多个拦截器,如果要想进行文件上传,一定需要多个拦截器的综合使用.
范例:文件上传
@InterceptorRefs(value={
@InterceptorRef(value="fileUpload",params={"maximumSize","99999999","allowedTypes","image/bmp,image/jpg,image/jpeg,image/gif,image/png"}),
@InterceptorRef(value="defaultStack")
})
那么以后如果选择上传文件的支持,讲究使用此Annotation.