仅适用于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}”)。仅适用于JSP的应用程序
该项目目前只包含带有Java表达式的JSP,它非常混乱。我试图通过将Java代码移动到类来清除它,但是想知道是否有一些简单的方法来模仿servlet/MVC行为。
我现在所能想到的只有以下几点。这看起来是最好的解决方案吗?我已经习惯了使用Spring或至少servlet的...
- HTML表单点击
- JSP文件(调用Java控制器)
- 控制器(手柄内容,重定向/向前查看)
- 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");
}
}
这是可行的。但是每个请求上的类的重新创建都非常昂贵。我也只是将它们从通常的方式从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
并更改表单网址。
你可以添加
<%@页isELIgnored = “假” %>
到JSP的最上方看到EL是否工作或没有?
缺少该页面指令的大概就是为什么你会得到如下
(<c:out value="${test}" /> just prints "${test}")
。
如果isELIgnored为true,EL将被评估为文本。
我从来不知道这一点,我发现它在JSP 2.0中默认设置为false,因此我们必须使用JSP 1.2。谢谢。 – ravun 2011-06-02 21:16:47