Spring MVC:JSP模板执行后获取文本
Posted
技术标签:
【中文标题】Spring MVC:JSP模板执行后获取文本【英文标题】:Spring MVC: JSP templates get text after executing 【发布时间】:2016-01-23 14:02:25 【问题描述】:我需要进行特定的服务调用,并且需要将 String 对象作为 html 参数传递。此 HTML 将由该服务呈现(此服务发送电子邮件,此 HTML 将是电子邮件正文)
到目前为止,我一直在为所有模板使用 JSP 文件。我所有呈现 HTML 页面并将其返回给用户的视图。
我不知道如何执行 JSP 文件,填写所有信息,然后将其转换为文本。这是我第一次使用 Spring MVC。
编辑: 这里的相关问题真的过时了'09
【问题讨论】:
What would be the light way to render a JSP page without an App/Web Server的可能重复 底线:使用更好的模板引擎,不依赖于servlet容器,有很多。 @kryger 我读了这个问题,但并没有真正理解它。您的意思是说我不能执行 JSP 然后将其转换为文本? 如果我理解这一点,您可以使用 javascript 函数获取信息呈现后的 HTML 内容。document.head
获取 HTML 的头部,document.body
获取 HTML 的正文。您可以创建一个在页面加载时执行的函数。见w3schools.com/jsref/event_onload.asp
使用不同的模板库,如 Thymeleaf 并在您的处理程序中呈现 HTML。
【参考方案1】:
我将重点介绍将您的 jsp 转换为文本的部分。 有一些关于使用 jsp 作为模板引擎的 cmets,但我的建议是模板不可知论。
这个想法是模仿浏览器调用,即提交我们希望其结果通过电子邮件发送的表单,并确保我们可以通过浏览器正确访问此页面。 我假设这里的发布请求更改很容易。
public class MailServiceHelper
public String getJsp(String url, Map<String,String> form, HttpServletRequest request)
//we can figure out the base url from the request
String baseUrl ="";
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(baseUrl+"/"+url);
for (String formElement : form.keySet())
method.setParameter(formElement, form.get(formElement));
try
int statusCode = client.executeMethod(method);
if (statusCode >= HttpStatus.SC_OK && statusCode < HttpStatus.SC_MULTIPLE_CHOICES)
byte[] responseBody = method.getResponseBody();
return new String(responseBody,StandardCharsets.UTF_8);
else
throw new RuntimeException("Failed to read jsp, server returened with status code: "+statusCode);
catch (Exception e)
throw new RuntimeException("Failed to read jsp",e);
finally
method.releaseConnection();
您可能需要对您的客户端进行身份验证,这也是受支持的。 我在我的示例中使用 httpclient 3.1,请参阅http 3.1 authentication;切换到较新的客户端应该很容易。
在下面的答案中提到了通过电子邮件发送 HTML:How do I send an HTML email? 建议使用内部样式表,以便电子邮件客户端正确呈现 html。
【讨论】:
【参考方案2】:您的方案实际上类似于不依赖于 servlet 容器的模板引擎。此外,您正在使用的堆栈将Thymeleaf 推送为最佳候选。
如果您担心采用新技术,您应该知道已经有一个 blog 和一个 github 项目准确展示了电子邮件模板方案,因此您将获得对您自己的实施的很好的支持
【讨论】:
【参考方案3】:如果您在控制器中,或者一般情况下如果您有权访问请求,则可以使用 request.forward()
和一个收集书面输出的模拟响应,当转发返回时,您会得到它并继续处理。
final RequestDispatcher rd = request.getRequestDispatcher("myJsp.jsp");
final MockHttpServletResponse r = new MockHttpServletResponse();
rd.forward(request, r);
final String s = r.getContentAsString();
见MockHttpServletResponse
如果 JSP 期望的参数不在您的请求中,那么您还需要为请求创建模拟或过滤器。
【讨论】:
以上是关于Spring MVC:JSP模板执行后获取文本的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc 整合jsp和thymeleaf两个模板引擎
jsp怎么获取spring配置文件properties中的信息