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 学习的更多相关文章

  1. Struts2 Convention Plugin ( struts2 零配置 )

    Struts2 Convention Plugin ( struts2 零配置 ) convention-plugin 可以用来实现 struts2 的零配置.零配置的意思并不是说没有配置,而是通过约 ...

  2. struts2使用Convention Plugin在weblogic上以war包部署时,找不到Action的解决办法

    环境: struts 2.3.16.3 + Convention Plugin 2.3.16.3 实现零配置 现象:以文件夹方式部署在weblogic(10.3.3)上时一切正常,换成war包部署,运 ...

  3. 创建一个dynamics 365 CRM online plugin (六) - Delete plugin from CRM

    我们之前都学习到怎么添加,debug还有update plugin. 今天带大家过一下怎么从CRM instance当中删除plugin. 首先让我们打开Settings -> Customiz ...

  4. 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 异步 ...

  5. Struts Convention Plugin 流程 (2.1.6+)

    首先添加lib: <dependency> <groupId>org.apache.struts</groupId> <artifactId>strut ...

  6. JQuery Plugin 1 - Simple Plugin

    1. How do you write a plugin in jQuery? You can extend the existing jQuery object by writing either ...

  7. 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案

    eclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven.p ...

  8. 解决 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”

    eclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven.p ...

  9. Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”

    myeclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven ...

  10. "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包不 ...

随机推荐

  1. Play Framework 完整实现一个APP(二)

    1.开发DataModel 在app\moders 下新建User.java package models; import java.util.*; import javax.persistence. ...

  2. 14、SEO工程师要阅读的书籍 - IT软件人员书籍系列文章

    SEO工程师是Web项目中比较重要的一个角色.他主要负责网站的针对搜索引擎的优化方案的编写和实施.因为现在网站数量庞大,在全世界的这么多网站当中,想要让用户访问你的网站,就需要一些技巧性的内容.很多用 ...

  3. PHP延迟静态绑定 static关键字

    示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...

  4. Protocol 编码的三种常用方式

    1.使用固定长度 2.使用固定长度的请求头,请求头中说明了body的长度. 例如HTTP 协议: http请求协议: http 响应协议: 3.使用界定符.例如有很多基于text(文本)协议都会在每个 ...

  5. Java并发之CyclicBarrier 可重用同步工具类

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Cyclic ...

  6. c#操作IIS站点

    /// <summary> /// 获取本地IIS版本 /// </summary> /// <returns></returns> public st ...

  7. 解决Python2.7的UnicodeEncodeError: 'ascii' codec can’t encode异常错误

    import sys reload(sys) sys.setdefaultencoding('utf-8') 好了,通过上面短短的三行,我们算是很好的解决了这个问题了,同样的方式也可以应用到Unico ...

  8. vs2008环境nmake编译 apache 2.2.29 openssl 1.0.1g mod_ssl 不知道如何生成“"..\..\srclib\openssl\inc32\openssl\store.h"”

    问题: vs2008环境nmake编译 apache 2.2.29 openssl 1.0.1g mod_ssl 不知道如何生成“"..\..\srclib\openssl\inc32\op ...

  9. keepalived高可用反向代理的nginx

    实验系统: (1)CentOS 6.6_x86_64: (2)共有三台主机,本实验以ip地址来命名主机,即131主机.132主机.133主机. 实验前提:防火墙和selinux都关闭,主机之间时间同步 ...

  10. 将treeview控件内容导出图片

    项目中有一项需求,需要将项目中的treeview控件展示的树状结构直接导成一张图片.网上方法很多,但很多都是屏幕截屏,我的解决思路是新建一个用户控件,将主窗体的Treeview的数据传给用户控件(不要 ...