2011-03-30 74 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