struts2: config-browser-plugin 与 convention-plugin 学习
struts2被很多新手诟病的一个地方在于“配置过于复杂”,相信不少初学者因为这个直接改投Spring-MVC了。convention-plugin、 config-browser-plugin这二个插件的出现,很大程度改善了这个囧境。
简言之:convention-plugin采用"约定大于配置”的思想,只要我们遵守约定,完全可以少写配置甚至不写配置;而config-browser-plugin则用于方便的浏览项目中的所有action及其与jsp view的映射。这二个插件结合起来学习,能很方便的搞定struts2中各种复杂的action-view映射需求。
一、config-browser-plugin使用
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-config-browser-plugin</artifactId>
<version>2.3.16</version>
</dependency>
maven项目的pom.xml中加上这个即可,运行后,浏览 http://localhost:8080/{你的项目名称}/config-browser/ 即可看到当前项目中的所有action
注:以下内容中,凡有url的地方,项目名称假设为struts2-helloworld

如果跑不起来,检查服务器应用WEB-INF/lib/下是否有struts2-config-browser-plugin-2.3.16.jar 这个文件
二、convention-plugin 使用
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.16</version>
</dependency>
pom.xml中加上这个后,可以把struts.xml配置文件给干掉了(或者改个名),部署App,如果启动正常,则表示环境ok。如果提示缺少asm 啥类,检查下面这几个依赖项,是否也加进来了
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency> <dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency> <dependency>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
<version>3.3.1</version>
</dependency> <dependency>
<groupId>asm</groupId>
<artifactId>asm-tree</artifactId>
<version>3.3.1</version>
</dependency>
2.1 零action的view
convention-plugin约定所有的jsp view都放在WEB-INF/content目录下,在这个目录下先随便放一个名为"no-action.jsp"的jsp文件,里面随便写点啥
浏览 http://localhost:8080/struts2-helloworld/no-action

即:即使没有对应的Action类,struts2也能按约定正常展现页面。(当然,这只是开胃小菜,真正应用中,除了做一些纯静态的页面原型之外,大部分场景,背后还是要有Action类来支撑的)
2.2 常规映射
建一个HelloWorld.action类
package com.cnblogs.yjmyzz.action; import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result; @Namespace("/home")
public class HelloWorldAction extends BaseAction { private static final long serialVersionUID = -8827776224243873974L; private String message; @Action("hello-world")
public String execute() throws Exception {
return SUCCESS;
} @Action(value = "say-hi", results = { @Result(name = "success", location = "hello-world.jsp") })
public String sayHi() throws Exception {
message = "welcome to SSH!";
return SUCCESS;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} }
解释一下:
第7行,在整个Action类上使用了@Namespace("/home"),表示整个Action最终浏览的url,是以 http://localhost:8080/{你的项目名称}/home/ 打头
第14行,通过注解@Action("hello-world"),把默认的/home/index.action路径,改成了 /home/hello-world
至于execute方法,返回success后,对应的是哪个jsp文件,这个不用死记,通过config-browser-plugin看下便知

