2014-12-01 164 views
6

好吧,我知道在这里有20个帖子有同样的问题,但没有一个似乎帮助我,所以这可能是重复的,但我已经读过所有其他帖子和他们都没有解决我的问题,所以肯定有一些我做错了,或者我没有对前面提到的问题做出正确的修改。spring请求映射404状态

我正在尝试使用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> 
+0

您编辑问题'/ *'出了问题!现在答案没有意义。它说要更改'/*',但_ ***不会再出现在问题***中。 – 2016-05-16 22:26:11

+0

@StephenP这个问题在初步回应后进行了编辑,我在回答的评论中宣布。保留/ *似乎毫无意义,尽管这不是我的问题,Stack Overflow上还有许多问题,这些问题完全是指。 我理解你的观点,我认为你是对的,这可能会让人困惑,所以我会在问题的最后提到这一点。 – 2016-05-16 22:59:14

回答

6

变化

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

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

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

模式/是特殊的,因为如果没有其他模式匹配,它是默认的后备。如果有映射到请求路径的Servlet,那么Servlet将在映射DispatcherServlet之前选择。

大部分(可能全部)Servlet容器配备了Servlet映射处理与*.jspurl-pattern渲染的JSP。这将优先于DispatcherServlet映射到/

如果你是仍然这些变化后获得404,那么有几种可能性。

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

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

+0

我改变了/ /从一个类似于我的另一个问题的答案,我以前就像你说的那样,但它仍然不起作用。 – 2014-12-01 15:53:38

+0

@drag然后我们需要更多的细节。将您的Spring日志转为DEBUG,发送请求并将结果作为编辑发布到您的问题。 – 2014-12-01 15:57:09

+0

@drag同时请说明您向哪个URL发送请求。 – 2014-12-01 16:04:06

1

首先,你可以用下面的任何根控制器来监听/请求。

@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"; 
}} 

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

这完全是关于请求映射。您的loginController或webController shold监听之前应该指定的请求。在我的应用程序中,登录控制器监听/管理请求路径。比,我的登录控制器是这样的:

@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。映射将起作用。

+0

谢谢你的回答,但控制器没问题,它不是很复杂,只是一个测试,看看是否一切正常(而这次不是)。问题在于我没有像@Sotirios Delimanolis推断的那样正确部署应用程序 – 2014-12-02 16:17:55