从单个Web应用程序中的servlet检索JSP内容(在Tomcat下)

时间:2011-04-13 13:36:38

标签: jsp tomcat servlets

首先,我想为没有这么清楚的问题描述而道歉。让我们考虑一下我们有一些电子邮件发送的工作机制,我们也有一些基于JSP处理引擎的电子邮件模板机制。假设这些模板可能可以像http://localhost/app/templates/template1.jsp?k1=v1&k2=v2一样直接访问,并且总是返回一个HTML,可以插入到后端代码中某个用户的电子邮件中。简单地说,简写代码可能如下所示:

Map<String, String> parameters = new HashMap<String, String>() {{ ..puts.. }};
String message = readJsp("/templates/template1.jsp", parameters); // servlet-context?
sendEMail(recipient, subject, message)

目前我找到了两种实现readJsp方法的解决方案。 第一个方法是从servlet向web服务器发出HTTP请求,其中servlet和JSP-template都放在该服务器上。好吧,我不是这个的粉丝......

第二以及真正有效的更好的方法是从servlet上下文获取请求调度程序并使用响应包装器调用其include()方法(此工作原理描述为{{3 }})。这种方法很完美,但是如果我不能得到HttpServletRequestHttpServletResponse个实例,我不知道如何使用这种方法(我们可以考虑从servlet调用我的sendEMail()方法service方法 [这里很容易得到HttpServletRequest / Response实例] 和一个作为Web应用程序 [其中HttpServletRequest / Response实例的一部分运行的线程永远已知,甚至无法传递给线程] )。我可以建议我可以以某种方式自己创建HttpServletRequest / HttpServletResponse个实例,但我不知道基于此方法的readJsp()方法如何以及是否可行第二次方法。

因此,问题基本上可能是从不属于servlet但在同一Web应用程序中运行的线程获取JSP内容的第三种(甚至更好)方式。或者是否可以从头开始创建有效的HttpServletRequest / HttpServletResponse实例,以使第二个方法在servlet service()方法之外工作?

有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用Spring的MockHttpServletRequest / Response,但据我所知,Tomcat的ServletDispatcher.include()不适用于那些。

如果您无权访问请求/响应对,我建议使用JSP not 。而是使用VelocityFreemarker为您的电子邮件设置模板。