`
szqfsx123
  • 浏览: 43747 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2注解介绍

阅读更多

struts2 -convention
    既然说了是全注解 开发,而且我们已经实现了 Hibernate Spring 注解 。同样的, Struts2 也能够做到用注解 来代替配置文件, struts2 -convention 插件可以帮助我们完成这一功能。它是 struts2 提 供的一个插件,目前网上相关的中文文档主要是一个叫石太洋的人根据官方文档翻译的,很多网站与博客都有转载。我看了原文与译文,感觉讲的不够清楚,例子也 很简单。大象根据自己在项目中的实际使用情况,现将个人对这个插件的经验总结写出来与各位分享,希望与大家多交流,共同提高。
    官方文档
    请不要把地址中的两个大写 W 换成小写,否则是打不开页面滴!这个插件的使用其实非常简单,如果光看文档可能会觉得好像很麻烦。那么大象来告诉你怎样快速学习这个插件。
    首先你要搞清楚,这个插件它会默认扫描所有包名为 struts struts2 action actions 下面的类。然后它会对实现了 Action 接口以及类名以 Action 结尾的这些类,作为 Action 来进行处理。
    你可以重新定义按哪种包名进行扫描。比如本例设定,只扫描 web 包下面的所有类,因为我们将 Action 类都放在这个包下面。
    那这个插件是怎么实现原来的配置信息的呢?它的映射规则是这样的,对于以 Action 结尾的的类,去掉 Action ,取剩下的部分,将所有的字母转换为小写,如果有驼峰式的写法,则用 "-" 连接符来连接不同的单词,这是此插件的默认方式。最终转换之后的就是请求地址,还是用例子说明。
    com.bolo.examples.web.base.UserAction     
    按照上面的规则,请求地址就应该是 UserAction 去掉 Action 后缀,将其余部分转换为小写,所以 user 就是我们的请求地址。不过,这还没有完,因为这里面还有一个命名空间的路径,在通常的配置文件中,一般会将不同的功能进行划分,在 package 标签里加上 namespace 属性。使用这个插件,它会为你自动配上命名空间,默认的就是前面说到的以那四种名称为根目录的命名空间,它们之后的都将成为命名空间的名称。
    com.bolo.examples.struts.UserAction  映射为 /user.action
    com.bolo.examples.struts.base.UserAction  映射为 /base/user.action

    要是我们不以 struts 或其它几种默认值为包名,又该怎么办呢?没关系,插件为我们提供了一种自定义根包的配置方式
    <constant name="struts.convention.package.locators" value="web" />
    上面这段配置是写在 struts.xml 里面的,它指定 web 为根,作用就相当于那四种默认值。
    com.bolo.examples.web.base.UserAction 映射为 /base/user.action
    
com.bolo.examples.web.HelloAction  映射为 /hello.action
    com.bolo.examples.web.HelloWorldAction  映射为 /hello-world.action

    请一定注意驼峰写法的映射方式,假如这里不是 HelloWorld ,而是 Helloworld ,那就不会再是 hello-world.action ,而是 helloworld.action 了。
    既然已经知道了它的映射方式,接下来再看看这个插件是如何定义结果页面的。
    convention 默认会到 /WEB-INF/content 文件夹下面查找对应的结果页面,这个文件夹的名字可以修改,需要在 struts.xml 中定义
    <constant name="struts.convention.result.path" value="/WEB-INF/jsp" />
    文件夹的名字改成了 jsp ,这样定义后, convention 就会在这个文件夹下面查找结果页面。它的查找路径与映射的命名空间有关。默认规则是,在请求的命名空间下面,根据请求名称再结合方法返回的字符串生成最终的结果页面名称,再配以后缀名。 convention 支持以 jsp ftl vm html htm 等五种后缀格式的文件。这里有个比较特殊的是如果方法返回 success ,那么可以不用将它与请求名称拼接起来,直接使用请求名称作为返回页面的名称。还是举例子说明。
    
    比如上面这段代码, HelloAction 处于我们定义的根包( web )下面,因此,它的 action 请求为 hello.action 。这时,会默认执行 execute() 方法,由于返回的是 success 字符串,所以页面的名称可以简写为 hello.jsp ,但是当执行 welcome 方法时,由于返回的字符串为 welcome ,这时的页面名称则为 hello-welcome.jsp convention 就是遵循这样的规则来进行命名,当然这只是最基本的,我们再来看看稍微复杂点的东东。
    
    这个 RoleAction 类的外部,加了两种注解 ,它们的作用相当于配置文件中的 result 标签。 Results 是一个 Result 类型的数组注解 ,里面可以包含多个 Result 配置。使用 Result 注解 来设置返回类型与返回页面,是不准备采取默认的定义方式。比如 HelloAction 就是我们采取的默认方式。另外对于有些特殊的返回类型,也需要显式的进行定义。
    因为我对 RoleAction 中的 execute() 方法返回结果进行了显式的定义,所以,它将不再返回默认的 role.jsp ,而是 location 指定的 role-list.jsp Result 注解 中的 name 值要与返回值对应。
    当请求路径为 role!input.action 时,会执行 input() 方法,对于这个方法来说,由于没有进行显式的定义,所以它会按照默认的命名规则返回 role-input.jsp
     redirectUser 方法的返回结果指定了一个 type redirectAction 的值,这表示要对 Action 重定向,在 location 中也说明了是跳转到哪个 Action 。请注意这里指定的是 user.action ,当程序跳转到 UserAction 时,会默认执行 execute 方法。
    假如说,你想执行其它方法该怎么办呢?可以在 location 里面这样定义, location= "user!input.action" 。请记住,重定向时,如果是跳转到其它 Action 或本 Action 中的其它方法, type 要写成 redirectAction
    更进一步,我还想带些参数过去,又该如何呢?请添加 params 属性,它是一个数组类型。可以这样定义, params={ "role_id" , "${role_id}" , "role_name" , " 超级管理员 " } convention 文档中有说明,里面的参数是一个键值对,总是形如 key,value,key,value 。所以第一个 role_id 与第三个 role_name 都叫参数名,二和四则是参数值。另外注意下 "${role_id}" 的含义,这是使用的 OGNL 表达式取出存在于值栈中的名叫 role_id 的值。这是一种动态获取并赋值的方式,在采用配置文件的方式中,也可以这样运用,而 role_name 参数则是一个固定字符串值。需要特别注意的就是,作为参数名的 role_id role_name ,一定要在指向的 Action 中有这两个同名的属性,并且还有 set 方法,这是用来给这两个属性赋值。而对于 ${role_id} ,则要在当前这个 Action 中,有它的 get 方法。用于取值。
    补充说明一下,在 Action 类中定义的全局变量,不是非得给它都加上 set get 方法,这是根据实际情况来设置的。简单的说 get() 是获得值, set() 是设置值。比如,你现在要在页面上显示 username ,那么就对这个属性设置 get 方法,如果只是对 username 设置值,从页面传值到 Action ,那只需要对它设置 set 方法就可以了。除此之外,我们也可以不采用 struts2 提供的值栈方式得到参数值,而是使用非常熟悉的 request.   getParameter() 方法来获取参数。至于实际怎么使用,由各位自己决定,不知道我这样说,大家能不能明白?
    大象根据实际使用情况,发现动态参数的传递在 struts2 .1.6 存在 BUG ,如果需要使用这个功能,请将 struts2 升级到 2.1.8.1 版。
    大象根据实际应用,建议大家统一在类名上面定义 Results 设置,这样做有利于开发与维护;不建议单独对方法使用 @Action 注解 来重新定义它的访问地址与返回结果,因为这样做有些破坏统一性,不过可以根据实际情况进行处理,但不要过多的使用。
    struts.xml
    
    整个 struts.xml 的配置文件就这么多,当然你自己还可以扩展,因为采用了注解 ,所以以前的那些配置就再也看不到了。在这个文件中, package 是继承 convention-default ,而没有继承 struts-default ,为什么呢?查看 convention struts-plugin.xml 文件,我们可以发现 convention-default 继承了 struts-default ,所以这样写是没错的。另外的几个 constant 配置就是对 convention 的常量设置,请看注释。
    关于 paramsPrepareParamsStack 拦截器栈,我准备在第五篇,对基础框架进行扩展的时候再详细的说明。大家如果等不急想学习下,可以在网上查找这方面的资料先看看。
    web
    大象是这样想的,如果一次讲的太多太复杂不利于理解和吸收,所以对于 web 层,大家从前面也看到了,代码很简单,因为本篇主要是讲 convention 插件的知识,然后实现一部分功能用于演示它的效果。下面贴上 web WebRoot 目录结构、 UserAction 的代码,以及 jsp 代码。
    
    
    
    请注意 web 包下面的层次结构,这与你的请求路径相关。 content 文件夹是插件默认指定的名字,你可以修改为别的名字。同样请注意在这个目录下面的文件与子文件夹的定义方式是和 web 层相同的。如果还没有理解,请再看下我对 convention 插件的说明。
     web.xml 文件中,设置了一个 < welcome-file-list > 标签,定义了一个 index.jsp ,这文件里就一句代码   <% response.sendRedirect( "hello.action" );  %>  它会去执行 HelloAction execute() 方法,这方法里面什么逻辑都没有,直接返回结果页面 hello.jsp
    
    ${ctx} 是一个 EL 表达式,设置的是当前项目名称。我在文件开头加了一个静态包含, <%@  include  file = "/common/taglibs.jsp"  %>
    
    不管是 user.action 还是 role.action ,它们默认的执行方法都是 execute() ,点击这两个链接,返回指定的结果页面。
    
    
     user.jsp 里面,用来循环的 list ,是根据 getList() 方法获取的, struts2 会自动的分析出属性名。想一下, list get 方法是不是就是 getList() 呢?我之前说过, get() 是获得值, set() 是设置值 。在这里我只是要在列表页面上得到 list 集合,没有其它的需求,所以不用像这样定义 private List list ,再然后给它加上 set() get() 方法,因为要得到 list 集合,所以还要在 execute() 方法里面写上 list =  userManager .getUsers() , 这样做有必要么?我一直都在遵循优雅、高效、简洁的代码风格,并且一直都在朝这方面努力,也提倡大家这样做。编程是门艺术,而不是一种工作,不要把它当工 作看,只想着完成任务,拼命的堆代码。这样做很难有提高。应该换一种心态去对待它,用艺术的眼光来重新审视你的代码,你会发现这很有乐趣,也会学到很多。 自己的一点浅薄之见,让各位见笑了。
    这部分的内容就说到这里,下一篇将对 paramsPrepareParamsStack 拦截器栈进行详细说明,另外再对框架进行一下扩展,封装 CRUD 功能,只要没有特殊的业务逻辑,在你的实际 Action 中,再不会看到增删改查这些基本功能。

分享到:
评论

相关推荐

    struts2注解登陆

    Struts2注解登录是Java Web开发中一种简化配置的方式,它允许开发者在代码中直接定义控制器、动作和结果页面的映射,从而避免了传统方式下需要在`struts.xml`配置文件中的繁琐设置。这种做法提高了代码的可读性和可...

    Struts2 注解 Demo

    本教程将通过一个"Struts2注解Demo"来深入探讨Struts2中的注解用法,帮助开发者更高效地配置和管理Action类。 首先,Struts2的注解允许我们避免传统的XML配置,从而实现更加简洁、直观的编程方式。在`Struts2Demo`...

    spring和Struts2注解文档

    以上对Spring和Struts2注解的详细介绍,旨在帮助开发者更好地理解和运用这两个框架,提高开发效率和代码质量。通过合理地使用这些注解,可以显著减少项目中的配置负担,使代码结构更加清晰、维护性更强。

    Struts2注解开发jar

    本知识点将详细介绍Struts2中的注解开发及其核心组件。 标题提到的"Struts2注解开发jar"主要指的是`struts2-convention-plugin`,这是一个Struts2的插件,它的主要作用是支持基于约定优于配置(Convention over ...

    struts2注解与拦截器demo

    该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。

    Maven实现struts2注解

    &lt;constant name="struts.objectFactory" value="struts注解工厂类全限定名,比如:org.apache.struts2.spring.StrutsSpringObjectFactory" /&gt; &lt;package name="default" extends="struts-default"&gt; ...

    struts2注解详解

    ### Struts2 注解详解 #### 一、Struts2 Convention 插件介绍与使用 在 Struts2 框架的发展过程中,随着版本的更新和技术的演进,其配置方式也发生了变化。从 Struts2.1 版本开始,官方不再推荐使用 Codebehind ...

    Struts2注解详细说明文档

    ### Struts2注解详细说明 #### 一、概述 Struts2框架是Apache软件基金会下的一个开源项目,它提供了一种构建企业级Java Web应用的解决方案。自Struts2.1版本开始,引入了一个重要的插件——Convention Plugin,该...

    struts2注解必须包

    "struts2注解必须包"指的是Struts2提供的一系列注解,它们对于简化Struts2应用的配置和增强其功能至关重要。 标题中的"struts2-convention-plugin-2.1.8.1.jar"是Struts2的约定插件(Convention Plugin)的一个特定...

    Struts 2使用注解配置Action

    然而,随着Java注解的广泛应用,Struts 2也引入了注解配置的方式来简化开发过程,避免了XML配置的繁琐。 在"Struts 2使用注解配置Action"中,我们不再需要在struts.xml中为每个Action类手动添加配置。相反,我们...

    Struts2+spring注解配置

    Struts2 和 Spring 的整合是企业级 Java Web 开发中常见的技术栈,通过注解配置可以使项目更加简洁、易于维护。Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可...

    struts2注解配置全面解析

    本文详细介绍了Struts2框架中注解配置的基本概念和技术要点,通过具体的示例帮助读者更好地理解和运用这些技术。在实际开发过程中,合理利用Struts2的注解配置可以极大地提高开发效率和代码的可维护性。希望本文能够...

    struts2利用注解annotation实现文件下载

    本文将详细介绍如何使用Struts2框架结合注解(Annotation)的方式实现文件下载功能。 #### 一、Struts2框架简介 Struts2是一个基于MVC架构的Java Web应用框架,它继承了Struts1的优点,并在此基础上进行了改进。...

    Struts2注解配置教程

    本文档是对Struts2注解配置教程的知识点概述,详细介绍了Struts2中注解配置的使用方法和优势,帮助开发者掌握如何通过Java注解简化和优化Struts2框架的配置过程。通过零配置概念,减少XML配置的复杂度,使得代码更加...

    struts2注解小实例

    在这个小实例中,我们将深入探讨如何利用Struts2的注解来构建一个简洁而高效的Web应用。 首先,让我们了解什么是注解。在Java中,注解是一种元数据,它提供了一种安全的方法来向编译器、JVM或框架提供信息。Struts2...

    struts2注解配置

    Struts2注解配置是Java Web开发中一种高效、简洁的框架配置方式,它允许开发者在类或方法级别上直接定义Action、结果类型、参数映射等信息,从而避免了传统XML配置文件的繁琐。本资料集合了关于Struts2注解配置的...

    Struts2注解使用说明文档

    Struts2 是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts2的版本2.1之后,它引入...例如,可以使用Struts2的注解(如`@Action`,`@Result`等)来覆盖或补充Convention的默认行为。

    Struts2全注解方式实现文件上传与下载

    在本资源中,我们将探讨如何利用Struts2的注解方式来实现文件的上传和下载功能,这对于任何Web应用来说都是至关重要的特性。 首先,我们来看“注解”在Struts2中的作用。Struts2允许开发者使用注解来配置Action类,...

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

    下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...

    maven整合struts2全注解

    本文将详细探讨如何使用Maven来整合Struts2,并利用全注解的方式简化配置,提高开发效率。首先,让我们理解这三个组件的核心作用: 1. Maven:是一个项目管理工具,它帮助开发者管理项目的构建、依赖、版本控制等。...

Global site tag (gtag.js) - Google Analytics