zoukankan      html  css  js  c++  java
  • 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使用

    1 <dependency>
    2     <groupId>org.apache.struts</groupId>
    3     <artifactId>struts2-config-browser-plugin</artifactId>
    4     <version>2.3.16</version>
    5 </dependency>
    View Code

    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 使用

    1 <dependency>
    2     <groupId>org.apache.struts</groupId>
    3     <artifactId>struts2-convention-plugin</artifactId>
    4     <version>2.3.16</version>
    5 </dependency>
    View Code

    pom.xml中加上这个后,可以把struts.xml配置文件给干掉了(或者改个名),部署App,如果启动正常,则表示环境ok。如果提示缺少asm 啥类,检查下面这几个依赖项,是否也加进来了

     1 <dependency>
     2     <groupId>asm</groupId>
     3     <artifactId>asm</artifactId>
     4     <version>3.3.1</version>
     5 </dependency>
     6 
     7 <dependency>
     8     <groupId>asm</groupId>
     9     <artifactId>asm</artifactId>
    10     <version>3.3.1</version>
    11 </dependency>
    12 
    13 <dependency>
    14     <groupId>asm</groupId>
    15     <artifactId>asm-commons</artifactId>
    16     <version>3.3.1</version>
    17 </dependency>
    18 
    19 <dependency>
    20     <groupId>asm</groupId>
    21     <artifactId>asm-tree</artifactId>
    22     <version>3.3.1</version>
    23 </dependency>
    View Code

    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类

     1 package com.cnblogs.yjmyzz.action;
     2 
     3 import org.apache.struts2.convention.annotation.Action;
     4 import org.apache.struts2.convention.annotation.Namespace;
     5 import org.apache.struts2.convention.annotation.Result;
     6 
     7 @Namespace("/home")
     8 public class HelloWorldAction extends BaseAction {
     9 
    10     private static final long serialVersionUID = -8827776224243873974L;
    11 
    12     private String message;
    13 
    14     @Action("hello-world")
    15     public String execute() throws Exception {
    16         return SUCCESS;
    17     }
    18 
    19     @Action(value = "say-hi", results = { @Result(name = "success", location = "hello-world.jsp") })
    20     public String sayHi() throws Exception {
    21         message = "welcome to SSH!";
    22         return SUCCESS;
    23     }
    24 
    25     public String getMessage() {
    26         return message;
    27     }
    28 
    29     public void setMessage(String message) {
    30         this.message = message;
    31     }
    32 
    33 }
    View Code

    解释一下:

    第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中配置了也一样)

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 
     6 <struts>
     7 
     8     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
     9     <constant name="struts.devMode" value="false" />
    10 
    11     <package name="default" namespace="/" extends="struts-default">
    12 
    13         <interceptors>
    14             <interceptor name="myinterceptor"
    15                 class="com.cnblogs.yjmyzz.Interceptor.ExceptionInterceptor">
    16             </interceptor>
    17 
    18             <interceptor-stack name="myStack">
    19                 <interceptor-ref name="myinterceptor" />
    20             </interceptor-stack>
    21         </interceptors>
    22 
    23         <default-interceptor-ref name="myStack" />
    24         <default-action-ref name="index" />
    25 
    26         <global-results>
    27             <result name="error">/WEB-INF/common/error.jsp</result>
    28         </global-results>
    29 
    30         <global-exception-mappings>
    31             <exception-mapping exception="java.lang.Exception"
    32                 result="error" />
    33         </global-exception-mappings>
    34 
    35         <action name="index">
    36             <result type="redirectAction">
    37                 <param name="actionName">hello-world</param>
    38                 <param name="namespace">/home</param>
    39             </result>
    40         </action>
    41 
    42     </package>
    43 
    44 <!-- 因为有Convention-plugin,就不再需要手动写action-view的映射规则了 -->
    45 <!--     <include file="struts-home.xml" />
    46     <include file="struts-mytatis.xml" />  -->
    47 
    48 </struts>
    View Code

    原因在于convention-plugin使用后,所有Action不再继承自默认defaultStack对应的package,为了解决这个问题,建议所有Action都继承自一个自定义的BaseAction类,然后在BaseAction上加上@ParentPackage("default"),让所有Action强制继承自struts.xml中定义的default package

     1 package com.cnblogs.yjmyzz.action;
     2 
     3 import org.apache.struts2.convention.annotation.ParentPackage;
     4 import org.slf4j.Logger;
     5 import org.slf4j.LoggerFactory;
     6 
     7 import com.opensymphony.xwork2.ActionSupport;
     8 
     9 @ParentPackage("default")
    10 public class BaseAction extends ActionSupport {
    11 
    12     private static final long serialVersionUID = -4320398837758540242L;
    13     protected Logger logger = LoggerFactory.getLogger(this.getClass());
    14 
    15 }
    View Code

    基本用法就是这些,如果不清楚Action最终出来的url是啥,或者不清楚某个url最终会对应到哪个jsp文件,无需死记规则,只要善用config-browser-plugin,大多数下不用查阅文档即可快速解决问题。

  • 相关阅读:
    图片懒加载
    python打包后,运行exe程序,报错check_hostname requires server_hostname
    eggjs上传文件,并md5名称保存
    egg-static, 静态资源配置
    js时间转换
    egg中post请求报错invalid csrf token
    egg中sequelize,时区问题,开发时修改表结构
    ImageGrab.grab截图右下角是黑屏
    css 画三角形,悬浮提示
    python 相关
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/how-to-use-convention-and-config-browser-plugin-in-struts2.html
Copyright © 2011-2022 走看看