Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring MVC 2.5, не отрабатывает dispatch view name


Автор: UnicornMirage 27.8.2009, 23:03
Привет.
Использую Spring MVC 2.5 и annotation based controllers.
Тоесть например есть некий контроллер, который маппится на некий url:

Код

@Controller
public class SomeController {

   @RequestMapping(value = "/someController.do")
   public ModelAndView getView() {
         return new ModelAndView("somePage");  // view resolver настроен так, что редиректится потом на /somePage.jsp
   }
}



Соответственно в web.xml все такие контроллеры обрабатывает spring mvc servlet по такой маске:

Код

<servlet-mapping>
   <servlet-name>springmvc</servlet-name>
   <url-pattern>*.do</url-pattern>
</servlet-mapping>


Так вот, мне например не нравится маска *.do, и я хочу чтобы все мои контроллеры обрабатывались по маске *
Если так сделаю:

Код

<servlet-mapping>
   <servlet-name>springmvc</servlet-name>
   <url-pattern>/*</url-pattern>
</servlet-mapping>



То при GET запросе метод SomeController.getView вызовется нормально. Затем ViewResolver правильно припишет к имени вьюхи расширение jsp. Но вот потом request dispatcher эту somePage.jsp уже не находит.

Вероятно почему не находит - потому что он опять пытается по маске * определить среди контроллеров нужный маппинг на запрос уже страницы somePage.jsp, а такого контроллера нет!

Как быть? Как заставить, чтобы после отработки контроллера в этом случае нормально шел форвард на нужную jsp?
В принципе наверное в моем случае это невозможно? Так как forward на jsp страницы также использует маппинг, описанный в web.xml?

Автор: MisterCleric 28.8.2009, 10:37
А почему, собственно, тебя не устраивает мэппинг с суфиксом? 
Поблема как раз и заключается в том, что диспатчер нужен для того, что бы определить, какой сервис вызывать. А какой сервис надо вызывать, если у тебя на вход пришел запрос почти на статику - jsp.
А как должен себя повести этот диспатчер, если такое у тебя на странице:
Код

<link href='[path_to_css_file]' rel="stylesheet" type="text/css">
<script type="text/javascript" src="[path_to_js_file]"></script>
<img src="[path_to_img_file]">


Эти запросы ведь тоже соответствуют паттерну /*

ты можешь разрулить например так:

Код

<servlet-mapping>
   <servlet-name>springmvc</servlet-name>
   <url-pattern>/springmvc/*</url-pattern>
</servlet-mapping>


Тогда тебе надо везде, где вызов твоих экшенов добавить этот префикс. Но тогда скажи мне, пожалуйста, в чем разница со способом по суфиксу?

Можно еще попробовать через через принцип UrlRewrite:
http://tuckey.org/urlrewrite/
И вот тоже нашел интересное решение
http://www.carbonfive.com/community/archives/2007/06/parameterized_rest_urls_with_spring_mvc.html

Автор: UnicornMirage 28.8.2009, 10:50
MisterCleric, спасибо за ответ!

вобщем почему меня не устраивает маппинг с суффиксом - потому что хочу сделать friendly url, наподобие такого:

вместо http://somehost.org/getUser.html?uid=12345

чтобы было http://somehost.org/user/12345

Поэтому придется использовать маппинг с префиксом.

1) в спринге 2.5 нет механизма REST Url, чтобы можно было написать в маппинге контроллеров:
@RequestMapping(value= "/user/{userId}", этот механизм есть в spring 3.0, но он к сожалению пока еще не релиз. И его использовать нельзя.
Поэтому пришлось самому написать аналог этого friendly url.

2) http://tuckey.org/urlrewrite/ - замечательный продукт! Но не могу использовать, потому что его нет в maven-репозиториях.. А наш проект имеет строгие ограничения на этот счет. Мы используем только то, что лежит в стандартных maven-репозиториях. Поэтому тащить в svn jar-библиотеки urlrewrite не имеет смысла.

3) насчет статических ресурсов js, css, images - то в будущем я бы их разнес на отдачу какому нибудь серверу hginx или apache.

спасибо за интересную ссылку: http://www.carbonfive.com/community/archives/2007/06/parameterized_rest_urls_with_spring_mvc.html

Автор: MisterCleric 28.8.2009, 11:02
Цитата

чтобы было http://somehost.org/user/12345


Это как раз и есть REST Url и разруливается оно через UrlRewrite. Spring3 не смотрел, пока не выйдет релиз. Но что-то такое видел в примерах - конфигурируется аннотацией на уровне метода контроллера

Добавлено через 1 минуту и 15 секунд
Да, и темы по friendly url здесь уже подымались. Посмотри, мож чем поможет

Автор: garbuz 28.8.2009, 13:45
UnicornMirage, я наелся помню этих урлов. Средствами спринга 2.5 это не обойти, в третьем, как уже сказал 
MisterCleric, уже есть вроде такое. Домой приду, могу выложить небольшой пример с urlRewrite. Надо? 

Автор: MisterCleric 28.8.2009, 13:50
Цитата

уже есть вроде такое. Домой приду, могу выложить небольшой пример с urlRewrite. Надо?  

Думаю, нормально будет, если прям сюда выложишь. Там достаточно всего лишь конфига этого urlRewrite и как Spring это разруливает

Автор: garbuz 29.8.2009, 21:18
Добавляем в web.xml
Код

 <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
        <init-param>
        <param-name>logLevel</param-name>
        <param-value>DEBUG</param-value>
        </init-param>

    </filter>

 <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


Пишем urlrewrite.xml, в нем правила для урлов, что-то типа того
Код

<rule>
       <from>.*/tag/([A-Za-zА-Яа-я\d]+)/$</from>
       <to>/showTag.htm?tagName=$1</to>
   </rule>

  

    <rule>
        <from>/category/all/</from>
        <to>/showAllCategories.htm</to>
    </rule>

    <rule>
        <from>.*/category/([\w\d]*)/$</from>
        <to>/showCategory.htm?categoryName=$1</to>
    </rule>


А сами ссылки уже формируешь так
Код

<a href="<c:url value="/tag/${tag.tagName}/"/>"><c:out value="${tag.tagName}"/></a><br>
<a href="<c:url value="/category/all/"/>">Все категории</a>


Короче как-то так smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)