(二十七)在Struts2.x里面实现Annotation配置

        在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里面只定义个路径

        拦截器配置

        如果要在某一个Action上去使用拦截器,最早都是通过配置得来的,那么也可以 通过Annotation完成
范例:在struts.xml文件里面定义拦截器
        
<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.



        

猜你喜欢

转载自blog.csdn.net/qq1019648709/article/details/80663514
今日推荐