【问题标题】:Spring mvc calling controller from jsp results in wrong url从jsp调用控制器的Spring mvc导致错误的url
【发布时间】:2013-07-09 09:04:43
【问题描述】:

我是使用 Spring MVC 开发的新手。 我正在尝试从我的 jsp 文件中调用控制器。 我将请求映射注释提供给控制器,但是当我尝试从 url 上的 mainview.jsp 调用时:(我正在 localhost 上测试)“/AirlineDB_Spring/views/mainview.jsp”(这工作正常), 项目名称从 url 中消失,我得到这个地址,它给了我 404:“/passengers/”我不知道为什么“AirlineDB_Spring/”从链接中消失,这看起来是主要问题。

我的控制器代码:

@Controller
@RequestMapping(value="/passengers")
public class PassengerController{

    @SuppressWarnings("unchecked")
    @RequestMapping(method=RequestMethod.GET)
    public String list(Model model) {
        List<String> tl = new ArrayList<String>();
        tl.add("one");
        tl.add("two");
        tl.add("three");
        model.addAttribute("testlist", tl);
        return "mainview";
    }

我的jsp文件代码是:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Airline Database</title>
</head>
<body>
     <h2>Passengers</h2>
     <a href="/passengers/">click</a>
     <c:forEach items="${model.testlist}" var="test" varStatus="loopStatus">
         ${loopStatus.count}  ${test}<br/>
     </c:forEach>
</body>
</html>

我的 web.xml 文件:

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:WEB-INF/spring/*.xml</param-value>
  </context-param>

  <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
     <servlet-name>airlinedb</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
  </servlet>

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

servlet-context.xml 包含以下内容:

 <context:annotation-config/>
 <context:component-scan base-package="airlinedb.controller"/>
 <mvc:annotation-driven/>

我通过互联网搜索,发现了很多与控制器映射有关的问题,但没有一个对我有用,我也尝试使用 href="/passenger" 调用控制器但得到相同的 404。 我不知道我缺少什么配置,我可以看到我得到了错误的 url,但我不知道可能出了什么问题。 谁能帮帮我?

【问题讨论】:

  • 你在哪里查看解析器?
  • 我认为问题出在您的 jsp 上:您是否尝试过重定向到
  • 视图解析器在 servlet-context.xml 中:
  • 我尝试了您的建议: 现在 url 看起来不错,但它仍然是 404,我收到错误消息,即 DispatcherServlet 中没有此 URI 的映射,我用的“/”不应该是一个通用的映射,我可以使用多种类型的url吗?
  • 是的,这个消息意味着没有与这个地址相关的视图。你能告诉我你得到 404 的地址吗?

标签: java jsp spring-mvc


【解决方案1】:

当您执行&lt;a href="/passengers/"&gt; 时,它会将您发送到类似:http://localhost:8080/passengers/

这不是你想要的。你要http://localhost:8080/AirlineDB_Spring/passengers/

所以,要么你使用&lt;a href="/AirlineDB_Spring/passengers/"&gt; 或者你使用它:&lt;a href="${pageContext.servletContext.contextPath}/passengers/"&gt; 第二个选项是更好的做法。

另外,将映射值添加到 RequestMapping 对您有好处。尝试如下使用:

@SuppressWarnings("unchecked")
    @RequestMapping(value="/",method=RequestMethod.GET)
    public String list(Model model) {
        List<String> tl = new ArrayList<String>();
        tl.add("one");
        tl.add("two");
        tl.add("three");
        model.addAttribute("testlist", tl);
        return "mainview";
    }

将 value="/" 添加到您的 @RequestMapping。

【讨论】:

    【解决方案2】:

    这两种方法都可以。您可以使用默认映射的 index 方法。

    @RequestMapping(value="/", method=RequestMethod.GET)
        public String list(Model model) {
            // ...
        }
    

    或者将list改名为index如下

     @RequestMapping(method=RequestMethod.GET)
            public String index(Model model) {
                // ...
            }
    

    【讨论】:

    • 我尝试了您的建议,但我仍然遇到相同的 404 错误。我应该以不同的方式调用控制器吗?因为我调用它时得到的url看起来很奇怪,它不包含项目名称作为jsp-s的其他url
    【解决方案3】:

    好像是第一个斜线

    <a href="/passengers/">click</a>
    

    使其成为绝对路径。如果你删除它会起作用吗?

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2019-06-19
      • 2020-05-13
      • 1970-01-01
      相关资源
      最近更新 更多