Convention Plugin使用

今天突然想把ss3ex中的Codebehind Plugin换成Convention Plugin,找了些资料汇总如下:
The Convention Plugin is bundled with Struts since 2.1 and replaces the Codebehind Plugin and Zero Config plugins。使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,原先web.xml中的配置基本可以不要了。
convention-plugin的约定:
1. 默认所有的结果页面都存储在WEB-INF/content下,你可以通过在Struts的配置文件中设置struts.convention.result.path这个属性的值来改变到其他路径。如:
<constant name="struts.convention.result.path" value="/WEB-INF/page" />

则将路径配置到了WEB-INF/page 下。
2. 默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。如:
<constant name="struts.convention.package.locators" value="web,action" />

则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。
com.ss3ex.examples.web.demo.*,com.ustb.action.*都将被视为含有Action的包路径而被搜索。
3. 接着,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类:
com.example.actions.MainAction
com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)
com.example.struts.company.details.ShowCompanyDetailsAction
4. 命名空间。从定义的struts.convention.package.locators标示开始到包结束的部分,就是命名空间。举个例子:
Com.ustb.web.user.userAction的命名空间是:“/user”。Com.ustb.web.user.detail.UserAction的命名空间是:“/user/detail”
5. Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。然后将每个分部的首字母转为小写,用‘-’分割,你可以设置struts.convention.action.name.separator 如
<constant name="struts.convention.action.name.separator" value="-" />

还是举个例子:
UserAction->user
UserDetailAction ->user-detail。结合上面的。对于com.ustb.web.user.detail.UserDetailAction,映射的url就是/WEB-INF/page/user/detail/user-detail.jsp,“/WEB-INF/page/”是struts.convention.result.path,“user/detail/”是命名空间,user-detail是action分解的。
当然,简单的通过默认的方式来进行配置不能完全满足实际项目的需要。所幸,convention的零配置是非常灵活的。
通过@Action注释
对如下例子:
package com.example.web;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {
@Action("action1")
public String method1() {
return SUCCESS;
}

@Action("/user/action2")
public String method2() {
return SUCCESS;
}
}


方法名 默认调用路径 默认映射路径
method1 /hello!method1.action . /WEB-INF/content/hello.jsp
method2 /hello!method2.action. /WEB-INF/content/hello.jsp

通过@Action注释后

方法名 @Action注释后调用路径 @Action注释 后映射路径
method1 /action1!method1.action. /WEB-INF/content/action1.jsp
method1 /user/action2!method2.action /WEB-INF/content/user/action2.jsp
或者
method1 /action1.action. /WEB-INF/content/action1.jsp
method1 /user/action2.action /WEB-INF/content/user/action2.jsp
/WEB-INF/content是struts.convention.result.path,还要加上命名空间,上面的类的命名空间正好是“”。

通过@Actions注释

package com.example.web;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;

