struts2 - Struts 2 Tile 和 REST 插件

标签 struts2 tiles

我正在尝试使用 Tiles 和 REST 插件运行我的 Struts2 项目,但我无法让它工作。

我已经查看了两者的文档,我认为我做得对。这是我的文件:

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app metadata-complete="true" version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- listeners -->

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
    </listener>

    <!-- context params -->
    <context-param>
        <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
        <param-value>/WEB-INF/tiles-tradesman.xml</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring-tradesman.xml</param-value>
    </context-param>


    <!-- filters -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <!-- filter mappings -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />

    <!-- RESTful plugin setup -->
    <constant name="struts.mapper.class" value="rest" />
    <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="tp"/>

    <package name="tradesman" namespace="/beta/tradesman" extends="default">

        <result-types>
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>
        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
        </interceptors>

    </package>
</struts>

JobAlertsController.java
package uk.co.ratedpeople.tp;

import com.opensymphony.xwork2.ActionSupport;
import java.util.logging.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

public class JobAlertsController extends ActionSupport {

    private static final Logger LOGGER = Logger.getLogger(JobAlertsController.class.getName());

    @Action(results={
        @Result(name = SUCCESS, location = "tradesman.page.jobalerts", type = "tiles")
    })
    public String index() {
        LOGGER.info("executing index action...");
        LOGGER.info("leaving index action...");
        return SUCCESS;
    }
}

当我尝试运行该项目时,出现此错误:
SEVERE: Exception starting filter struts2
Unable to load configuration. - [unknown location]
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437)
    at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:195)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4542)
    at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5220)
    at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5215)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: Unable to load configuration. - [unknown location]
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:69)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:380)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:424)
    ... 13 more
Caused by: The Result type [tiles] which is defined in the Result annotation on the class [class uk.co.ratedpeople.tp.JobAlertsController] or determined by the file extension or is the default result type for the PackageConfig of the action, could not be found as a result-type defined for the Struts/XWork package [uk.co.ratedpeople.tp#rest-default#] - [unknown location]
    at org.apache.struts2.convention.DefaultResultMapBuilder.createResultConfig(DefaultResultMapBuilder.java:427)
    at org.apache.struts2.convention.DefaultResultMapBuilder.createFromAnnotations(DefaultResultMapBuilder.java:399)
    at org.apache.struts2.convention.DefaultResultMapBuilder.build(DefaultResultMapBuilder.java:200)
    at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:864)
    at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:650)
    at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:335)
    at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:215)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)
    ... 15 more
27-Jul-2011 17:07:07 org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext

我确信我在做一些非常愚蠢的事情,但我自己看不到。任何人?

最佳答案

首先,我建议将您的 struts 操作放在一个简单地称为 struts 的包中,在使用标准约定插件架构时,我遇到的配置问题要少得多。将您的操作移动到一个包中,例如:

uk.co.ratedpeople.struts



代替

uk.co.ratedpeople.tp;



开箱即用的配置越少,您通常情况就越好。
这也消除了对这个的需要:
<constant name="struts.convention.package.locators" value="tp"/>

其次,您的部分问题与您的 xml 配置有关:
<struts>
    <constant name="struts.devMode" value="true" />

    <!-- RESTful plugin setup -->
    <constant name="struts.mapper.class" value="rest" />
    <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="tp"/>

    <package name="tradesman" namespace="/beta/tradesman" extends="default">

        <result-types>
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>
        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
        </interceptors>
</package>

试试这样的事情(如果你按照之前的建议移动了你的 Action ):
<struts>
    <constant name="struts.devMode" value="true" />

    <!-- RESTful plugin setup -->
    <constant name="struts.mapper.class" value="rest" />
    <constant name="struts.convention.action.suffix" value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches" value="true"/>
    <constant name="struts.convention.default.parent.package" value="tradesman"/>

    <package name="tradesman" namespace="/beta/tradesman" extends="rest-default">
        <result-types>
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>
    </package>
</struts>

注意常量 name="struts.convention.default.parent.package"value="tradesman"它指的是它下面的包,它定义了你的结果类型并扩展了rest-default。这应该可以消除您的切片结果定义错误。

我也遇到了使用 web.xml 中的 struts 过滤器的问题,我将更改为:
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

到:
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

关于struts2 - Struts 2 Tile 和 REST 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847667/

相关文章:

java - 在javascript中调用的Struts2 Action 无法获取 session 对象

css - 在struts2中隐藏loader(spin)

HTML/CSS 平铺边框(左、下、右)

css - 如何创建网格/平铺 View ?

javascript - 平铺叠加动画 - Bing/Google

struts2 - Struts 2 Ajax url 和 div 标签无法与 struts 文件标签一起使用

javascript - 如何在 Struts 2 中返回 JSON 数组

spring-boot - Spring Boot + Tomcat Embedded + Struts 2 - 不调用 JSP

windows-phone-7 - 离线模式下带有自定义图层的 Windows Phone 7 map 控制

jquery - 在html中模拟翻转动态磁贴