我在尝试将Spring MVC和Maven集成到Google AppEngine网络应用程序时遇到了一个奇怪的问题。
这是我的web.xml
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/webmvc-config.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
这是我的SpringMVC配置文件
<context:annotation-config /> <context:component-scan base-package="com.mypackage" /> <mvc:annotation-driven/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/view/" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView" />
这是我的控制器:
@Controller @RequestMapping(value = "/hello") public class HelloController { @RequestMapping(method = RequestMethod.GET) public String helloGet(ModelMap map) { map.put("name", "seb!"); return "hello"; } }
这是我的视图,位于webapp / WEB-INF / jsp / view / hello.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello Controller</title> </head> <body> <h1>Hello ${name}!</h1> </body> </html>
这是我的pom包含对SpringMVC 3.0.3,servlet-api 2.5,jstl 1.2的依赖关系
我一直在
WARNING: No mapping found for HTTP request with URI [/WEB-INF/jsp/view/hello.jsp] in DispatcherServlet with name 'dispatcher'
当我点击localhost:8080 / hello时,我不知道为什么。是由于GAE还是我在某些配置中缺少任何内容?
更新 :如果我将来自/ app / *的URL分派到Spring Dispatcher,则像这样更改我的web.xml:
<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping>`
可以,但是我只想使用登录页面并使用应用程序的根目录
我过去曾遇到过这个问题。如果我没记错的话,它在部署时可以正常工作,但是在开发服务器上失败了。我的解决方案是将调度程序servlet映射到/app/*而不是/*。
/app/*
/*
这将导致/app应用程序中的所有URL路径。如果要摆脱这种情况,请使用URL重写。
/app
在web.xml:
web.xml
<filter> <filter-name>urlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>urlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
和urlrewrite.xml:
urlrewrite.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"> <urlrewrite default-match-type="wildcard"> <rule> <from>/</from> <to>/app/</to> </rule> <rule> <from>/_ah/**</from> <to>/_ah/$1</to> </rule> <rule> <from>/**</from> <to>/app/$1</to> </rule> <outbound-rule> <from>/_ah/**</from> <to>/_ah/$1</to> </outbound-rule> <outbound-rule> <from>/app/**</from> <to>/$1</to> </outbound-rule> </urlrewrite>