我遇到了app引擎上的servlet映射问题。
详情
使用我的web.xml配置文件我将URL模式“/ i”映射到我的WAR路径的根目录上的重定向到info.html。
当我在本地运行并访问url localhost:8888 / i时,Web服务器正确地重定向到info.html站点。但当我推送到app引擎并尝试访问www.mysite.com/i时,我得到了404 错误:NOT_FOUND
问题
1.为什么我的服务器映射在本地但不是远程工作?
2.我是否有另一种方法可以将像www.mysite.com/i这样的网址模式映射到我的战争路径中的静态文件中?
*虽然我在app引擎上,但我认为这与其他通过web.xml使用servlet-mappings的Java服务器类似。我也知道映射到静态html文件可能看起来很奇怪,但目前我没有加载任何动态内容。
代码示例
下面我已经包含了我的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_2_5.xsd" version="2.5">
<servlet>
<servlet-name>Info</servlet-name>
<jsp-file>info.html</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>Info</servlet-name>
<url-pattern>/i</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
答案 0 :(得分:1)
请记住,AE并不完全相同:
默认情况下,App Engine会将WAR中的所有文件作为静态文件提供 WEB-INF /中的JSP和文件除外的文件。对URL的任何请求 path匹配一个静态文件直接将文件提供给 浏览器 - 即使路径也匹配servlet或过滤器映射。您 可以配置App Engine将哪些文件视为静态文件 appengine-web.xml文件。
来自https://developers.google.com/appengine/docs/java/gettingstarted/staticfiles
配置appengine-web.xml的说明在https://developers.google.com/appengine/docs/java/config/appconfig
我会尝试明确声明:
<static-files>
<include path="info.html" />
</static-files>
如果这不起作用,只会将我的.html页面改为jsp页面(即使没有动态内容)。
如果这不起作用,请尝试从servlet中转发html页面的RequestDispatcher,参见http://www.jguru.com/faq/view.jsp?EID=1310997
顺便说一句,我的经验是devmode服务器和部署的服务器有时会以不同的方式解析文件,即使appengine-web.xml是相同的。
答案 1 :(得分:0)
静态文件,逐字提供给用户的文件(如图像,CSS或JavaScript)与部署描述符中提到的路径分开处理。无论部署描述符中的servlet和过滤器映射,对URL路径的请求都与WAR 中被视为静态文件的文件的路径相匹配,该文件将为该文件提供服务。您可以使用appengine-web.xml文件从那些被视为静态文件的文件中排除文件。
也就是说,如果要将.html映射到URL,则必须确保它不是静态的;因为我们知道静态文件是为提供的,无论servlet和过滤器映射是什么。
为此,您必须使用以下命令将其从静态文件中排除:
<static-files>
<exclude path="/**.html"/>
</static-files>
这会使.html文件成为资源文件(默认情况下所有文件都是静态文件和资源文件;除了.jsp文件和web-inf文件夹中的文件)。
但遗憾的是,仍然不会让App Engine获取.html文件的URL映射(使用'jsp-file'定义)。很可能是因为servlet映射最终指向servlet,而为每个.jsp文件生成servlet,对于.html文件(或任何其他文件)也是如此。
我能想到的唯一解决方案是将.html文件重命名为.jsp(并删除静态文件排除;您不再需要它)。这样您就可以将其映射到任何URL。
有趣的是,您可以将非.jsp文件映射到开发服务器上的URL;只是与App Engine的另一个不一致。 ;)