即:execute方法返回input/error/success中的任何一个,都会映射到/WEB-INF/content/home/hello-world.jsp 这个文件上
20行sayHI()方法上的注解有点意思,@Action(value = "say-hi", results = { @Result(name = "success", location = "hello-world.jsp") }),默认情况下,如果不指定location,返回success时,它应该对应 /WEB-INF/content/home/say-hi.jsp这个文件,但是通过location值,变成了hello-world.jsp,即与/home/hello-world共用同一个view.
3、拦截器问题
上一篇学习了通过拦截器来处理异常,采用convention插件后,会发现拦截器不起作用(struts.xml中配置了也一样)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> <interceptors>
<interceptor name="myinterceptor"
class="com.cnblogs.yjmyzz.Interceptor.ExceptionInterceptor">
</interceptor> <interceptor-stack name="myStack">
<interceptor-ref name="myinterceptor" />
</interceptor-stack>
</interceptors> <default-interceptor-ref name="myStack" />
<default-action-ref name="index" /> <global-results>
<result name="error">/WEB-INF/common/error.jsp</result>
</global-results> <global-exception-mappings>
<exception-mapping exception="java.lang.Exception"
result="error" />
</global-exception-mappings> <action name="index">
<result type="redirectAction">
<param name="actionName">hello-world</param>
<param name="namespace">/home</param>
</result>
</action> </package> <!-- 因为有Convention-plugin,就不再需要手动写action-view的映射规则了 -->
<!-- <include file="struts-home.xml" />
<include file="struts-mytatis.xml" /> --> </struts>
原因在于convention-plugin使用后,所有Action不再继承自默认defaultStack对应的package,为了解决这个问题,建议所有Action都继承自一个自定义的BaseAction类,然后在BaseAction上加上@ParentPackage("default"),让所有Action强制继承自struts.xml中定义的default package
package com.cnblogs.yjmyzz.action; import org.apache.struts2.convention.annotation.ParentPackage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.opensymphony.xwork2.ActionSupport; @ParentPackage("default")
public class BaseAction extends ActionSupport { private static final long serialVersionUID = -4320398837758540242L;
protected Logger logger = LoggerFactory.getLogger(this.getClass()); }
基本用法就是这些,如果不清楚Action最终出来的url是啥,或者不清楚某个url最终会对应到哪个jsp文件,无需死记规则,只要善用config-browser-plugin,大多数下不用查阅文档即可快速解决问题。
struts2: config-browser-plugin 与 convention-plugin 学习的更多相关文章
- Struts2 Convention Plugin ( struts2 零配置 )
Struts2 Convention Plugin ( struts2 零配置 ) convention-plugin 可以用来实现 struts2 的零配置.零配置的意思并不是说没有配置,而是通过约 ...
- struts2使用Convention Plugin在weblogic上以war包部署时,找不到Action的解决办法
环境: struts 2.3.16.3 + Convention Plugin 2.3.16.3 实现零配置 现象:以文件夹方式部署在weblogic(10.3.3)上时一切正常,换成war包部署,运 ...
- 创建一个dynamics 365 CRM online plugin (六) - Delete plugin from CRM
我们之前都学习到怎么添加,debug还有update plugin. 今天带大家过一下怎么从CRM instance当中删除plugin. 首先让我们打开Settings -> Customiz ...
- http://www.vaikan.com/docs/jquery.form.plugin/jquery.form.plugin.html#getting-started
http://www.vaikan.com/docs/jquery.form.plugin/jquery.form.plugin.html#getting-started Jquery.Form 异步 ...
- Struts Convention Plugin 流程 (2.1.6+)
首先添加lib: <dependency> <groupId>org.apache.struts</groupId> <artifactId>strut ...
- JQuery Plugin 1 - Simple Plugin
1. How do you write a plugin in jQuery? You can extend the existing jQuery object by writing either ...
- 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案
eclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven.p ...
- 解决 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”
eclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven.p ...
- Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”
myeclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven ...
- "Loading a plug-in failed The plug-in or one of its prerequisite plug-ins may be missing or damaged and may need to be reinstalled"
The Unarchiver 虽好,但存在问题比我们在mac上zip打包一个软件xcode, 然后copy to another mac, 这时用The Unarchiver解压缩出来的xcode包不 ...
随机推荐
- IIS与Apache共用80端口方法
IIS与Apache共用80端口 http://www.cnblogs.com/haocool/p/3595282.html Windows server 2003服务器上安装有默认 IIS 6和Ap ...
- #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲
又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...
- 【转】探索C#之布隆过滤器(Bloom filter)
原文:蘑菇先生,http://www.cnblogs.com/mushroom/p/4556801.html 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量 ...
- yii2 rbac权限控制详细操作步骤
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...
- java多线程与单例模式(Singleton)不得不说的故事
转发自:http://blog.csdn.net/ligang7560/article/details/50890282 单例模式的多种实现方式 我们都知道单例模式有几种常用的写法: - 饿汉模式 - ...
- ORA-01501: CREATE DATABASE failed
使用dbca建库时遇到ORA-01501: CREATE DATABASE failed这个错误,检查告警日志,发现有下面错误信息: SMON: enabling tx recovery Fri Ap ...
- chrome浏览器首页被hao123劫持解决办法
在chrome浏览器设置里面将新标签页地址改为www.baidu.com, 不过一般来说这个办法完全没用,因为我们面对的是史无前例的大流氓. 查看桌面chrome的快捷方式是否被篡改.右键快捷方式,点 ...
- HBase应用开发回顾与总结系列之四:HBase配置管理类接口设计
利用Eclipse进行HBase应用开发时,至少需要确定三个配置信息,如下表所示: #hbase config #HMaster服务部署主机及端口号 hbase.master=hdp-wuyong ...
- EarthWarrior3D游戏ios源码
这是一款不错的ios源码源码,EarthWarrior3D游戏源码, 并且游戏源代码支持多平台. 适用于cocos v2.1.0.0版本 源码下载:http://code.662p.com/view/ ...
- C# FTP 命令无法获取ServerU目录列表问题
第一步: 使用C# 的Ftp功能时,发现了一个很奇怪的现象,获取目录列表的命令,在SeverU上面直接返回错误,而在windows自带的FTP上则正常,经过反复试验,终于发现,原来是ServerU默 ...