Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring MVC. Friendly url.


Автор: garbuz 5.6.2009, 13:40
Добрый день.
Создаю новую тему  smile
Хочу спросить об опыте создания и использования спринговых веб приложений с использованием чпу.
Например есть у меня список категорий, хочу иметь урл вида myhost.com/blog/category/java для категории "java", урл для создания категории типа myhost.com/blog/category/create, для редактирования myhost.com/blog/category/edit/java Ну вот как-то так.
Что для этого нужно? Просто грамотный URL-mapping? Или еще что-то требуется. Каким про этом дожен быть контроллер? Как должен обрабатывать урлы и действовать в дальнейшем?

Добавлено через 1 минуту и 36 секунд
Перенесите пожалуйста в java EE.

Автор: AntonSaburov 5.6.2009, 14:50
В твоем варианте - да, нужен нормальный url-mapping.

Есть еще вариант разбираться в контроллере по какому-нибудь параметру и вызывать что-то соотвествующее.

Автор: garbuz 15.6.2009, 22:35
Появилось немного свободного времени. Едем дальше smile
С красивыми урлами вот что вышло. (точнее пока ничего не вышло)
Маппинг переписал, вот что есть
Код

 <bean name="homePage" class="ru.blog.web.controllers.HomePageController">
        <property name="daoFacade" ref="daoFacade"/>
    </bean>

    <bean name="showPost" class="ru.blog.web.controllers.ShowPostController">
        <property name="daoFacade" ref="daoFacade"/>
         <property name="formView" value="post"/>
        <property name="successView" value="post"/>
         <property name="validator">
            <bean class="ru.blog.web.validators.CommentValidator"/>
        </property>
    </bean>

  
    <bean name="createPost" class="ru.blog.web.controllers.CreatePostController">
        <property name="daoFacade" ref="daoFacade"/>
        <property name="formView" value="newPost"/>
        <property name="successView" value="home"/>
        <property name="validator">
            <bean class="ru.blog.web.validators.PostValidator"/>
        </property>
      </bean>


 <bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/home">homePage</prop>
                <prop key="/post/show">showPost</prop>
                <prop key="/post/create">createPost</prop>
                
            </props>
        </property>
    </bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value=""></property>
        <property name="suffix" value=".jsp"></property>
    </bean>


Но что-то даже главная страница не грузится. В web.xml
Код

 <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
...
<welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>


Сам index.jsp
Код

<%@ include file="include.jsp" %>
<c:redirect url="/home"/>


Вот что пишет спринг
Код

15.06.2009 22:56:51 org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/blog/] in DispatcherServlet with name 'dispatcher'

Если руками в строку браузера дописать home или же запустить сразу с /home, то контроллер отрабатывает, выбирает данные, это видно по консоли, но 
Код

15.06.2009 22:57:43 org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/blog/home.jsp] in DispatcherServlet with name 'dispatcher'
и ошибка 404

Автор: NeoNYura 15.6.2009, 23:04
могу ошибаться, со спрингом мало работал но.

Код

15.06.2009 22:57:43 org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/blog/home.jsp] in DispatcherServlet with name 'dispatcher'


У тебя нету маппинга, по урлу которому ты обращаешься

у тебя ****-servlet.xml должна быть разводка на контроллеры springa, например:

Код


 <bean name="/blog/login.html" class="ru.test.test.client.LoginController"/>





Ой не заметил SimpleUrlHandlerMapping
Но в мапе у тебя только

Код

                <prop key="/home">homePage</prop>
                <prop key="/post/show">showPost</prop>
                <prop key="/post/create">createPost</prop>


а обращаешься по урлу ты к  /blog/

Автор: garbuz 15.6.2009, 23:28
NeoNYura, это потому, что тут не срабатывает редирект

Цитата(garbuz @  15.6.2009,  22:35 Найти цитируемый пост)
<%@ include file="include.jsp" %>
<c:redirect url="/home"/>


Если руками дописать /home или же сразу запуститься с /home, то... выше написано что происходит smile

Автор: Старовъръ 16.6.2009, 00:05
Попробуй 
Код
<prop key="/home*">homePage</prop>
.

Автор: garbuz 16.6.2009, 00:40
Цитата(Старовъръ @  16.6.2009,  00:05 Найти цитируемый пост)
Попробуй 

Пробовал уже smile
Цитата

javax.servlet.ServletException: Circular view path [home.jsp]: already dispatched to this view path within the same request [/blog/home.jsp]. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
    org.springframework.web.servlet.view.InternalResourceView.prepareForRendering(InternalResourceView.java:280)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:216)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:258)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1174)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:240)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:258)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1174)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


Автор: Kangaroo 16.6.2009, 01:34
garbuz, ну так ты Спрингу сказал все урлы через диспатчер пропускать (даже джсп страницы). Он в шоке.


На сколько я знаю  в Спринг МВС нет поддержки ЧПУ. Попробуй сделать с http://tuckey.org/urlrewrite/, небольшой пример - http://sziebert.net/posts/restful-urls-with-spring-mvc-and-urlrewritefilter/

Автор: MisterCleric 16.6.2009, 09:27
стоп. А почему действительно не сделать такой мепинг?
Код

 <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

Автор: garbuz 16.6.2009, 09:46
Цитата(MisterCleric @  16.6.2009,  09:27 Найти цитируемый пост)
стоп. А почему действительно не сделать такой мепинг?

Такой не хочется smile

Цитата(Kangaroo @  16.6.2009,  01:34 Найти цитируемый пост)
garbuz, ну так ты Спрингу сказал все урлы через диспатчер пропускать (даже джсп страницы). Он в шоке.

А нет другого способа указать без всяких там .htm .html .do etc ?

Цитата(Kangaroo @  16.6.2009,  01:34 Найти цитируемый пост)

На сколько я знаю  в Спринг МВС нет поддержки ЧПУ. Попробуй сделать с UrlRewriteFilter, небольшой пример - тут 

Видел этот реврайтер, думал обойдусь без него. Ладно, спасибо, гляну smile

Автор: garbuz 16.6.2009, 13:43
Господа, а если попробовать использовать аннотации? Типа
Код

@Controller
@RequestMapping("/home")
public class HomePageController {

    private DAOFacade daoFacade;

    public void setDaoFacade(DAOFacade daoFacade) {
        this.daoFacade = daoFacade;
    }
    
    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        List<Post> posts =  daoFacade.getPostDAO().getAll();
        List<Tag> tags = daoFacade.getTagDAO().getAll();
        List<Category> categories = daoFacade.getCategoryDAO().getAll();
        HashMap<String, Object> model = new HashMap<String, Object>();
        model.put("posts", posts);
        model.put("categories", categories);
        model.put("tags", tags);
        return new ModelAndView("home", model);
    }
}

Сейчас сам попробывать не могу, нету проекта по рукой. 
Если мы в web.xml укажем диспетчеру обрабатывать все урлы с .htm, а у контроллера явно укажем /home, то диспетчер схавает его?

Автор: Asal 23.6.2009, 17:41
Цитата(garbuz @  16.6.2009,  13:43 Найти цитируемый пост)
Если мы в web.xml укажем диспетчеру обрабатывать все урлы с .htm, а у контроллера явно укажем /home, то диспетчер схавает его?

насколько я помню - нет
пользуйте UrlRewrite - прост и удобен

Автор: garbuz 23.6.2009, 17:58
Цитата(Asal @  23.6.2009,  17:41 Найти цитируемый пост)
насколько я помню - нет
пользуйте UrlRewrite - прост и удобен 

Спасибо, уже использую UrlRewrite.
В третьем спринге будет следующее http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/

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