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 MVC DI bean

jsp怎么获取spring配置文件properties中的信息

Jquery异步提交表单,然后获取提交后返回的结果。语言环境jsp,java,MVC。Action接收提交。

在 Spring MVC 中获取根/基 URL

spring mvc 访问不到 js css