【问题标题】:basepath in jspjsp中的基本路径
【发布时间】:2011-03-30 11:07:07
【问题描述】:

在我的应用程序中,我使用了 struts2,并创建了一个基本动作来解决路径问题:

class BaseAction{
  private String path;
  static{
  HttpServletRequest request = ServletActionContext.getRequest(); path=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();+"/";
  }
}

然后所有其他动作扩展这个基本动作。

在我的jsp页面中,我添加了路径作为基础:

xx.jsp:

....
<head>
  <base href="<s:property value='path'/>">
  <script ... src="res/test.js" />
</head>

它在我自己的机器上运行良好。

http://localhost:8080/app test.js 可以通过“http://localhost:8080/app/res/test.js”找到

但是当其他人尝试访问我的应用时,他们会使用:

http://192.168.x.x:8080/app.

现在,浏览器仍然尝试通过以下方式下载 test.js "http://localhost:8080/app/res/test.js"

当然,它不能得到它。真正的路径应该是: http://192.168.x.x:8080/app/res/test.js

既然,“路径”是行动中的硬代码,有什么办法解决这个问题吗?

【问题讨论】:

  • 您能否验证其他人看到的 HTML 中的基本 href 是否正确?从静态初始化程序访问 Servlet 上下文或请求似乎是自找麻烦。
  • ... 从静态初始化程序设置实例变量也是如此。那是怎么编译的?
  • 在别人看到的html页面中,base href仍然是"localhost:8080/app"

标签: jsp servlets path base


【解决方案1】:

在static 初始化块中,我不希望您有可用的请求。我会这样做:

<base href="${request.contextPath}" />

【讨论】:

  • @hguser - 我认为我的回答仍然适用。
  • 谢谢,我明天试试。
  • 你是对的,我不应该在静态块中设置路径,它应该在每个请求中获取。
【解决方案2】:

怎么样

<base href="${pageContext.request.contextPath}" />

【讨论】:

    【解决方案3】:

    您在基本路径中设置本地主机和端口,而不是远程主机和端口。

    这毕竟不是创建基本路径的好结构。我建议按如下方式创建它:

    path = request.getRequestURL().toString().replace(request.getRequestURI(), request.getContextPath()) + "/";
    

    或者只是在 JSTL/EL 中很好

    <c:set var="r" value="${pageContext.request}" />
    <base href="${fn:replace(r.requestURL, r.requestURI, r.contextPath)}/" />
    

    【讨论】:

    • 你的意思是我不能使用静态块,我应该根据每个请求创建路径?
    • 我没有这么说,我也不知道,因为我不做 Struts2,但你至少告诉过它在本地而不是远程工作,这种行为确实被错误的方式证实了您提取基本路径(您使用本地地址而不是远程地址)。你有没有尝试我的建议?
    • 现在,我在家,明天我会试试你的建议。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2020-08-30
    相关资源
    最近更新 更多