好的,我知道这里有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>
答案 0 :(得分:6)
更改
<url-pattern>/*</url-pattern>
到
<url-pattern>/</url-pattern>
目前,由于DispatcherServlet
,您的映射/*
被标记为处理所有请求。这意味着它还将尝试处理分派给/WEB-INF/jsp/test1.jsp
的请求。显然它没有处理器并且会失败。
模式/
的特殊之处在于,如果没有其他模式匹配,则它是默认的回退。如果Servlet
映射到请求路径,则会在映射Servlet
之前选择DispatcherServlet
。
大多数(可能是所有)Servlet容器都映射了Servlet
来处理url-pattern
*.jsp
DispatcherServlet
的渲染JSP。这将优先于/
映射到@RequestMapping
。
如果您在这些更改后仍然获得404,那么有一些可能性。
Spring在INFO级别记录它注册的任何处理程序方法(@Controller
bean中注释的.war
注释方法)。如果您在日志中看不到任何内容,那么您的网络应用程序尚未正确/成功部署。
如果您的Servlet容器嵌入在IDE中,请检查部署的应用程序上的相应选项卡/视图。如果它是独立的,请检查生成的{{1}}文件是否在相应的目录中并正确扩展。
答案 1 :(得分: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";
}}
使用该控制器,您将所有请求映射到root。您可以将请求重定向到您的登录控制器。
关于请求映射的全部内容。您的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。映射将起作用。