是否可以使用JSP作为servlet的模板?

时间:2009-11-13 20:19:06

标签: java jsp servlets web-applications

我一直在我正在构建的Web应用程序中混合使用JSP和Servlet,我开始发现我的更复杂的JSP最终包含了很多代码,这些代码在面对所有MVC课程时都是如此被砸到了我的身上。我知道我可以通过转发到JSP来做到这一点,但这看起来像是一个愚蠢的黑客。

我想要做的是使用servlet进行处理,然后将一组值发送到JSP以呈现HTML并返回响应。有点像:

public class MyServlet extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {

         // ... Do some processing

         resp.getWriter.print(renderJSP("mypage.jsp", values));

    }

}

我一直在寻找Sun的文档并发现:http://java.sun.com/developer/technicalArticles/javaserverpages/servlets_jsp/ 看起来JSP Model 2架构正是我想要实现的,但我找不到一个如何设置它的例子。由于技术原因,我不能使用像Struts这样的更高级的模板框架。

这是可能的还是失败的原因?

3 个答案:

答案 0 :(得分:9)

将对象放入请求中,将请求转发到jsp页面,然后使用jsp中的对象呈现响应。

在您的servlet中,

MyObject obj = ... //build somehow
request.setAttribute("myObject", obj);
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/my.jsp");
rd.forward(request, response);

如果不应直接从URL访问结果JSP,则应将其隐藏在WEB-INF目录中,只能通过forward指令访问它。

然后在你的jsp上,你可以拥有,

<% MyObject obj = (MyObject) request.getAttribute("myObject"); %> 

检索对象并根据需要使用它。

正如其他人所建议的那样,最终学会使用JSTL以及像Spring MVC这样的MVC框架是个好主意。可以找到该教程here

答案 1 :(得分:5)

将Java对象放在Request / Response / Session中,并在servlet中使用javax.servlet.RequestDispatcher,类似:

RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp");
dispatcher.forward(request,response);

forward是服务器端,目标servlet / JSP接收与原始servlet / JSP相同的请求/响应对象。因此,您可以使用request.setAttribute()

在它们之间传递数据

另一个选项是使用{em>客户端的response.sendRedirect(String location)(此方法向客户端发送临时重定向响应),以便位置URL从客户端接收新请求,传递数据的唯一方法是通过会话或使用web参数(url?name = value)。

这基本上就是MVC框架所做的事情(不,它不是黑客)。

答案 2 :(得分:4)

您描述转发到JSP是一种黑客,但实际上,这正是MVC框架所做的事情(至少是Spring MVC和Struts)。

“model”是servlet填充的请求属性;那么JSP只是检索它们来显示。你可以将它包装在像Spring MVC那样的“ModelAndView”中,但它确实是关于它的。

您可以在JSP上获得更复杂的功能,当然,还可以解析请求参数,会话属性或servlet上下文(“全局”)属性。我发现,一般来说,让前端控制器/ servlet将所有这些编组到请求属性中并让页面从中拉出来更清晰。如果您正在使用JSTL,请求和会话之间的差异可能更加模糊。