【问题标题】:Spring MVC: JSP templates get text after executingSpring MVC:JSP模板执行后获取文本
【发布时间】:2016-01-23 14:02:25
【问题描述】:

我需要进行特定的服务调用,并且需要将 String 对象作为 HTML 参数传递。此 HTML 将由该服务呈现(此服务发送电子邮件,此 HTML 将是电子邮件正文)

到目前为止,我一直在为所有模板使用 JSP 文件。我所有呈现 HTML 页面并将其返回给用户的视图。

我不知道如何执行 JSP 文件,填写所有信息,然后将其转换为文本。这是我第一次使用 Spring MVC。

编辑: 这里的相关问题真的过时了'09

【问题讨论】:

  • 底线:使用更好的模板引擎,不依赖于servlet容器,有很多。
  • @kryger 我读了这个问题,但并没有真正理解它。您的意思是说我不能执行 JSP 然后将其转换为文本?
  • 如果我理解这一点,您可以使用 Javascript 函数获取信息呈现后的 HTML 内容。 document.head 获取 HTML 的头部,document.body 获取 HTML 的正文。您可以创建一个在页面加载时执行的函数。见w3schools.com/jsref/event_onload.asp
  • 使用不同的模板库,如 Thymeleaf 并在您的处理程序中呈现 HTML。

标签: java spring jsp spring-mvc templates


【解决方案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 期望的参数不在您的请求中,那么您还需要为请求创建模拟或过滤器。

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2022-01-05
        • 1970-01-01
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多