【问题标题】:spring RequestMapping 404 status [duplicate]spring RequestMapping 404状态[重复]
【发布时间】:2015-01-29 15:54:13
【问题描述】:

好的,我知道这里有 20 个帖子有同样的问题,但似乎没有一个对我有帮助,所以这可能是重复的,但我已经浏览了所有其他帖子,但没有一个解决我的问题,所以一定是我做错了,或者我没有对前面提到的问题的答案进行正确的修改。

我正在尝试使用 Spring 制作一个小型应用程序,我仍在尝试使用它,但我花了大约 4 天的时间试图找出问题所在,但我无法解决。每当我尝试从控制器取回 jsp 时,我仍然会收到 HTTP 状态 404。只有通过 Tomcat 的 404 状态,没有别的......

WebAppController:

@Controller
public class WebAppController {

    @RequestMapping(value="/login", method = RequestMethod.GET)
    public String login() {
        System.out.println("You have entered the login maprequest");
        return "test1";
    }

}

web.xml:

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <display-name>Hotel Application</display-name>
    <servlet>
        <servlet-name>WebApp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>WebApp</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

webApp.xml:

   <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    <context:component-scan base-package="com.iquestgroup" />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
</beans>

此配置适用于一个简单的 maven 项目,其中仅包含上述内容。问题是,完全相同的事情在具有 3 个模块(持久性、服务和 webapp)的 maven 项目中不起作用。在 webapp 中,我复制了完全相同的内容,当我在服务器上运行它时,我得到 404 http 状态......即使模块正在成功构建。

L.E.接受的答案的第一部分是指那些刚开始使用 Spring 的人所犯的常见 servlet 映射错误。我的问题与它无关,我最终在初步回答后将其删除。为了不让读者感到困惑,接受的答案的第一部分是指以下代码:

<servlet-mapping>
     <servlet-name>dispatcher</servlet-name>
     <url-pattern>/*</url-pattern>
</servlet-mapping>

【问题讨论】:

  • 您编辑了问题/* 不可能!现在答案毫无意义。它说要更改&lt;url-pattern&gt;/*&lt;/url-pattern&gt;,但*不会出现* 问题
  • @StephenP 这个问题是在初步回复后编辑的,我在答案的评论中宣布了这一点。保留 /* 似乎毫无意义,即使那不是我的问题,而且 Stack Overflow 上还有更多问题正是指这一点。我理解你的观点,我认为你是对的,这可能会造成混淆,所以我会在问题的末尾添加一个提及。

标签: java spring jsp spring-mvc


【解决方案1】:

改变

<url-pattern>/*</url-pattern>

<url-pattern>/</url-pattern>

目前,由于/*,您映射的DispatcherServlet 被标记为处理所有请求。这意味着它还将尝试处理发送到/WEB-INF/jsp/test1.jsp 的请求。它显然没有处理程序并且会失败。

模式/ 的特殊之处在于,如果没有其他模式匹配,它是默认的回退。如果有一个映射到请求路径的Servlet,则将在映射的DispatcherServlet 之前选择该Servlet

大多数(可能是所有)Servlet 容器都使用Servlet 进行映射,以处理使用url-pattern*.jsp 呈现的JSP。这将优先于映射到/DispatcherServlet

如果您在这些更改后仍然收到 404,那么有几种可能性。

Spring 在 INFO 级别记录它注册的任何处理程序方法(@Controller bean 中的@RequestMapping 注释方法)。如果您在日志中没有看到任何这些,那么您的 Web 应用程序尚未正确/成功部署。

如果您的 Servlet 容器嵌入在您的 IDE 中,请检查已部署应用程序的相应选项卡/视图。如果它是独立的,请检查您生成的 .war 文件是否在适当的目录中并正确展开。

【讨论】:

  • 我将 / 更改为 /* 从另一个与我类似的问题的答案中,我以前像你说的那样,但它仍然不起作用。
  • @drag 然后我们需要更多细节。将您的 Spring 日志转换为 DEBUG,发送请求并将结果作为对您问题的编辑发布。
  • @drag 另外请说明您将请求发送到哪个 URL。
  • 我正在尝试发送到“localhost:8080/HotelApplication”或“localhost:8080/HotelApplication/test1”,但没有任何反应。 (HotelApplication 是项目的名称)。我还在想办法把spring日志变成Debug,我之前没用过,也没有在Spring中设置过,所以可能需要一点时间......
  • @DragosGeornoiu 描述什么都没有发生。查看您的 Servlet 容器日志。当您启动应用程序时,他们会记录什么?你的UserController 在哪个包中?
【解决方案2】:

首先,您可以使用任何根控制器进行监听/请求,如下所示。

@Controller
@RequestMapping ("/")
public class RootCtrl {

Logger logger = Logger.getLogger(RootCtrl.class);

@RequestMapping (value = "/", method = {RequestMethod.GET, RequestMethod.POST})
public String index(ModelMap model) {

    // redirect to login page
    return "redirect:admin/index";
}}

使用该控制器,您可以将所有请求映射到 root。比您可以将请求重定向到您的登录控制器。

这都是关于请求映射的。你的 loginController 或 webController 应该监听一个之前应该指定的请求。在我的应用程序中,登录控制器监听 /admin 请求路径。比,我的登录控制器是这样的:

@Controller
@RequestMapping ("/admin")
public class LoginCtrl {

@RequestMapping (value = "/index", method = {RequestMethod.GET, RequestMethod.POST})
public String index(@RequestParam (value = "captchaId", defaultValue = "") String captchaId, ModelMap model, HttpServletRequest request, HttpServletResponse response) {

    if(StringUtils.isNullOrEmpty(captchaId)){
        captchaId = RandomGUID.getRandomGUID();
    }

    model.addAttribute("captchaId", captchaId);

    // redirect to login page
    return "login";
}

当您将从该路径获得请求时:localhost/SampleProject/admin/index.映射将起作用。

【讨论】:

  • 感谢您的回答,但控制器没问题,它不是很复杂,只是一个测试,看看一切是否正常(这次不是)。问题是我没有按照@Sotirios Delimanolis 的建议正确部署应用程序
猜你喜欢
  • 2014-04-24
  • 2017-09-18
  • 1970-01-01
  • 2017-12-25
  • 2021-10-24
  • 1970-01-01
  • 2017-01-16
  • 2013-04-26
  • 1970-01-01
相关资源
最近更新 更多