【发布时间】:2015-03-28 05:23:20
【问题描述】:
在web.xml 中,如果我使用这样的完整路径指定 servlet 映射:
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/view/admin</url-pattern>
</servlet-mapping>
它工作正常,但如果我根据the specification(第 12.2 章)使用 星号(*):
在 Web 应用程序部署描述符中,使用以下语法来定义 映射:
- 以“/”字符开头并以“/*”后缀结尾的字符串用于路径映射。
- 以‘ * 开头的字符串。 ' 前缀用作扩展映射。 空字符串 ("") 是一种特殊的 URL 模式,它完全映射到 应用程序的上下文根,即http://host:port// 形式的请求。在这种情况下,路径信息是“/”,servlet 路径和上下文路径是 空字符串(“”)。
- 仅包含 ' / ' 字符的字符串表示 应用。在这种情况下,servlet 路径是请求 URI 减去上下文路径 并且路径信息为空。
- 所有其他字符串仅用于完全匹配。
像这样:
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/view/*</url-pattern>
</servlet-mapping>
地图规则不起作用,glassfish 给出的日志如下:
[glassfish 4.0] [WARNING] [] [org.springframework.web.servlet.PageNotFound] [tid: _ThreadID=19 _ThreadName=http-listener-1(2)] [timeMillis: 1422503740955] [levelValue: 900] [[No mapping found for HTTP request with URI [/view/admin] in DispatcherServlet with name 'spring']]
应该是什么问题?(我已经找到原因,请继续阅读)
有关 Spring MVC 配置和控制器类的其他信息
以下是 cmets 所需的更多附加信息。
完整的web.xml 是:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/view/*</url-pattern>
</servlet-mapping>
</web-app>
这里是spring-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd ">
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="com.ksider.service.searchserver.controller"></context:component-scan>
<bean id="freemarkerSettings" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/view/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="number_format">0.##</prop>
<prop key="classic_compatible">true</prop>
</props>
</property>
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
</map>
</property>
</bean>
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<!-- <property name="viewNames" value="*.ftl"/> -->
<property name="contentType" value="text/html; charset=utf-8"/>
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
<property name="order" value="1"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="requestContextAttribute" value="rc"/>
</bean>
</beans>
这是控制器:
package com.ksider.service.searchserver.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class AdminController {
@RequestMapping(value = "/view/admin", method = RequestMethod.GET)
public String getAdminPage(ModelMap modelMap){
modelMap.put("Msg","hello");
return "admin/index";
}
}
进度更新:
如果我使用,我喜欢是什么原因造成的
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/view/*</url-pattern>
</servlet-mapping>
而不是
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/view/admin</url-pattern>
</servlet-mapping>
我应该如何为每个请求添加前缀 /view,例如
如果我想查询http://localhost:8080/view/admin,我应该查询http://localhost:8080/view/view/admin。
我认为这是一个非常令人困惑的问题:-(
我只是检查了 servlet 映射参考,但不知道为什么会发生这种情况。也许是一些 Spring mvc 的诡计?
所以,问题变成了:
- 这是什么原因?我应该怎么做才能避免为每个查询添加前缀?
【问题讨论】:
-
请在您的 Spring 堆栈中发布您希望处理此请求的处理程序。
-
基本上发布您的完整 WebMVC 配置。
-
一切似乎都很好(只看代码)...您是否尝试过清理项目并重新部署到您的 Web 容器?
-
您的模板在哪里?它是否等于您的
? -
@s.kwiotek 我已经找到了造成这种情况的原因,但我仍然感到困惑,请阅读更新
标签: java spring spring-mvc servlets url-pattern