public class HelloAction extends ActionSupport {
@Actions({
@Action("/different/url"),
@Action("/another/url")
})
public String method1() {
return “error”;
}

我们可以通过:/different/url!method1.action 或 /another/url!method1.action 来调用method1 方法。
对应的映射路径分别是/WEB-INF/content/different/url-error.jsp; /WEB-INF/content/another/url-error.jsp
可能误导了大家,一个方法被@Action注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:

package com.example.web;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;

public class HelloAction extends ActionSupport {
@Action("/another/url")
public String method1() {
return “error”;
}

我们调用method1方法可以通过两种方式:
1 /hello!method1.action 映射 url:/WEB-INF/content/hello-error.jsp
2 /another/url!method1.action 映射 url:/WEB-INF/content/another/url-error.jsp
可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择,即同一个ACTION可以映射2个不同的视图。


通过@Namespace 注释

package com.example.web;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
@Namespace("/other")
public class HelloWorld extends ActionSupport {

public String method1() {
return “error”;
}
@Action("url")
public String method2() {
return “error”;
}

@Action("/different/url")
public String method3() {
return “error”;
}
}

通过 /other/hello-world!method1.action 访问method1 方法。
通过 /other/url!method2.action 访问method2 方法
通过 /different/url!method3.action 访问method3 方法
与@Action 注释不同的是,该注释覆盖了默认的namespace(这里是‘/’),此时再用hello!method1.action 已经不能访问method1 了.
@Results和@Result
1 全局的(global)。
全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

@Results({
@Result(name="failure", location="/WEB-INF/fail.jsp")
})
public class HelloWorld extends ActionSupport {
public String method1() {
return “failure”;
}
@Action("/different/url")
public String method2() {
return “failure”;
}

}

当我们访问 /hello -world !method1.action 时,返回 /WEB-INF/fail.jsp
当我们访问 /hello -world !method2.action 时,返回 /WEB-INF/fail.jsp
当我们访问 /different/url!method2.action 时,返回 /WEB-INF/fail.jsp

2 本地的(local)。
本地results只能在action方法上进行声明。

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

public class HelloWorld extends ActionSupport {
@Action(value="/other/bar",results={@Result(name = "error", location = "www.baidu.com",type="redirect")})
public String method1() {
return “error”;
}
}

当我们调用 /hello -world !method1.action 时,返回 /WEB-INF/content/hello-error.jsp
当我们调用 /other/bar!method1.action 时,返回 www.baidu.com

参考资料:
http://cwiki.apache.org/WW/convention-plugin.html
http://javeye.iteye.com/blog/238559
http://sunflowers.iteye.com/blog/357281
二进制、八进制、十六进制、十进制转换详解 二进制是计算机的语言,正如我们使用汉语表达与交流信息一样,任何信息在计算机中都以二进制的形式存储和计算。了解二进制与十进制等进制之间的转换方法,有助于我们了解计算机内部的数字计算过程,可以帮助我们在一定程度上理解信息在计算机中的编码和解码过程。本文先简单介绍位置化数字系统的概念,然后详细讲解二进制、八进制、十六进制、十进制之间的转换方法与原理。 阅读详情

相关推荐

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文详细介绍了如何在PHP项目中快速集成SM4国密加密算法,提供完整的代码实现和实际应用示例。从算法原理到核心代码解析,再到性能优化与安全实践,帮助开发者高效实现数据加密功能,满足金融、政务等领域的合规需求。

weixin_29315569的博客 353

终极指南:Android Showcase 中的 Gradle 版本目录与约定插件革命

Android Showcase 是一个用于展示 Android 开发技巧和最佳实践的项目集合,通过创新的 Gradle 配置方案,实现了模块化项目的高效管理。本文将深入解析其版本目录与约定插件的实现方式,帮助开发者掌握现代 Android 项目的构建优化技巧。 ## 为什么传统 Gradle 配置需要革命? 传统 Android 项目中,依赖管理和插件配置往往分散在多个 `build.gra

gitblog_00272的博客 392

基于ESP32-C3的便携式血氧仪硬件与算法实现

血氧饱和度(SpO₂)监测是生理参数无创检测的核心技术之一,其原理基于光电容积脉搏波(PPG)信号中红光与红外光吸收比值的动态变化。该技术依赖高精度模拟前端、稳定光学激励及实时数字信号处理能力,在消费级健康设备中面临功耗、体积与测量鲁棒性的多重约束。ESP32-C3凭借集成LEDC、12位ADC与低功耗双核架构,成为PPG终端的理想主控平台;结合定制化指夹式光学探头与比率法血氧算法,可实现非诊断级但趋势可靠的日常健康监测。本文围绕硬件电路设计、电源管理策略与嵌入式信号处理流程展开,覆盖从LED驱动、跨阻放大

weixin_29025501的博客 132

使用 Gradle Convention Plugins(约定插件)优化 Android 编译配置

摘要 本文介绍了Gradle约定插件(Convention Plugins)在大型Android项目中的应用优势。相比传统的buildSrc方案,约定插件解决了全量重新构建的性能问题,同时提供了集中化、标准化和复用化的构建配置管理方式。文章详细演示了如何创建build-logic目录并配置约定插件模块,包括settings.gradle.kts文件设置和插件注册流程。通过约定插件,开发者可以简化模块构建配置,实现统一的版本管理和依赖控制,特别适合多团队协作的大型项目。

移动端开发干货分享 1284

从零到一:用Verilog和Quartus构建智能交通灯系统的实战指南

本文详细介绍了如何使用Verilog和Quartus Prime从零开始构建智能交通灯系统。通过分步指导,包括状态机设计、时序控制、数码管显示等核心模块实现,并结合ModelSim仿真验证,帮助FPGA初学者掌握数字电路设计的关键技术。文章还提供了实际部署到FPGA开发板的调试技巧和进阶优化方案。

weixin_29172201的博客 473

ISCE+Mintpy进行SBASInSAR处理(持续更新)

通过调用pairs_misregistration方法,利用safe_dict中的数据信息,对每对SLC数据进行配准误差的计算和分析,以确定数据之间的精确差异,为后续的时间序列处理提供基础。给定同一地区的两景SAR影像,经过配准之后,对应像元进行共轭相乘得到相位差,并形成干涉图,但是从干涉图中得到的相位差实际上是主值,即在(-π,π)呈周期性变化,为了还原其真实的相位差,必须在主值的基础上加或减整数倍的相位周期2π,把被卷叠的相位展开,才能顺利地反演出地面目标的高程和形变。

Cyy2511250589的博客 3732

Diia项目中的Gradle插件开发:自定义Convention Plugin实现

在Android项目开发中,随着模块数量增长,构建配置的一致性和维护性成为挑战。Diia项目通过自定义Gradle Convention Plugin(约定插件)解决了这一问题,将通用配置逻辑封装为可复用插件,实现了跨模块的配置统一管理。本文将从插件架构、核心实现到应用实践,详解Diia项目的Gradle插件开发经验。 ## 插件架构概览 Diia项目采用Gradle复合构建模式组织插件代码,...

gitblog_01140的博客 410

自制《大侠狂想曲》修改器:内存修改、加速与一键安装全攻略

游戏修改器是玩家优化游戏体验的常用工具,其核心原理是通过内存修改技术,在游戏进程运行时动态改写数值。常见实现路径是借助Cheat Engine扫描并追踪数据地址,再通过编程语言调用系统API完成读写。这种技术能有效解决重复刷资源带来的枯燥感,特别适用于单机RPG中想快速体验多剧情线却不想重刷资源的情形。本文以《大侠狂想曲》为例,完整拆解了从CE定位金钱与好感度内存地址,到编写C#脚本实现游戏加速、一键增加铜钱与NPC好感度,再到用Inno Setup打包生成一键安装器的全过程,并总结了数值弹回、剧情不触发、

weixin_30368981的博客 1461

Convention Plugin 学习(三)

[size=small]1.Convention插件的主要实现浅析 1.1 PackageBasedActionConfigBuilder 这个类最重要,是整个程序的入口。 1.1.1 buildActionConfigs方法进行初始化配置,其中findActions扫描类路径,我没有深入研究这个方法具体是怎么找到所有类的。只是找到全部类后,和我们的配置文件中限定的范围匹配...

myw 188

ENVI哨兵一号数据处理

使用ENVI+SarScape处理哨兵数据

Rjjjjj11的博客 2万+

别再乱点U盘里的.exe了!手把手教你彻底清除那个伪装成Usb Disk的蠕虫病毒

本文详细介绍了如何识别、清除和预防伪装成Usb Disk的蠕虫病毒。从识别感染迹象到安全备份文件,再到深度清理病毒残留和构建防护策略,提供了一套完整的U盘病毒解决方案。特别提醒用户注意U盘病毒的风险,并养成良好的使用习惯。

weixin_30496999的博客 661

MonoGame碰撞检测算法:AABB与SAT实现高性能检测

在游戏开发中,**碰撞检测算法**是确保游戏世界真实性和交互性的核心技术。MonoGame作为开源的跨平台游戏框架,提供了强大的**AABB碰撞检测**和**SAT算法**支持,让开发者能够轻松实现高性能的游戏物理引擎。🚀 ## 什么是碰撞检测算法? 碰撞检测算法是游戏引擎中用于检测游戏对象之间是否发生接触或重叠的计算方法。无论是简单的2D平台游戏还是复杂的3D射击游戏,都需要可靠的**碰撞

gitblog_01080的博客 737

Ollama教程——模型:如何将模型高效导入到ollama框架

本教程详细介绍了如何将GGUF、PyTorch和Safetensors格式的模型导入到ollama框架中。通过一系列步骤,从环境准备、模型转换和量化,到最终的模型创建和运行,我们为开发者提供了一个清晰的指南。此外,我们还探讨了如何发布模型到ollama平台,使得模型可以被更广泛地分享和应用。ollama框架提供了一个灵活、高效的解决方案,帮助开发者在各种环境中部署和运行机器学习模型。无论您是想将现有模型快速部署到生产环境,还是希望探索新的模型架构,ollama都能为您提供所需的工具和资源。

walkskyer的博客 1万+

Convention Plugin

Apache Struts 2 Documentation >Home > Guides > Plugin Developers Guide > Convention Plugin Apache Struts 2 Documentation Convention Plugin Edit Page Browse SpaceA

Jston的专栏 1020

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

convention plugin的初步了解

搞了几天的convention plugin 终于有了点明目。。 所谓约定, 若一action:ee 一方法中 return "aa"; 就会去找ee-aa.jsp的页面。 这个页面到struts.convention.result.path的值去查找。 这个默认值在WEB-INF/content中。 一般把JSP页面都放在webroot下面,那就直接设置成“/”就可以了。...

学得越多,忘得越多;忘得越多,知道的越少 119

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

struts2 convention plugin

1.官方文档;http://struts.apache.org/plugins/convention/# 2.注解实例 @Controller   @Scope("prototype")   @ParentPackage("mypackage")   @Results({       @Result(name="test1",location="test.jsp"),

kaixinbingju的专栏 303

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

struts convention-plugin的使用

最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置。 配置文件精简了,的确是简便了开发过程,但是,我们熟悉的配置突然disappear了,真是一下很不适应。跟

展翅腾飞 934

struts2 convention plugin翻译

转自http://www.blogjava.net/libin2722/articles/256525.html Convention Plugin 原文:http://cwiki.apache.org/WW/convention-plugin.html 翻译:石太祥(ealpha@gmail.com   http://www.lalfa.com ) ·

flyingfalcon的专栏 726

Struts2 Convention plugin

http://www.blogjava.net/jzone/articles/322222.html http://struts.apache.org/2.1.6/docs/convention-plugin.html https://cwiki.apache.org/confluence/display/WW/Convention+Plugin#ConventionPlugin-Re...

千里之行,始于足下 168

Struts2 convention-plugin 使用笔记

最近有在学习struts2  ,之前虽然使用过,但是也只是使用,struts2 的很多功能根本就没去了解过,现在决定学习一下,暂不要求有多深入。所以如果您需要的是一个高级教程,那么请转车。。。此次列车不去那里。 系统环境如下 eclipse 3.6tomcat 6JDK 6Ubuntu 12.04 LTS struts 版本为2.3.4.1,在 struts2的官方文档中讲到 Th

我是你的什么?你是我的有了没。 1358

struts2采用convention-plugin实现零配置

最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置。配置文件精简了,的确是简便了开发过程,但是,我们熟悉的配置突然disappear了,真是一下很不适应。跟着潮

1034

Convention Plugin 学习

2.struts.xml文件配置  Convention Plugin 学习(一) 只挑选几个重要的常量说明: (1) &lt;constant name="struts.locale" value="zh_CN"/&gt;       &lt;constant name="struts.i18n.encoding" value="UTF-8"/&gt;       struts2.1.6 

lvdong5830的专栏 120

Struts2 convention plugin

http://blog.163.com/pudi_1984_mail/blog/static/1643856162010427983652/ 1.         零配置≠无配置。 2.         约定优于配置。 3.         Struts2-convention-plugin.jar位于struts2/lib目录下。 4.         它提供

j50435578的专栏 692

Struts2 Convention Plugin中文文档

Struts2 Convention Plugin中文文档 分类: Sturts22013-04-16 13:54 190人阅读 评论(0) 收藏 举报 目录(?)[+] Struts2Convention Plugin中文文档(一) Introduction 从struts2.1版本开始,Convention Plugin作为替换替换

梓烽学编程 481

关于struts2 的Convention-plugin的一些坑

struts2中若要使用注解则需要引入包 struts2-convention-plugin 引入此包后可以使用struts的各种注解,但是此包有一些神坑需要注意,引入此包可以简化struts.xml的配置,其是基于约定优于配置的思想来简化struts配置的,其中一个重要的约定就是关于返回类型为type="velocity"或者type="freemarker"的.vm或.fm文件的位置问题,默...

shanyikun的博客 929
上一篇: BeanWrapper的使用
下一篇: ss3ex终于在有了SVN的地址了
iteye_6521
博客等级 码龄8年 0粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值