struts2: config-browser-plugin 與 convention-plugin 學習

struts2被不少新手詬病的一個地方在於「配置過於複雜」,相信很多初學者由於這個直接改投Spring-MVC了。convention-plugin、 config-browser-plugin這二個插件的出現,很大程度改善了這個囧境。html

簡言之:convention-plugin採用"約定大於配置」的思想,只要咱們遵照約定,徹底能夠少寫配置甚至不寫配置;而config-browser-plugin則用於方便的瀏覽項目中的全部action及其與jsp view的映射。這二個插件結合起來學習,能很方便的搞定struts2中各類複雜的action-view映射需求。java

1、config-browser-plugin使用apache

<span style="font-size:14px;">
 <dependency>
     <groupId>org.apache.struts</groupId>
     <artifactId>struts2-config-browser-plugin</artifactId>
     <version>2.3.16</version>
 </dependency>

</span>

maven項目的pom.xml中加上這個便可,運行後,瀏覽 http://localhost:8080/{你的項目名稱}/config-browser/ 便可看到當前項目中的全部action 服務器

注:如下內容中,凡是有url的地方,項目名稱假設爲struts2-helloworldapp

若是跑不起來,檢查服務器應用WEB-INF/lib/下是否有struts2-config-browser-plugin-2.3.16.jar 這個文件jsp

2、convention-plugin 使用maven

<span style="font-size:14px;"><dependency>
     <groupId>org.apache.struts</groupId>
     <artifactId>struts2-convention-plugin</artifactId>
     <version>2.3.16</version>
 </dependency></span>

pom.xml中加上這個後,能夠把struts.xml配置文件給幹掉了(或者改個名),部署App,若是啓動正常,則表示環境ok。若是提示缺乏asm 啥類,檢查下面這幾個依賴項,是否也加進來了

<span style="font-size:14px;"><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></span>

2.1 零action的view學習

convention-plugin約定全部的jsp view都放在WEB-INF/content目錄下,在這個目錄下先隨便放一個名爲"no-action.jsp"的jsp文件,裏面隨便寫點啥this

瀏覽 http://localhost:8080/struts2-helloworld/no-actionurl

即:即便沒有對應的Action類,struts2也能按約定正常展示頁面。(固然,這只是開胃小菜,真正應用中,除了作一些純靜態的頁面原型以外,大部分場景,背後仍是要有Action類來支撐的)

2.2 常規映射

建一個HelloWorld.action類

<span style="font-size:14px;">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;
    }

}</span>

解釋一下:

第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.

 

三、攔截器問題

上一篇學習了經過攔截器來處理異常,採用convention插件後,會發現攔截器不起做用(struts.xml中配置了也同樣)

<span style="font-size:14px;"><?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></span>

緣由在於convention-plugin使用後,全部Action再也不繼承自默認defaultStack對應的package,爲了解決這個問題,建議全部Action都繼承自一個自定義的BaseAction類,而後在BaseAction上加上@ParentPackage("default"),讓全部Action強制繼承自struts.xml中定義的default package

<span style="font-size:14px;">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());

}</span>

基本用法就是這些,若是不清楚Action最終出來的url是啥,或者不清楚某個url最終會對應到哪一個jsp文件,無需死記規則,只要善用config-browser-plugin,大多數下不用查閱文檔便可快速解決問題。

做者:菩提樹下的楊過
出處:http://yjmyzz.cnblogs.com
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。


另外說一下我遇到的問題:缺乏asm三個架包所致使(asm-3.3.jar,asm-commons-3.3.jar,asm-tree-3.3.jar)一直404錯誤,還有就是我犯了一個嚴重的錯誤:沒看錯誤提示,致使我在哪裏啥弄了一天,痛苦。。。。

相關文章
相關標籤/搜索