2011-06-09 46 views
1

我在這裏有一個奇怪的問題,我真的被卡住了,需要得到這個工作很糟糕。我們可以以某種方式改變地址欄中的url後,從servlet調度請求到jsp

所以我有一個頁面說index.jsp與鏈接說「a href = servlet?id = 10」。當我點擊這個鏈接時,它會轉到我的servlet上的doGet(),這裏是我的servlet中的代碼。

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
       String action = request.getParameter("id"); 
        // search database and create an arraylist 
         if(//user logged in) 
         address = "s/results.jsp"; 
         else 
         address = "results.jsp"; 
        // set arraylist in session object 
       RequestDispatcher dispatcher = request.getRequestDispatcher(address); 
       dispatcher.forward(request,response); 
    } 

所以上面的代碼工作正常,但請求轉發後,我的瀏覽器顯示的URL作爲

http://localhost/project/servlet?id=10

我不希望上面的url,因爲我轉發到兩個不同的jsp的基礎上的用戶登錄狀態之一是在's'文件夾和其他超出了。 如果用戶登錄,那麼我轉發到's/results.jsp',如果用戶沒有登錄,我將轉發到'results.jsp'。

在s/results.jsp的情況下,我使用../在results.jsp中訪問's'文件夾外部的資源,如圖像和腳本。

由於url不會更改爲s/results.jsp,我無法使用'../' 訪問資源,並且當我使用jsp分頁時,當我單擊下一步時,URL將更改爲s /結果.JSP 在那種情況下,我能夠用我的腦海../

一個解決方案是將所有資源複製s中的文件夾來訪問資源,但這樣會增加 冗餘。

在我的腦海裏一個其他的解決辦法是爲兩個JSP的 創建兩個不同的servlet,但我不知道放在哪裏的servlet,使其能跨越文件夾的訪問外部資源與../

是他們的任何其他好辦法我可以做任務..

我試圖找到關於這方面的信息,但一直沒能弄明白。

任何幫助將非常感激。

回答

8

你基本上已經指示你的瀏覽器發送一個請求到那個URL。轉發不會更改網址。它完全是服務器端。除了使用response.sendRedirect()代替垃圾郵件之外,垃圾郵件會將當前的請求(包括其所有屬性)垃圾處理,並在給定的URL上創建一個全新的請求,您也可以將鏈接更改爲<a href="results?id=10">,或者當用戶登錄時<a href="s/results?id=10">

<a href="${user.loggedin ? 's/' : ''}results?id=10"> 

最後相應地改變servlet映射,使其獲得的這些URL調用。

<url-pattern>/results</url-pattern> 
<url-pattern>/s/results</url-pattern> 

你只錯過了JSP擴展。但是,由調度程序使用的JSP無論如何都屬於/WEB-INF文件夾,因此,如果不首先調用servlet,它們將無法直接被最終用戶查看。你最終也會得到更好的URL。

+0

CVC-複雜type.2.4.d嘗試:無效的含量被發現開始元素'網址模式'。目前沒有子元素 。 日食表示當我在web.xml /S /結果 2011-06-09 21:41:48

+0

嗯,你把它放在'的 /結果此錯誤 - 通常的方式?你不應該把它放在隨機的地方。它是爲了替換你的舊''/servlet'。 – BalusC 2011-06-09 21:46:02

+0

明白了! 謝謝 – 2011-06-09 21:59:55

0
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
String action = request.getParameter("id"); 
// search database and create an arraylist 
    if(//user logged in) 
     address = "s/results.jsp"; 
    else 
     address = "results.jsp"; 
    // set arraylist in session object 
    RequestDispatcher dispatcher = request.getRequestDispatcher(address); 
    dispatcher.forward(request,response); 
} 
在上面的代碼,而不是使用請求調度

RequestDispatcher dispatcher = request.getRequestDispatcher(address); 
      dispatcher.forward(request,response); 

我們可以

response.sendRedirect(request.getContextPath()+"/address"); 
相關問題