【问题标题】:Spring MVC: calls from JSP not going to the controllerSpring MVC:来自 JSP 的调用不会转到控制器
【发布时间】:2016-12-06 21:29:24
【问题描述】:

我正在尝试将参数从 JSP 传递到 Spring MVC 控制器。但是控制器没有被调用。我已经阅读了许多有关此的相关帖子,并尝试了提供的各种解决方案,但它对我不起作用。

我的 web.xml 看起来像这样:

<display-name>MyList</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

<servlet>
    <servlet-name>mylist</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mylist</servlet-name>
    <url-pattern>/welcome.jsp</url-pattern>
    <url-pattern>/welcome.html</url-pattern>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

我的控制器:

@RequestMapping(path = "/subcategory/{id}", method = RequestMethod.GET)
public String findSubcategory(@PathVariable int id,Model model) {
    List<Category> subCategoryList = this.myListDao.getSubCategories(id);
    model.addAttribute("subcategories", subCategoryList);
    return "searchCategory" ;
}

My JSP的相关代码如下

<spring:url value="/subcategory/1" var="formUrl"/>
 <c:forEach var="category"  varStatus="status" items="${categories}">      
     <li><a href="${fn:escapeXml(formUrl)}">${category.description}</a></li>   
  </c:forEach>

当我的 url 为 /subcategory.html 并在我的控制器中有 @RequestMapping("/subcategory") 时,它可以工作。当我使用/subcategory/1 并更改相应的请求映射时,它不起作用。我尝试了各种 url 模式,例如 &lt;url-pattern&gt;/mylist/*&lt;/url-pattern&gt;&lt;url-pattern&gt;/MyList/*&lt;/url-pattern&gt;etc。但没有任何工作。我真的很感激任何帮助解决这个问题。提前非常感谢。

【问题讨论】:

    标签: spring jsp spring-mvc


    【解决方案1】:

    您当前的 servlet 映射覆盖了默认或根 servlet 映射,

    <servlet-mapping>
        <servlet-name>mylist</servlet-name>
        <url-pattern>/welcome.jsp</url-pattern>
        <url-pattern>/welcome.html</url-pattern>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    

    您的以下映射允许接受任何带有 *.html 的请求,因此您对 /subcategory.html 的调用没有任何问题。

    <url-pattern>*.html</url-pattern>
    

    应该改为,

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

    需要记住的几点,

    1. &lt;url-pattern&gt;/*&lt;/url-pattern&gt;

      这种模式通常建议使用Filter 来继续过滤器链接。否则,使用此模式将使您负责处理所有职责,例如提供静态资源等以明确处理。

    【讨论】:

    • 非常感谢...它成功了。我最初对使用 / 作为 url 模式持怀疑态度,但这是唯一可行的解​​决方案。
    • 这工作正常...但是当我清除浏览器缓存的数据时...它没有显示 CSS...在控制台上我收到错误“代码”找不到 HTTP 请求的映射使用 URI [/MyList/resources/....在 DispatcherServlet 中。我尝试使用 'code' 但是它并没有把我带到控制器......它适用于 *.html url 映射。任何线索为什么会发生?
    • @Love2LearnNShare 这似乎是与您的静​​态资源配置相关的另一个问题。我建议为此提出另一个问题。它更多地与您放置静态资源的位置有关。还要提及您的目录结构
    • 如果我在 url 映射中使用 .html 而不是 / ,这很好用。当我使用 /..无论如何谢谢..我将发布另一个与此相关的问题。
    【解决方案2】:
    @RequestMapping(path = "/subcategory/{id}", method = RequestMethod.GET)
    

    你应该使用值而不是路径,如下所示:

    @RequestMapping(value = "/subcategory/{id}", method = RequestMethod.GET)
    

    【讨论】:

      【解决方案3】:

      您的调用无法到达控制器,因为您的请求映射“/subcategory/{id}”与您的调度程序 servlet 定义的任何 url 模式都不匹配。您可以尝试替换这些行:

      <url-pattern>/welcome.jsp</url-pattern>
      <url-pattern>/welcome.html</url-pattern>
      <url-pattern>*.html</url-pattern>
      

      <url-pattern>/*</url-pattern>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-12
        • 2021-04-03
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2020-10-13
        相关资源
        最近更新 更多