找不到http请求错误的映射

时间:2015-08-06 03:35:22

标签: spring-mvc

我是springmvc的初学者并遵循教程。但我收到了一个错误,我花了三天时间。所以我想把它带到这里。首先请看我的代码:

的web.xml

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

    <!--Sitemesh: Decorates pages with layouts -->
    <filter>
      <filter-name>sitemesh</filter-name>
      <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>

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

servlet的context.xml中

<resources mapping="/resources/**" location="/resources/" />

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:import resource="controllers.xml" />

我的控制器java类

    @RequestMapping("/example")
    public ModelAndView showMessage(
            @RequestParam(value = "name", required = false, defaultValue = "World") String name) 
                    throws IOException {

        ModelAndView mv = new ModelAndView("example");
        String response = readAll("http://localhost:53000/product");
        JSONArray productsArray = new JSONArray(response);
        products = new ArrayList<Product>();
        if (null != productsArray){
            for (int i=0; i< productsArray.length(); i++) {
                JSONObject productobj = productsArray.getJSONObject(i);
                Product product = new Product();
                product.setId(productobj.getInt("id"));
                product.setName(productobj.getString("name"));
                product.setDescription(productobj.getString("description"));
                product.setPrice(productobj.getDouble("price"));
                product.setBalance(productobj.getInt("balance"));
                product.setImageUrl(productobj.getString("image_url"));
                specificationsMap.put(product.getId(), productobj.getJSONObject("specification"));
                products.add(product);
            }
            mv.addObject("productList", products);      
        }
        return mv;
    }

我收到了一个错误:

No mapping found for HTTP request with URI [/springweb/example] in DispatcherServlet with name 'appServlet'

这就是我调用example视图的方式:

<li><a href="<c:url value="/example" />">Example</a></li>

我在这里找不到什么错。寻求帮助。 感谢。

4 个答案:

答案 0 :(得分:1)

我通过在controllers.xml类中添加<mvc:annotation-driven />解决了这个问题。

感谢您的帮助。

答案 1 :(得分:0)

将servlet-context.xml代码写入文件名appServlet.xml

或  更改web.xml中的代码

 <!-- Processes application requests -->
  <servlet>
    <servlet-name>servlet-context</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

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

希望这可能有用:)

答案 2 :(得分:0)

c:url会自动添加上下文根和jSessionid。这是c:url的默认行为以及使用它的目的。

如果您不需要添加jsessionid,那么您可以使用简单的<a href="/example">

如果你必须使用c:url,那么你可以尝试设置上下文manullay,如<a href="<c:url context="/" value="/example" />">

答案 3 :(得分:0)

你应该将映射到spring {mvc servlet'从/更改为/*,所以就像

一样
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

不同之处在于/映射的含义是捕获未被任何其他servlet映射的所有请求,并且由于您的sitemash过滤器映射了所有,这将永远不会起作用。进行更改时,还应配置<mvc:resources>元素,以便从映射中排除静态文件。

Servlet规则的映射由Servlet 3.0 specification

定义
  

用于映射到servlet的路径是来自的请求URL   请求对象减去上下文路径和路径参数。该   下面的URL路径映射规则按顺序使用。 第一次成功   匹配用于未尝试进一步匹配

     
      
  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择   的servlet。
  2.   
  3. 容器将递归尝试匹配最长的路径前缀。这是通过逐步降低路径树的目录来完成的   一次,使用'/'字符作为路径分隔符。最长的   match确定所选的servlet。
  4.   
  5. 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理的servlet   请求延期。扩展名被定义为   最后一个'。'字符后的最后一段。
  6.   
  7. 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合的内容   资源要求。如果&#34;默认&#34; servlet是为   应用程序,它将被使用。许多容器提供隐含的   用于提供内容的默认servlet。
  8.