2013-07-16 74 views
0

我在我的Servlet中有以下方法。如何從JSP調用servlet方法?

private String process(HttpServletRequest arg0, HttpServletResponse arg1) { 
    return ("a key"); 
} 

protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 
    process(arg0, arg1); 
} 

在web.xml下面的代碼被添加

<servlet> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>iusa.ubicacel.actions.map.MyServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/MyServlet</url-pattern> 
</servlet-mapping> 

在inicio.jsp加入

<script type="text/javascript" src="<%=request.getContextPath()%>/MyServlet"></script> 

在src標籤以下以上我要添加谷歌地圖API url(我將從servlet中的數據庫中檢索)從MyServlet中的process方法中獲得。我從意見中瞭解到我的方法是錯誤的。可以請任何人告訴我如何正確使用此jsp d servlet。

+1

幾乎所有的東西,真的。通過請求屬性向變量顯示變量。如果你認爲你不能,那麼代碼根本不屬於servlet。在這種情況下,腳本標記的「source」屬性應該是一個返回JavaScript的URL - 但除非您動態創建JavaScript的整體,否則也是如此。 –

+0

你得到的錯誤究竟是什麼?或者你只是試圖驗證設計的工作解決方案? –

+0

是的,我想驗證我的設計。我需要從數據庫中獲取google maps api url並將其添加爲JSP文件中的src標記。 – user2473430

回答

-1

注意:我不建議這樣做,但這是直接答案的問題。有關更多信息,請查看評論。


如果你只是你需要做以下「要添加字符串從工藝方法返回」:

  1. 讓你的方法publicstatic
  2. 然後寫下面的scriptlet:<%= MyServletName.process(request, response); %>。這將輸出處理方法的結果。

在最後你會具備以下條件:

<script src="<%= MyServletName.process(request, response); %>"></script> 

變量requestresponse在此範圍內都可用。

重要:你正在努力實現這樣的事情看起來像一個不好的設計。由於各種原因在這個答案中評論。查看@LuiggiMendoza和@DaveNewton的評論。

這裏有幾點採取帳戶:

  1. 寫scriplet是容易的,但不建議通過任何手段。參見:How to avoid Java code in JSP files?

  2. 從JSP調用Servlet方法是壞設計。 Servlet方法被設計來處理HTTP方法。它們不是爲了處理特定情況而設計的。

  3. 你試圖做的事是一個反模式,你沒有分離的擔憂。一個JSP頁面應該是一個結構和呈現信息的視圖。這些信息應該被預處理。

+0

當我在代碼中的問題控制是去處理方法。但我需要的src標記具有處理方法的返回值。有沒有辦法做到這一點? – user2473430

+0

@ user2473430,我只是修復了答案。嘗試在開始標記中加入'='標記,如:'<%= %>'。 –

+0

-1:這是無效的代碼。更糟糕的是,'process'方法是'private',即使創建一個MyServletName類的新實例,也不能直接訪問它。此外,'src'將對您放置的資源的名稱執行GET請求。看起來OP想從'MyServlet#doGet'處理中恢復整個JavaScript文件。 –

1

用於編寫servlet最佳實踐與JSP是遵循MVC模式:你的servlet將在控制器中,JSP是視圖,而模型將包括它們從servlet通過你的域對象的通過請求屬性到JSP頁面。

我不認爲你有什麼權利現在是完全錯誤的。但它僅適用於需要從servlet生成所有JavaScript代碼的特殊場景(並且這幾乎不是真正的要求)。假設,雖然這是你的情況下,真正的需求(也許你從數據庫中讀取整個JavaScript內容),這是確定定義呈現JS內容一個servlet(也許它映射爲/main.js什麼的,使動態生成透明的JSP頁面)。

最有可能的,你只需要一幫在運行時(如您的谷歌地圖的網址,API密鑰或者你在你的數據庫存儲)動態地生成小件物品。如果是這種情況,那麼您的JavaScript代碼可以在.js文件中靜態定義,並允許使用一些構造函數參數(或其他)進行初始化。

在此設置中,您的servlet將從數據庫中讀取url,並通過調用request.setAttribute("googleMapsUrl", url)將其傳遞到視圖,然後調用requestDispatcher.forward(...)將控制權傳遞給JSP。

在JSP中,你現在需要包括您與SRC靜態腳本,然後你可以根據結合您的要求動態值有另一個script標籤初始化代碼:

<c:url value="/static.js" var="scriptUrl"/> 
<script type="text/javascript" src="${scriptUrl}"></script> 
<script type="text/javascript"> 
    // let's assume your static script defines an object called `MyGoogleMapsDriver`... 
    var googleMapsDriver = new MyGoogleMapsDriver('${googleMapsUrl}'); 
</script> 

希望這有助於。

+0

這就是OP迄今爲止所做的。可能你的答案應該是* doGet'方法中要解決的問題。 –

+0

你是對的......顯然我完全錯過了那部分;我會編輯以清楚地說明... –

0

你不需要,你應該對數據的訪問,以便:

保存數據從的Servlet - >了request.setAttribute( 「爲MyObject」,數據);

JSP您加載需要的數據之後 - >request.getAttribute( 「爲MyObject」 ;

對不起我的英語, 好運。