spring servlet-mapping / url-pattern

时间:2016-04-19 12:05:49

标签: spring-mvc servlets url-mapping servlet-mapping

我有这个servlet-mapping

<servlet-mapping>
        <servlet-name>devicesWeb</servlet-name>
        <url-pattern>*.do</url-pattern>
        <url-pattern>/device-catalogue</url-pattern>
        <url-pattern>/device-catalogue/</url-pattern>                
        <url-pattern>/device-catalogue/*</url-pattern>
        <url-pattern>/search/search.do</url-pattern>
</servlet-mapping>

使用这两种方法:

   @RequestMapping(value = "/device-catalogue", method = RequestMethod.GET)
        private String initForm(@ModelAttribute("searchForm") final SearchForm searchForm, 
                                 BindingResult result, HttpServletRequest request, Model model, Locale locale) {

            sessionHelper.checkSessionAttributes(request,  locale);
            return SEARCH_VIEW;
        }


@RequestMapping(value = { "/search/showProductDetails.do",  "/device-catalogue/{id}" },  method = { RequestMethod.GET, RequestMethod.POST })
    private String showProductDetails(@ModelAttribute("searchForm") final SearchForm searchForm, 
                              HttpServletRequest request, Model model, Locale locale) {

        StringTokenizer st = new StringTokenizer(StringEscapeUtils.escapeHtml(searchForm.getItemId()),"=");

        if (st.countTokens()>1) {

            String awardId=st.nextToken();
            String id=st.nextToken();

            Item item = deviceService.getItemByAwardId  (Long.parseLong(id), awardId);

            normalizeWebsiteURL (item);

            orderCountriesAvailability(item.getCountriesAvailability(), locale);

            model.addAttribute("item", encodeItemForHTML(item));    
        }
        return PRODUCT_DETAIL_VIEW;
    }

此网址可以正常使用:

http://127.0.0.1:7001/eDevices/device-catalogue

但不是这个(我有404)!

http://127.0.0.1:7001/eDevices/device-catalogue/16720

如果我将此添加到web.xml,则可以使用

<url-pattern>/product-catalogue/16720</url-pattern>

1 个答案:

答案 0 :(得分:1)

不要每个网址写一个<url-pattern>。使用spring mvc(DispatcherServlet)的前端控制器来负责处理所有应用程序请求。

为了做到这一点,在你的web.xml中你需要类似的东西:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

和旁边的dispatcher-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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

   <context:component-scan base-package="com.test" /> <!-- specify your base package instead of "com.test" -->

   <mvc:annotation-driven />

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

   <mvc:resources mapping="/resources/**" location="WEB-INF/resources/" /> <!-- Not necessary but it's nice to address resources(css, images, etc) like this -->

</beans>