在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.