2011-06-02 178 views
1

我一直很幸運能夠繼承一個使用只允許JSP的「平臺」的項目。該平臺基本上是tomcat,我們可以在我們自己的目錄中放置我們的JSP和JAR。我們沒有servlet支持(我們無法訪問web.xml),甚至不支持JSTL。我嘗試添加JSTL jar和<c:out value="blah" />作品,但表達式不起作用。使用<c:set var="test" value="blah" />沒有幫助,因爲我無法使用EL訪問var(<c:out value="${test}" />只是打印「$ {test}」)。僅適用於JSP的應用程序

該項目目前只包含帶有Java表達式的JSP,它非常混亂。我試圖通過將Java代碼移動到類來清除它,但是想知道是否有一些簡單的方法來模仿servlet/MVC行爲。

我現在所能想到的只有以下幾點。這看起來是最好的解決方案嗎?我已經習慣了使用Spring或至少servlet的...

  1. HTML表單點擊
  2. JSP文件(調用Java控制器)
  3. 控制器(手柄內容,重定向/向前查看)
  4. JSP視圖

somePage.jsp

<form action="control/someController.jsp" method="post"> 
    <input type="submit" /> 
</form> 

someController.jsp

<% 
    SomeController sc = new SomeController(request, response); 
    sc.doSubmit(); 
%> 

SomeController.java

public class SomeController extends AbstractController { 

    public SomeController(HttpServletRequest request, 
      HttpServletResponse response) { 
     super(request, response); 
    } 

    protected void handleSubmit() { 
     // do stuff ... 
     redirect("nextPage.jsp"); 
    } 
} 

回答

3

這是可行的。但是每個請求上的類的重新創建都非常昂貴。我也只是將它們從通常的方式從HttpServlet擴展。我會創建一個靜態加載所有servlet的工廠類。然後你基本上接管了基於web.xml的servletcontainer正在完成的工作。

public final class ServletManager { 

    private static final Map<String, HttpServlet> servlets = new HashMap<String, HttpServlet>(); 

    static { 
     servlets.put("controller1", new Controller1()); 
     servlets.put("controller2", new Controller2()); 
     servlets.put("controller3", new Controller3()); 
     // ... 
    } 

    public static HttpServlet get(String name) { 
     return servlets.get(name); 
    } 

} 

這樣你就可以通過創建擴展HttpServlet的類來實現servlet。

讓你的形式提交到一個通用的JSP

<form action="controller.jsp?controller=controller1" method="post"> 
... 
<form action="controller.jsp?controller=controller2" method="post"> 
... 

其中這個樣子的

<% 
    HttpServlet servlet = ServletManager.get(request.getParameter("controller")); 

    if (servlet != null) { 
     servlet.service(request, response); 
    } else { 
     // Handle non existing controller. 
    } 
%> 

(請注意,您應該在超越<% %>任何空白這,也沒有換行符,否則可能會提交響應和y我們的servlet將無法轉發/重定向請求/響應)

,或者您的servletcontainer不提取POST的情況下,從查詢字符串參數,而是使用

<input type="hidden" name="controller" value="controller1" /> 

最後,只要web.xml可供使用,應用程序更容易轉換。您只需創建web.xml並更改表單網址。

1

你可以添加

<%@頁isELIgnored = 「假」 %>

到JSP的最上方看到EL是否工作或沒有?

缺少該頁面指令的大概就是爲什麼你會得到如下

(<c:out value="${test}" /> just prints "${test}")

如果isELIgnored爲true,EL將被評估爲文本。

+0

我從來不知道這一點,我發現它在JSP 2.0中默認設置爲false,因此我們必須使用JSP 1.2。謝謝。 – ravun 2011-06-02 21:16:47

相關問題