使用Tomcat Maven插件的Struts 2应用程序返回404错误

时间:2017-06-11 17:06:26

标签: java maven struts2

首先,关于这个特定的应用程序设置和错误,有很多问题。但是,大多数(如果不是全部)看似重复的问题都通过添加丢失的罐子来解决。我正在使用Maven作为我的依赖项,无论如何,我的外部库列表看起来很完整。

话虽如此,在我的情况下,神秘来自于Tomcat Maven插件似乎在基于

正常工作的事实

console output

然而,访问http://localhost:8080/sure/hello让我痛苦地“资源不可用”错误。这让我得出结论,这是一个映射问题,但我的web.xmlstruts.xml对我来说都很好看。

的web.xml

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

struts.xml中

<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="hello" class="com.crace.HelloAction">
            <result name="success">/web/WEB-INF/index.jsp</result>
        </action>
    </package>

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

的pom.xml

<groupId>com.crace.strangewave</groupId>
<artifactId>Sure</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sure</name>
<packaging>war</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
                <port>8080</port>
                <path>/</path>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.5.5</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>

的index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        <s:property value="greeting"/>
    </body>
</html>

HelloAction.java

public class HelloAction extends ActionSupport {

    private String greeting;

    private static final Logger logger = Logger.getLogger(HelloAction.class);

    public String execute() throws Exception {

        setGreeting("Hello World!");

        // logs debug message
        if (logger.isDebugEnabled()) {
            logger.debug("execute()!");
        }

        // logs exception
        logger.error("This is Error message", new Exception("Testing"));


        return SUCCESS;
    }

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }

至于日志记录,我唯一能找到的嵌入式版本会呈现如下信息:

0:0:0:0:0:0:0:1 - - [10/Jun/2017:13:45:38 -0400] "GET /sure/hello HTTP/1.1" 404 971 http-bio-8080-exec-3 1
0:0:0:0:0:0:0:1 - - [10/Jun/2017:13:45:38 -0400] "GET /sure/hello HTTP/1.1" 404 971 http-bio-8080-exec-5 2

编辑:我提供了Tomcat管理器的屏幕截图,显示我的战争已正确部署到服务器。再次,这是一个映射问题(因此404),但我无法看到我在映射中出错的地方!

Tomcat manager app

2 个答案:

答案 0 :(得分:0)

尝试此网址http://localhost:8080

如果您仍然遇到资源不可用错误,您可以尝试以下操作:

  1. 右键单击服务器,然后单击属性

  2. 如果location是工作空间元数据,请单击开关位置,使其类似于

    server properties

  3. 点击“应用/确定”

  4. 现在双击服务器。
  5. 选择服务器位置作为使用tomcat安装

    See Yellow highlight on image

  6. 保存重启服务器并尝试。

答案 1 :(得分:0)

我相信您需要根据您是否要运行“tomcat7:deploy”和“tomcat7:run-war”来配置不同的Tomcat Maven插件。我试图做后者。但我正在设置我的项目来运行前一个命令。后一个命令需要非常少的配置。差异太大,无法列举,所以如果有人感兴趣,只需将我的问题中的pom与我的答案进行比较。

的pom.xml

<groupId>com.crace</groupId>
<artifactId>sure</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sure</name>
<packaging>war</packaging>

<build>
    <finalName>sure</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>

唯一的问题是,我不相信添加这些设置会导致我的错误。但是我花了很多时间摆弄这些多余的配置设置。所以我想最后要注意这一点很重要。

据我所知,唯一的问题是我把index.jsp(我的结果页面)放在WEB-INF文件夹中。将它移动到我的web文件夹并在struts.xml中更改路径就可以了。

struts.xml中

<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="hello" class="com.crace.HelloAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>
编辑:Roman C,从他对我的问题的评论中,帮助我意识到我以前的解决方案仅仅是一种解决方法。再看一下,我意识到我的项目结构都搞砸了。 Struts正在我的webapp文件夹中查找我的jsp文件。所以我只是将我的WEB-INF文件夹移到我的webapp文件夹中,然后将我的jsp文件放在里面,瞧!有用。我的struts.xml现在看起来像:

<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="hello" class="com.crace.HelloAction">
            <result name="success">/WEB-INF/content/hello.jsp</result>
        </action>
    </package>
</struts>

现在我的项目结构如下:

Project Structure