【问题标题】:Passing A Path Variable To A Controller With Spring使用 Spring 将路径变量传递给控制器
【发布时间】:2013-09-05 16:37:25
【问题描述】:

我正在使用 spring 创建一个与 facebook 链接的应用程序。当应用程序启动时,它会将您重定向到登录页面。单击登录按钮后,它会将您重定向到主页。我想要做的是,当单击登录按钮时,它会将您重定向到主页并在末尾添加一个唯一编号。每当我启动我的应用程序时,我都会收到 HTTP 状态 404 错误。我无法弄清楚问题是什么。编辑我正在使用 Spring Social Quickstart,我对该程序所做的唯一修改是以下内容

登录页面

    <%@ page session="false" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <html>
        <head>
            <title>Sign In</title>
        </head>
        <body>
<c:set var="rand"><%= java.lang.Math.round(java.lang.Math.random() * 2) %></c:set>
            <form action="<c:url value="/signin/facebook/${rand}" />" method="POST">
                <button type="submit">Sign in with Facebook</button>
                <input type="hidden" name="scope" value="email,publish_stream,offline_access" />
            </form>
        </body>
    </html>

主页

<%@ page session="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
    <head>
        <title>Home</title>
    </head>
    <body>
    <ul>
        <li><a href="<c:url value="/signout" />">Sign Out</a></li>
    </ul>
        <p>${number}</p>
    <h3>Your Facebook Friends</h3>
    <ul>
    <c:forEach items="${friends}" var="friend">
        <li><img src="http://graph.facebook.com/<c:out value="${friend.id}"/>/picture" align="middle"/><c:out value="${friend.name}"/></li>
    </c:forEach>
    </ul>   
    </body>
</html>

家庭控制器

@RequestMapping(value = "/{rand}", method = RequestMethod.GET)
public String home(@PathVariable("rand") String rand, Model model) throws IOException {

           List<Reference> friends = facebook.friendOperations().getFriends();
           FacebookProfile profile = facebook.userOperations().getUserProfile();
           String userID = facebook.userOperations().getUserProfile().getId();
           model.addAttribute("friends", friends);
           String accessToken = connectionRepository.getPrimaryConnection(Facebook.class).createData().getAccessToken();
            System.out.println(accessToken);
        return "home";
    }

【问题讨论】:

  • 哪个 url 给你一个 404,它对应的处理方法是什么?
  • localhost:8080/my-app 给了我错误。我必须有一个只处理“/”请求的控制器吗?上面的控制器是我唯一的控制器
  • 根据您的要求,您应该有一个控制器方法来处理/,方法是呈现代表您的登录页面的视图。

标签: java jsp spring-mvc spring-social


【解决方案1】:

您的应用程序的基本 URL 是什么,您的控制器是否也有根 URL?这&lt;c:url value="/signin/facebook/${rand}" /&gt; 行代码将产生类似于http://localhost:8080/yourAppname/signin/facebook/12342354665 的内容。

根据配置和其他注释,您应该将@RequestMapping(value = "/{rand}", method = RequestMethod.GET) 更改为@RequestMapping(value = "/signin/facebook/{rand}", method = RequestMethod.GET)。您当前的映射(取决于控制器注释)仅提供根级 URL。

您是否启用了日志记录?您应该能够在日志中看到失败的映射。

【讨论】:

  • 当我将控制器更改为仅处理“/”请求时,应用程序加载到登录页面并加载到 localhost:8080/my-app/signin,然后当我单击登录按钮页面时,它加载到 @ 987654322@。登录/facebook 不在我有点困惑的 URL 中
  • 所以,猜猜,你有一个名为 my-app building to my-app.war 的项目,你将它放在你的网络服务器的应用程序文件夹中?根上下文是 /my-app/。然后,您要么有一个欢迎文件(index.jsp?)转发到您的登录页面,要么您有一些配置(spring-security?)检测用户未登录并代表您转发。不用担心单击按钮时会发生什么,生成的标记(页面源)是什么?
  • 好吧,最简单也最没用的,就是在浏览器中右键点击页面,选择“查看页面源代码”,我想所有的浏览器都有。但是,如果您要进行大量 Web 开发,我建议您熟悉 Firebug,或您选择的浏览器上可用的开发人员工具。
  • 当我查看页面源代码时,它只显示我上面发布的内容。
  • 抱歉,我没有使用 Spring Social 的经验,但在内部它将有一个控制器来处理 /signin/facebook URL,您已经在路径中添加了一个附加组件,它可能未配置为了解(不是,查看源 Google FacebookSigninController)。作为 Java,您始终可以扩展该类并添加您自己的控制器来处理您的附加功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多