【问题标题】:spring servlet url-pattern map not working with star signspring servlet url-pattern map 不适用于星号
【发布时间】: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


【解决方案1】:

有两个不同的问题。

首先是 servlet 容器如何映射到 servlet。您已经正确解释了:如果 servlet 映射到 /view/admin/view/*,它将同样接收请求。

接下来是springDispatcherServlet是如何解码和处理请求的。 Servlet 规范 3.0(3.5 请求路径元素)说:

  • 当 servlet 映射到 /view/admin 时,servlet 路径为 /view/admin 且路径信息为空
  • 当 servlet 映射到 /view/* 时,servlet 路径为 /view 和路径信息 id /admin

DispatcherServlet 找到空路径信息时,它会在其映射中查找 servlet 路径(并找到您的控制器),但如果路径信息不为空,则假定 servlet 路径是不在映射。

这就是您在 /view/view/admin 下找到控制器的原因:首先 /view 被 servlet 路径吃掉,路径信息 /view/admin 是控制器的映射。

当您将DispatcherServlet 映射到/view/* 时,控制器映射不能包含servlet 路径=> 您的控制器映射应该是/admin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多