struts2基于注解的action
使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了。
要使用注解方式,我们必须添加一个额外包:struts2-convention-plugin-2.x.x.jar。
虽说是零配置的,但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:拦截器引用组。
实际上struts2中最主要的概念就是package、action以及Interceptor等等概念,所以只要明白这些注解就可以了。
如果希望使用struts2的注解功能,必须使用一个包 struts2-convention-plugin-2.1.8.1.jar,我使用的环境是struts2.1.8.1。如果你使用了不同的版本,找名字就行。
在以上所述的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" />,这样注解就可以使用了。
struts2基于注解的action的更多相关文章
- Struts2基于注解的Action配置
使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...
- struts2基于注解配置action
如果使用struts2,就需要配置文件或者注解,关于struts2的配置文件struts.xml非常熟悉,对于注解可能spring使用的比较多.配置文件的繁琐衬托出了注解的简洁方便,一条或者几条注解解 ...
- Struts2利用注解实现action跳转
使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...
- 基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包自动装配无效
基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包,自动装配将无效,需要spring注入的对象使用时将抛出空指针异常(NullPointerExcep ...
- struts2学习笔记之十四:使用注解配置Action(不是和spring集成使用)
Struts2支持使用注解配置Action,减少配置文件的配置 Struts2如果要支持注解配置Action,需要插件的支持,导入插件struts2-convention-plugin-2.1.8.1 ...
- struts2使用注解--ACTION中的应用
1.在类中指定包:@ParentPackage("system").其中system是在struts.xml中定义的包名.2.配置文件--->注解2.1配置文件方式(返回js ...
- Spring MVC 中的基于注解的 Controller【转】
原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 H ...
- Spring MVC中基于注解的 Controller
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...
- 菜鸟学SSH(十七)——基于注解的SSH将配置精简到极致
很早之前就想写一篇关于SSH整合的博客了,但是一直觉得使用SSH的时候那么多的配置文件,严重破坏了我们代码整体性,比如你要看两个实体的关系还得对照*.hbm.xml文件,要屡清一个Action可能需要 ...
随机推荐
- android摄像头获取图像——第三弹
相机获取图像的格式问题 android中承认的格式的参考网址为 :http://developer.android.com/reference/android/graphics/ImageFormat ...
- IT兄弟连 JavaWeb教程 JavaBean组件定义
JavaBean是一种可重复使用的且跨平台的软件组件.JavaBean可分为两种:一种是由用户界面的JavaBean,还有一种是没有用户界面(User Interface,UI),主要负责表示业务数据 ...
- 织梦cms 应急响应 修复建议
通过分析log日志,可以知道攻击者的IP 攻击时间 和具体操作 本片文章为内网测试,通过分析日志,进行复现攻击流程,同时对网站的后门给予修复建议 通过分析日志可以知道,攻击者使用了扫描工具进行网站扫描 ...
- 【MySQL】全量+增量的备份/恢复
生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...
- 51Nod 1134 最长递增子序列(动态规划O(nlogn))
#include <iostream> #include <algorithm> #include <stdio.h> #define MAXN 50010 usi ...
- go系列(4)- go环境和docker容器的使用
这篇文章讲述把go环境及beego框架装进容器.docker的安装该篇不讲述,请自行查阅.本篇是基于docker已经安装的前提. 跟据前三篇系列,然后写Dockerfile,一般是到项目的根目录下 1 ...
- Redis的分布式锁
一.锁的作用 当多线程执行某一业务时(特别是对数据的更新.新增)等操作,可能就会出现多个线程对同一条数据进行修改.其最终的结果一定与你期望的结果“不太一样”,这就与需要一把锁来控制线程排排队了 - j ...
- python 基础(十二) 图片简单处理
pillow 图片处理模块 安装 pip install pillow pip是安装第三方模块的工具 缩放图片实例 from PIL import Image path = r'C:\Users\x ...
- p标签中的文本换行
参考文章 word-break:break-all和word-wrap:break-word的区别 CSS自动换行.强制不换行.强制断行.超出显示省略号 属性介绍 white-space: 如何处理元 ...
- Java有了GC同样会出现内存泄露问题
1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着. Static ...