从多个网址返回视图时出现问题

时间:2011-03-15 21:31:20

标签: java model-view-controller spring web-applications

我正在使用Spring MVC构建一个Web应用程序,我遇到了问题。

目前,如果我登录并转到webapp的主页,那么它会正确显示用户主页(正常的个人资料图片,详细信息等) - 这一切都很棒。

但是,我正在尝试构建功能,以便如果有人使用url / user / username访问该站点,那么它将重定向到控制器并尝试使用用户名“username”查找用户 - 如果有找到后,它会加载所选用户配置文件的视图。

到目前为止这一切都正常 - 但我想检查一下,如果您已登录并导航到/ user / mycurrentusername然后不加载正常的配置文件页面,只需加载您第一次登录时看到的页面。问题是,当我返回相同的视图我为主页做,因为我现在在url / user / *没有页面资源可以找到(images / css)所以我得到页面但没有格式/图像..

围绕这个最好的方法是什么?有没有更好的方法来解决这个问题?

(我也遇到问题,因为它在/ url / images中查找images / css ..它再次向我的用户控制器发出请求:()

非常感谢!

3 个答案:

答案 0 :(得分:1)

您为样式表等创建的网址应该使用某种网址重写标记创建,以确保它们相对于根应用程序上下文而不是当前网址。你使用什么视图技术? JSP?如果是这样,你会想要这样的<link rel="stylesheet" href="<c:url value='/css/styles.css'/>" type="text/css"/><c:url/>代码会创建一个有效的常量网址,并且不会随您当前的网页请求而改变。

关于控制器被css / images等请求命中,请查看this question。简而言之,理想情况下,您希望使用类似Tuckey的Url Rewrite过滤器,以确保不会针对静态内容请求调用DispatcherServlet。

编辑:实际上看起来Spring T4现在比Tuckey的Filter有更好的解决方案。 <mvc:resources/>设置起来要简单得多。

答案 1 :(得分:1)

对于第一个问题,您可能将图像和css源指定为相对路径。由于视图是从不同的路径呈现的,因此该相对路径也是不同的。请参阅Melv的答案,了解如何正确指定它们。

对于第二个问题,请参阅spring mvc docs中的第15.12.4节,了解如何让静态请求通过Dispatcher Servlet。

答案 2 :(得分:1)

你基本上有三个选择:

  1. 请勿更改您的网络环境。将您的所有网址设为http://myapp/myrequest?par1=val1。我很久以前就做过这种应用程序,但是当有很多可能的操作时,URL将不会被组织。 “REST风格”的网址更漂亮,是世界将要发展的地方。

  2. 在所有内部网址中使用<c:url>。我认为这不是一个糟糕的选择,但是很多样板代码,比乍一看似乎更多。如果你用javascript调用URL,必须知道哪个是正确的URL,并且可能很笨拙。

  3. 在我目前的发展中,我使用了<BASE>标签。您必须在所有网页的头部加入<base href="http://myhost:8080/myapp/" />。然后,您可以将所有URL相对于应用程序的基本路径。有一些缺点,但这是我的首选。

  4. 编辑:回答您的问题。您可以通过以下方式获取应用程序的根URL,而不是参数化您的应用程序:

    <base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />