资源未找到错误404

时间:2014-10-23 19:28:14

标签: java struts2

我正在尝试在struts2上运行一个Web应用程序示例,我正面临一个问题。 这是代码 的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://java.sun.com/xml/ns/javaee" 
       xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
       id="WebApp_ID" version="3.0">

       <display-name>Struts 2</display-name>
       <welcome-file-list>
          <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
       <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
   </filter>

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

的index.jsp

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
       pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
       <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>Hello World</title>
    </head>
    <body>
       <h1>Hello World From Struts2</h1>
       <form action="abc">

      <label for="name">Please enter your name</label><br/>
      <input type="text" name="name"/>
      <input type="submit" value="Say Hello"/>
   </form>
</body>
</html>

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" />
   <package name="helloworld" extends="struts-default namespace="/">

      <action name="abc" 
            class="com.junaid1.struts2.HelloWorldAction" 
            method="execute">
            <result name="success">HelloWorld.jsp</result>
            <result name="error">/oops.jsp</result>
      </action>
   </package>
</struts>

HelloWorldAction.java

package com.junaid1.struts2;

public class HelloWorldAction{
       private String name;

       public String execute() throws Exception {
          return "success";
       }

       public String getName() {
          return name;
       }

       public void setName(String name) {
          this.name = name;
       }
    }

当我在tomcat服务器上执行这个项目时,它会很好地显示index.jsp页面。这个页面有一个表单。当我按下提交按钮时,它会显示错误消息“请求的资源不可用”,并显示消息“/ test1 / abc”。 abc是操作的名称,不会调用此操作。在发布这个问题之前,我已经搜索了很多。起初我以为我可能会遗漏一些库,但这对我来说似乎不是问题,因为我使用maven进行依赖管理。这是我的pom.xml。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>test1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
      </plugin>  
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.3.16</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
  </dependencies>
</project>

提前致谢。 项目结构的链接是s17.postimg.org/axpn8cxbz/error.png

2 个答案:

答案 0 :(得分:1)

您可以看到索引页面,因为它是由Web容器Tomcat显示的,并且它没有Struts标记(就像没有Struts框架的任何其他Web项目一样)。

浏览器网址显示/test1/。然后按下提交按钮发出请求/test1/abc,它被struts2过滤,但是在命名空间abc和默认命名空间中都找不到名为/的操作,并且您没有任何具有该路径的资源,因此您确实遇到了404错误。

您可能会说在默认命名空间中使用名称abc配置了操作。但是这个配置在运行时不可用,包名也应该是包struts-default

struts.xml文件应位于类路径上,这意味着在srcresources文件夹中。编译时将其复制到编译器输出文件夹中。构建后,它将从编译器输出文件夹复制到WEB-INF/classes。这两个文件夹是临时生成的,可以在进程之前删除,因此如果源文件夹中没有struts.xml,那么在运行应用程序时就会丢失此文件。

另请注意,您在结果中使用的webcontent文件夹中没有任何JSP页面。

答案 1 :(得分:0)

首先你应该在web.xml中使用

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

不推荐使用org.apache.struts2.dispatcher.FilterDispatcher

请查看此example