2011-06-02 172 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

相关问题