1

我在从操作中删除@Action@Result约定插件注释并将其替换为struts.xml.

package com.microed.cars.web;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

public class HomeAction extends ActionSupport {

    @Action(results = {
            @Result(location = "/jsp/home.jsp")
    })
    @Override
    public String execute() throws Exception {
        return super.execute();
    }
}

当这些注释存在时,我可以成功访问localhost:port/context/home.action

当我删除注释时,我得到“没有为操作定义结果.....”struts 错误,尽管 struts.xml 中有一个“全部捕获”结果 - 整个 struts.xml 如下:

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

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.convention.package.locators" value="web"/>
    <constant name="struts.convention.default.parent.package" value="beetroot"/>

    <package name="beetroot" extends="json-default">

        <action name="home" class="homeAction">
            <result>/jsp/home.jsp</result>
        </action>

        <action name="cars" class="baseCarsAction">
            <result name="input" type="json">
                <param name="root">autoResults</param>
                /jsp/home.jsp
            </result>
        </action>
    </package>
</struts>

它扩展了 json-default 因为我需要 json 结果类型来实现自动完成功能。

我不知道为什么它没有为homeAction班级选择动作映射。我知道struts.xml正在阅读,因为如果我删除动作映射“汽车”,那么自动完成功能将被禁用(但这需要我试图删除的注释以验证这一点)。

我知道“未定义结果”是一个简单的错误,通常是由拼写/大写错误引起的,但这里绝对不是这种情况,它似乎只是忽略了整个“家庭”动作映射。

单步执行时DefaultActionInvocation.createResult,根本没有“结果”可供它尝试匹配。

4

1 回答 1

2

就目前而言,cars行动声明无效(IMO,这也没有意义):

<action name="cars" class="baseCarsAction">
  <result name="input" type="json">
    <param name="root">autoResults</param>
    <param name="location">/jsp/home.jsp</param>
  </result>
</action>

也就是说:如果它是 JSON 结果,JSP 没有帮助,它会被忽略(或完全拒绝,我不确定它是否是错误)。单个结果将JSON 或 HTML。

将日志记录提高到DEBUG级别以捕获启动错误以缩小可能原因的范围。

如果baseAction在您的 Spring 配置文件中进行了配置(如果您使用 Spring 注释进行注入,则不需要),则该home操作的配置是有效的。

如果您实际上没有使用约定插件,我会谨慎部署它:它改变了操作的映射方式;它可能会对周围的应用程序产生影响并导致问题。坚持一个或另一个,避免两者——这使得推理应用程序行为的来源变得更加困难。

不相关,但我建议将 JSP 页面放在下面/WEB-INF以禁止直接客户端访问。

于 2013-01-29T15:33:17.150 回答