JSP只有应用程序的可能

时间:2011-06-02 18:54:24

标签: java jsp

我很幸运地继承了一个使用只允许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}”)。

该项目目前只包含带有Java表达式的JSP,而且非常混乱。我试图通过将Java代码移动到类来清理它,但我想知道是否有一些简单的方法来模仿servlet / MVC行为。

我现在能想到的就是拥有以下内容。这看起来像是最好的解决方案吗?我习惯使用Spring或至少使用servlet ......

  1. 点击了HTML表单
  2. JSP文件(调用Java控制器)
  3. 控制器(处理内容,重定向/转发到视图)
  4. JSP视图
  5. 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");
        }
    }
    

2 个答案:

答案 0 :(得分: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">
...

controller.jsp看起来像这样

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

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

(请注意,您应该在此<% %>中的controller.jsp之外有任何空格,也没有新行,否则可能会提交响应并且您的servlet将无法转发/重定向请求/响应)

或者,当您的servlet容器在POST情况下不从查询字符串中提取参数时,请使用

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

最后,只要web.xml可供使用,app就会更容易转换。您只需创建web.xml并更改表单网址。

答案 1 :(得分:1)

可以添加

&lt;%@ page isELIgnored =“false”%&gt;

到JSP的顶部以查看EL是否正常工作?

缺少此页面指令可能是您获得以下内容的原因

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

如果isELIgnored为真,则EL将被评估为文本。