`

Struts2_基于注解的Action配置

 
阅读更多

ref: http://www.2cto.com/kf/201110/106826.html

 

使用注解来配置Action的最大好处就是可以实现零配置

 

先来看看struts.xml中的action都能配置些什么?直接看struts2的dtd中描述Action的部分,示例代码如下:

<!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>  

<!ATTLIST action  

    name CDATA #REQUIRED  

    class CDATA #IMPLIED  

    method CDATA #IMPLIED  

    converter CDATA #IMPLIED  

>

零配置就是要替代这些东西,通过约定或者是注解,把这些东西从struts.xml中移除,达到不需要配置就可以指定这些信息并正确运行应用的目的。

@ParentPackage("s2")  

@Namespace("/s2")  

@Action("/anno")  

@Results(  

@Result(name="success",location="/anno/success.jsp")  

)  

@ExceptionMappings(  

@ExceptionMapping(exception="java.lang.Exception",result="error")  

)  

@InterceptorRefs({  

@InterceptorRef("logger"),@InterceptorRef("myStack")  

})  

public class AnnoAction extends ActionSupport{  

…  

 

 

要使用注解方式,我们必须添加一个额外包:struts2-convention-plugin-2.x.x.jar 

 

在以上所述的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;基本上,掌握了这些注解就可以了。

 

但是如果想让这些注解真正工作,必须在配置文件增加几个常量的定义:

 

struts.convention.default.parent.package:这个常量表示缺省的包名是什么,因为在实际应用中,我们常常定义一个缺省的包,这个包中定义了一大堆的拦截器等等,然后其他的包继承自这个包。这个常量可以配也可以不配;

struts.convention.package.locators:这个常量表示你的action类的java包的包名的后缀是啥:比如action。这个常量也可以不配;

struts.convention.package.locators.basePackage:这个常量表示你的action类的java包package的名字是啥;这个常量也可以不配;

以上三个常量都是辅助作用的,为了让注解真正的工作,必须在配置文件中增加<package>节点的配置,至少是<package name="myPackage" extends="struts-default" />,这样注解就可以使用了。

 

虽说是零配置的,但struts.xml还是少不了的,配置如下:

<?xml version="1.0" encoding="UTF-8" ?> 

<!DOCTYPE struts PUBLIC 

    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 

    "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 

<struts>   

    <!-- 请求参数的编码方式--> 

    <constant name="struts.i18n.encoding" value="UTF-8"/> 

    <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开--> 

    <constant name="struts.action.extension" value="action,do,htm"/> 

    <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  --> 

    <constant name="struts.configuration.xml.reload" value="true"/> 

    <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  --> 

    <constant name="struts.devMode" value="false"/>   

    <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  --> 

    <constant name="struts.serve.static.browserCache" value="false" /> 

    <!-- 指定由spring负责action对象的创建    

    <constant name="struts.objectFactory" value="spring" /> 

    --> 

    <!-- 是否开启动态方法调用--> 

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/> 

</struts> 

 

action类的注解:

 

package com.tjcyjd.web.action;   

import org.apache.struts2.convention.annotation.Action;   

import org.apache.struts2.convention.annotation.ExceptionMapping;   

import org.apache.struts2.convention.annotation.ExceptionMappings;   

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;   

 

/** 

 * Struts2基于注解的Action配置

 */   

 

@ParentPackage("struts-default") 

@Namespace("/annotation_test") 

@Results( { @Result(name = "success", location = "/main.jsp"), 

        @Result(name = "error", location = "/error.jsp") }) 

@ExceptionMappings( { @ExceptionMapping(exception = "java.lange.RuntimeException", result = "error") }) 

public class LoginAction extends ActionSupport { 

    private static final long serialVersionUID = 2730268055700929183L;  

    private String loginName;   

    private String password;   

 

    @Action("login") //或者写成  @Action(value = "login")  

    public String login() throws Exception {   

        if ("yjd".equals(loginName) && "yjd".equals(password)) {   

            return SUCCESS;   

        } else {   

            return ERROR;   

        }   

    }   

 

    @Action(value = "add", results = { @Result(name = "success", location = "/index.jsp") })   

    public String add() throws Exception {   

        return SUCCESS;   

    }   

 

    public String getLoginName() {   

        return loginName;   

    }   

    public void setLoginName(String loginName) {   

        this.loginName = loginName;   

    }   

    public String getPassword() {   

        return password;   

    }   

    public void setPassword(String password) {   

        this.password= password;   

    }   

 

这样就完成了一个基于注解的action配置。

 

总结常用的注解如下:

Namespace:指定命名空间。

ParentPackage:指定父包。

Result:提供了Action结果的映射。(一个结果的映射)

Results:“Result”注解列表

ResultPath:指定结果页面的基路径。

Action:指定Action的访问URL。

Actions:“Action”注解列表。

ExceptionMapping:指定异常映射。(映射一个声明异常)

ExceptionMappings:一级声明异常的数组。

InterceptorRef:拦截器引用。

InterceptorRefs:拦截器引用组。

 

另:

每个包都可以设置 package-info.java ,用于写这个包的注释和注解

/** 

 * Action包 

 */  

@ParentPackage("ssh-default")  

package cn.javass.ssh.doc.action;  

   

import org.apache.struts2.convention.annotation.ParentPackage; 

 

可以在 package-info.java 上添加注解,让这个包内的所有 Action 共享

@ParentPackage("ssh-default")  

@Namespace("/doc")  

@DefaultInterceptorRef("checkStack")  

package cn.javass.ssh.doc.action;  

   

import org.apache.struts2.convention.annotation.Namespace;  

import org.apache.struts2.convention.annotation.ParentPackage;  

import org.apache.struts2.convention.annotation.DefaultInterceptorRef;  

 

可以给 <result><interceptor-ref> 等加上 <param>

@Result(type="json",name="jsonr",params={"root"," citys"}

其中的 params 是键值对,相当于

<result type="json" name=“jsonr">

<param name="root">citys</param>

</result> 

 

可以在struts.xml或struts.properties里设置常量来设置Struts2框架读取哪些类为Action。

1、struts.convention.action.packages:可以使用的Action的祖包,默认为没有, 设置为 cn.javass.ssh 就可以读取这个包及其子包的所有头上注册了【 @Action 】 的类。

2、 struts.convention.package.locators:可以使用的Action的上级包,默认为【action,actions,struts,struts2】,这样就可以读取所有在包中的所有头上注册了【@Action】的类;注意设置的action应为这个包的最后一级包,如cn.javass.ssh.user.action.UserAction。

3、 struts.convention.action.suffix:Action类类名的后缀,默认为Action。

 

 

 ref: http://zhaozhi3758.iteye.com/blog/894757

action 类名上加注解

@Namespace("/ssi")  

@ParentPackage("json-default")  

@Action(value = "admin", results = {  

        @Result(name = "success", location = "/WEB-INF/pages/admin.jsp"),  

        @Result(name = "json", type = "json", params = { "excludeProperties","adminMgr" }) })  

public class AdminAction extends BaseAction{}

 

多个Action

@Namespace("/msa")  

@Result(name = "json", type = "json", params = { "excludeProperties",  

    ".*Manager,.*\\.authorities,.*\\.roles,.*\\.fileCon" })  

@Actions(value = {  

    @Action(value = "foreignship", results = { @Result(name = "success", location = "foreignship/foreignship.jsp") }),  

    @Action(value = "foreignshipsee", results = { @Result(name = "success", location = "foreignship/foreignshipsee.jsp") }) })  

public class TMsaForeignShipArchivesAction extends BaseAction{}

 

在类方法上加注解

@Action(value = "save")  

public String save() {  

    try{  

        adminMgr.insert("insertYz_admin", admin);  

    }catch(Exception e){  

        msg = e.toString();  

        success = false;  

    }  

    return  this.SUCCESS;  

分享到:
评论

相关推荐

    Struts 2使用注解配置Action

    Struts 2使用注解配置Action,不配置struts.xml,通过注解直接配置action

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件,可以直接跑

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件。 struts2 注解实例。可以直接跑

    Struts2使用注解实现文件的上传与下载

    使用struts2基于注解(零配置)实现的文件上传与下载的代码,可以正常运行

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    struts2注解配置全面解析

    都被它莫名其妙的错误搞的郁闷,而网上关于这方面的东西大多都是基于struts2.0版本的,对我们现在用的2.1以上的版本不起什么作用,所以特整理出一份文档,里面详细说明了怎样用注解出配置struts2的action,...

    struts2中使用注解配置Action方法详解

    主要介绍了struts2中使用注解配置Action方法详解,涉及一个示例,具有一定参考价值,需要的朋友可以了解下。

    struts2demo全注解

    struts2将请求在Action中封装为Map并将配置文件放到web-info中还可以自定义配置文件位置就是不将struts.xml放到src下但还是不如spring mvc 的封装来得方便

    struts2注解详细说明

     基于注解的Action名• 基于注解的拦截机(Interceptor)• 基于注解的命名空间(Nameespace)• 基于注解的XWork包• 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products ...

    Struts2注解使用说明文档

    而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行配置,甚至不需要使用Annotation进行配置,而是由struts2根据约定...

    Struts2框架及注释和用法

    Struts2的框架及注释和使用法,希望大家支持,我们一起努力,谢谢!

    struts2和spring3注解整合问题

    求有爱的大大帮忙解决一下strut2和sprin3注解找不到action的问题

    Struts2 in action中文版

    第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 为什么使用框架 8 1.3 Struts 2框架...

    SSH框架搭建成功例子(注解方式,Struts2自身创建Action)

    使用的是注解的方式完成的,因为注解的方式可以减少一些配置文件,比较方便的。 【特别强调】一定要清楚如何调试项目,因为自己的环境和下载的资源的环境可能不一样,需要修改配置文件或是其他才能正常运行。...

    Struts2注解

    Struts2直接使用注解的详细配置action 去掉Struts.xml 省去多余的代码 让代码更直观

    struts2 in action

    《Struts 2实战》结合实例介绍了Struts 2框架,主要内容包括Action、Result、Interceptor等框架组件,基于注解的配置选项等新特征,Struts 2插件 FreeMarker,如何从Struts 1和WebWork 2迁移到Struts 2,Ajax标签、...

    Struts2实战.pdf

    《Struts 2实战》结合实例介绍了Struts 2框架,主要内容包括Action、Result、Interceptor等框架组件,基于注解的配置选项等新特征,Struts 2插件 FreeMarker,如何从Struts 1和WebWork 2迁移到Struts 2,Ajax标签、...

    使用注解配置Action

    使用注解配置Action示例。里面已经包涵java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils错误异常的解决方案。

    Struts2 Convention Plugin中文文档 Annotion

    从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。 • 包命名习惯来指定Action位置 • 命名习惯制定结果(支持JSP,FreeMarker等)路径 • 类名到URL的约定转换 • 包名...

    struts2 + spring + mybatis 注解开发

    struts2+Spring3.0+Mybatis组合框架开发,可以正常的运行,其中使用spring注解方式管理action

    Struts2入门教程(全新完整版)

    3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 4 (5)其它配置文件 4 4.让MyEclipse提示xml信息 4 5.如何...

Global site tag (gtag.js) - Google Analytics