2015-01-29 5 views
0

В web.xml, если я указал карту сервлета с полным путем, как это:весна сервлет URL-шаблон карта не работает со звездой знак

<servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/view/admin</url-pattern> 
</servlet-mapping> 

Он отлично работает, но если я с помощью звезды знак (*) согласно the specification (глава 12.2):

в дескрипторе развертывания веб-приложений, следующий синтаксис используется для определения отображения:

  • Строка, начинающаяся символом '/' и заканчивающаяся суффиксом '/ *', используется для отображения пути.
  • Строка, начинающаяся с символа '*. Префикс используется как расширение. Пустая строка ("") представляет собой специальный шаблон URL, который точно сопоставляется с корнем контекста приложения , то есть запросами формы http://host:port/ /. В этом случае информация о пути - '/', а путь сервлета и путь контекста - пустая строка ("").
  • Строка, содержащая только символ «/», указывает «сервлет по умолчанию» приложения . В этом случае путь сервлета является URI запроса минус путь контекста , и информация о пути имеет значение null.
  • Все остальные строки используются только для точных совпадений.

Как это:

<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 настраиваемым и контроллер класса

Ниже еще некоторые дополнительные сведения, которые требуют комментариев.

Полный 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.

Я думаю, что это очень запутанным вопрос :-(

Я просто проверить ссылку отображение сервлета и не может получить подсказку, почему это произошло. Может быть какой-то подвох Spring MVC виноват? enter image description here

Таким образом, вопрос стал:?

  • Что причиной этого, и что я должен сделать, чтобы избежать добавления префикса к каждому запросу
+0

Пожалуйста, пост обработчик, который вы ожидаете обрабатывать этот запрос в вашем стеке Spring. –

+2

В основном вы можете разместить полную конфигурацию WebMVC. –

+0

Кажется, все в порядке (просто смотрю на код) ... вы пробовали очистить проект и перераспределить его в свой веб-контейнер? – jmcg

ответ

0

Есть 2 различных проблемы.

Во-первых, как контейнер сервлетов отображает сервлет. Вы правильно интерпретировали это: если сервлет отображается на /view/admin или /view/*, он будет равно получать запрос.

Далее описано, как запрос декодируется и обрабатывается весной DispatcherServlet. Servlet спецификация 3,0 (3,5 Request Path Elements) говорит:

  • когда сервлет отображается в /view/admin сервлете путь /view/admin и информация пути нулевой
  • когда сервлет отображается в /view/* сервлет пути является /view и информация пути ID /admin

Когда DispatcherServlet находит нулевую информацию пути, он ищет пути сервлета в его отображении (и находит свой контроллер), но если информация пути не является нулевой, то предполагается, что сервлет путем является префиксом, который не находится в T он отображает.

Именно по этой причине вы обнаружите, что ваш контроллер находится под /view/view/admin: сначала /view есть по пути сервлета и информации о пути /view/admin - это отображение для контроллера.

Когда вы Сопоставьте DispatcherServlet к /view/*, отображения контроллер не должен содержать путь сервлета = отображение> вы контроллер должен быть /admin

Смежные вопросы