2011-03-30 69 views
0

在我的应用程序,我用的是Struts2的,和我创建了一个基础动作上悬而未决的路径问题:基本路径在JSP

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

然后,所有其他行动延长这一baseaction。

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

xx.jsp:

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

它运作良好,在我自己的机器。

http://localhost:8080/app 的test.js canbe通过找到的 “http://本地主机:8080 /应用/ RES/test.js”

但是当其他人试图访问我的应用程序,他们使用:

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

现在,浏览器仍然会尝试通过 下载test.js的 “http://本地主机:8080 /应用/ RES/test.js”

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

因此,“路径”是在行动中的硬代码,任何想法来解决这个问题?

+0

您可以验证的基本href是正确的HTML这些其他人看到了什么?从静态初始化程序访问Servlet上下文或请求看起来很麻烦。 – Thilo 2011-03-30 11:11:20

+0

...正如从静态初始化器中设置实例变量一样。那如何编译? – Thilo 2011-03-30 11:12:56

+0

在其他人看到的HTML页面中,基础href是stil“http:// localhost:8080/app” – hguser 2011-03-30 12:16:37

回答

2

static初始化块我不希望你有一个可用的请求。我会这样做:

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

@hguser - 我想,我的答案仍然适用。 – Bozho 2011-03-30 12:26:16

+0

谢谢,明天我会试一试。 – hguser 2011-03-30 12:55:30

+0

你是对的,我不应该在静态块中设置路径,它应该在每个请求中得到。 – hguser 2011-03-31 07:10:12

0

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

这毕竟不是一个很好的构造来创建基本路径。我建议作为替代如下创造它:只要好听

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)}/" /> 
+0

您的意思是我不能使用静态块,我应该根据每个请求创建一个路径? – hguser 2011-03-30 12:37:24

+0

我没有这么说过,我也不知道,因为我没有做Struts2,但是你至少告诉过它它可以在本地工作,而不是远程工作,这种行为确实被你如何提取基本路径的错误方式所证实(你使用本地地址而不是远程地址)。无论如何,你是否尝试过我的建议? – BalusC 2011-03-30 12:39:13

+0

现在,我在家里,明天我会试试你的建议。 :) – hguser 2011-03-30 12:53:22