请求的资源不可用,Struts 2中的404状态码

问题描述 投票:0回答:2

我正在尝试在 Struts 2 中运行 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
页面。该页面有一个表格。当我按下提交按钮时,它给出一个错误,指出
"the requested resource is not available"
并带有消息
"/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

java struts2 http-status-code-404
2个回答
1
投票

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

浏览器 URL 显示

/test1/
。然后你通过按提交按钮发出请求
/test1/abc
,它被struts2过滤,但它在命名空间
abc
和默认命名空间中都找不到名称为
/
的操作,并且你没有具有该路径的任何资源,因此您会收到 404 错误。

您可能会说在默认命名空间中使用名称

abc
配置了操作。但是这个配置在运行时不可用,包名称也应该是你的包扩展的
struts-default

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

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


0
投票

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

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

因为

org.apache.struts2.dispatcher.FilterDispatcher
已被弃用。

请看一下这个示例

© www.soinside.com 2019 - 2024. All rights reserved.