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


Автор: goodday1941 24.2.2009, 19:13
и так в веб-хмл прописано следующее:

    
Код

<servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/test-servlet.xml</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>

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


как мне прописать маппинг в test-servlet.xml что бы при заходе на урл /test у меня было обращение к контроллеру...

перепробованные варианты

   
Код

 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/*">testController</prop>   <--в таком случае будет обращение что бы мы не вбили после /test - не подходит -->
                <prop key="/">testController</prop>   <--в таком случае будет обращение если в командной строке было введено /test/ -->
            </props>
        </property>
    </bean>



кто что предложит? )

Добавлено через 8 минут и 37 секунд
Код

              <prop key="/test">testController</prop>   


так вроде работает.. вот только не пойму почему

Автор: Kangaroo 25.2.2009, 04:18
Цитата(goodday1941 @  24.2.2009,  19:13 Найти цитируемый пост)
так вроде работает.. вот только не пойму почему

Так вроде вообще не должен вызываться диспатчер smile

Автор: goodday1941 25.2.2009, 09:43
сам в шоке )) но суть в том что работает... по моим соображениям он не должен вызываться ))

Автор: Kangaroo 25.2.2009, 11:54
Цитата(goodday1941 @  25.2.2009,  09:43 Найти цитируемый пост)
но суть в том что работает... по моим соображениям он не должен вызываться )) 

Ну ты логи погляди. Там должен все спринг писать.

Автор: AntonSaburov 25.2.2009, 13:34
Почему не должен - по идее все логично. 
Сначала контроллер Спринга поймал этот URL. Потом посмотрел по мапингу - и нашел совпадение. Вполне пристойно.
Кто сказал, что контроллер Спринга не будет пытаться найти совпадение у себя в мапинге, после того, как у него все совпало ?

Автор: goodday1941 25.2.2009, 15:37
теоретически ясли в моем случае в мапинге написано 
Код

<prop key="/test">testController</prop> 

то контроллер повешен на урл /test/test
так как в веб.хмл имеем:
Код

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


эт я так всегда думал smile а получается что не так )

Автор: Kangaroo 25.2.2009, 17:41
Вот два метода из org.springframework.web.util.UrlPathHelper, которые объясняют поведение.
Код

/**
     * Return the mapping lookup path for the given request, within the current
     * servlet mapping if applicable, else within the web application.
     * <p>Detects include request URL if called within a RequestDispatcher include.
     * @param request current HTTP request
     * @return the lookup path
     * @see #getPathWithinApplication
     * @see #getPathWithinServletMapping
     */
    public String getLookupPathForRequest(HttpServletRequest request) {
        // Always use full path within current servlet context?
        if (this.alwaysUseFullPath) {
            return getPathWithinApplication(request);
        }
        // Else, use path within current servlet mapping if applicable
        String rest = getPathWithinServletMapping(request);
        if (!"".equals(rest)) {
            return rest;
        }
        else {
            return getPathWithinApplication(request);
        }
    }

    /**
     * Return the path within the servlet mapping for the given request,
     * i.e. the part of the request's URL beyond the part that called the servlet,
     * or "" if the whole URL has been used to identify the servlet.
     * <p>Detects include request URL if called within a RequestDispatcher include.
     * <p>E.g.: servlet mapping = "/test/*"; request URI = "/test/a" -> "/a".
     * <p>E.g.: servlet mapping = "/test"; request URI = "/test" -> "".
     * <p>E.g.: servlet mapping = "/*.test"; request URI = "/a.test" -> "".
     * @param request current HTTP request
     * @return the path within the servlet mapping, or ""
     */
    public String getPathWithinServletMapping(HttpServletRequest request) {
        String pathWithinApp = getPathWithinApplication(request);
        String servletPath = getServletPath(request);
        if (pathWithinApp.startsWith(servletPath)) {
            // Normal case: URI contains servlet path.
            return pathWithinApp.substring(servletPath.length());
        }
        else {
            // Special case: URI is different from servlet path.
            // Can happen e.g. with index page: URI="/", servletPath="/index.html"
            // Use servlet path in this case, as it indicates the actual target path.
            return servletPath;
        }
    }


Но не объясняют зачем так сделано  smile 

Автор: goodday1941 26.2.2009, 11:56
ну на самом деле эт хорошо что они так сделали ) а то как бы я повесил контроллер на урл /test

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