我很幸运地继承了一个使用只允许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 ......
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");
}
}
答案 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将被评估为文本。