【问题标题】:Struts 2.3 ignores wildcard actionsStruts 2.3 忽略通配符操作
【发布时间】:2014-01-26 22:26:19
【问题描述】:

我正在设置一个使用 Struts 2.3 和 Tiles 2 的应用程序。一些页面将受到 Struts 的严重驱动(例如,大量的 CRUD),而其他页面将是简单的静态 HTML/JSP 页面。我想设置一些处理特定功能的操作并将所有其他 URL 发送到 default 操作,该操作将根据提供的路径检查是否存在适当的静态页面。如果没有,则会生成 404 错误或类似的错误。

struts.xml 中,我应用了一个看起来应该可以工作的基本配置;然而,Struts 似乎忽略了通配符操作。非通配符操作工作得很好。

这是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>
    <!--
    You could also set the constants in the struts.properties file
    placed in the same directory as struts.xml
    -->
    <constant name="struts.devMode" value="true" />
    <!-- <constant name="struts.mapper.class" value="rest" /> -->

    <constant name="struts.action.extension" value="," />
    <constant name="struts.enable.SlashesInActionNames" value="true"/>
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
    <constant name="struts.patternMatcher" value="regex" />

    <!-- 
    <constant name="struts.convention.action.suffix" value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches" value="true"/>
    <constant name="struts.convention.default.parent.package" value="rest-default"/>
    <constant name="struts.convention.package.locators" value="rest"/>
     -->

    <package name="base" extends="tiles-default" abstract="yes">
        <result-types>
            <result-type name="tiles" default="true" class="org.apache.struts2.views.tiles.TilesResult" />
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
        </result-types>

        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
            <!-- <interceptor name="requestConstants" class="com.ibm.gbs.vdp.constants.ConstantsInterceptor" /> -->

            <interceptor-stack name="mainStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="json" />
                <!-- <interceptor-ref name="session" /> -->
                <!-- <interceptor-ref name="requestConstants" /> -->
            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="mainStack" />

        <global-results>
            <result name="login" type="tiles">login</result>
        </global-results>

    </package>

    <!-- package start -->
    <package name="main" extends="base" namespace="/">
        <action name="login">
            <result type="tiles">login</result>
        </action>

        <action name="logout" class="com.gswt.common.action.LogoutAction">
            <result name="success">login</result>
        </action>

        <action name="*" class="com.installation.action.PageAction">
            <result type="tiles">standard-page</result>
        </action>
    </package>
    <!-- package end -->

    <!-- package start -->
    <package name="licenses" extends="base" namespace="/licenses">

    </package>
    <!-- package end -->

    <!-- package start -->
    <package name="checklists" extends="base" namespace="/checklists">

    </package>
    <!-- package end -->

    <!-- package start -->
    <package name="error" extends="base" namespace="/error">
        <action name="404">
            <result type="tiles">error-404</result>
        </action>
    </package>
    <!-- package end -->

</struts>

下面是我收到的错误示例:

There is no Action mapped for namespace [/] and action name [page] associated with context path []. - [unknown location]
    com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
    org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
    org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:553)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)
    com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:80)
    com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
    com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:997)
    com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.invokeFilters(DefaultExtensionProcessor.java:1079)
    com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.handleRequest(DefaultExtensionProcessor.java:999)
    com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3954)
    com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276)
    com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:945)
    com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592)
    com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:191)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:515)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:306)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:277)
    com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1049)
    com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:643)
    com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1784)
    com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
    com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1656)

我错过了什么或做错了什么?

【问题讨论】:

  • 哪个 url 导致了这个错误?
  • @roman-c,我尝试了多个。这里有两个不起作用: - localhost:9080/page - localhost:9080/some/test/page 我现在配置的方式,任何命中通配符的 URL 都应该提供相同的页面结果。
  • 您是否部署在根上下文中?
  • 是的,我的上下文根是'/'。

标签: regex configuration struts2 action-mapping wildcard-mapping


【解决方案1】:

由于您使用的是advanced wildcards,因此您的操作名称应该是与配置匹配的有效正则表达式。

像这样

<action name="{.*}" class="com.installation.action.PageAction">
   <result type="tiles">standard-page</result>
</action>

【讨论】:

  • 令人惊讶的是,这似乎有效!但是,对于每个请求,我也会在控制台中获得以下堆栈跟踪,这表明有些事情仍然不太正确:pastebin.com/mfWqX5i9。不过你确实解决了问题,所以我会接受答案:-)
  • 此外,文档中的任何地方都没有提到该语法结构,这让事情变得更加令人沮丧!
  • OGNL 有警告设置不需要的参数,这个警告只出现在devMode。您可以尝试根据文档使用带有模式的真实参数名称。
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2016-09-10
  • 2017-01-19
相关资源
最近更新 更多