Struts2 - 如何将JSP页面的结果作为动作类中的字符串获取(对于电子邮件)

时间:2014-09-19 14:34:27

标签: java html jsp struts2 velocity

我想同时实现这两件事。

我在Struts2中有一个常规的jsp页面。 XX / YY / ZZ / email.jsp

<html>
<head>
</head>
<body>
    <s:property value="email"/>
</body>
</html>

此页面的网址可能是xx / yy / zz / myEmail.action,而某些操作类会处理它...

public class MyEmailAction {
    private String email;
    public String execute(){
        this.email = 'abc@xyz.com''
    }
    //setter and getter for 'email'
    ......
}

现在,我想有另一个动作,它将xx / yy / zz / myEmail.action页面的结果作为电子邮件发送。

public class MyEmailAction {
    private String email;
    public String execute(){
        this.email = 'abc@xyz.com''
    }

    public String send() {
        this.email = 'abc@xyz.com''
        Map mapping;
        //put this.email into the mapping
        String result = getResultOfJSP('../../../xx/yy/zz/email.jsp', mapping);
        Email.send('me@me.com', 'you@you.com', 'My Subject', result);
    }
    //setter and getter for 'email'
    ......
}

所以问题在于:我如何才能将RENDERED JSP的结果作为一个字符串?

这就是我想要这个的原因显然是我想在一个地方管理这个模板(email.jsp)。

我知道我可以使用另一个速度(vm)页面,该页面与jsp具有完全相同的html但是使用速度标记。但是每当我需要对这个模板进行更改时,我都必须在这两个地方进行更改。

我想我也可以使用URL来获取结果,但我不想使用这种方式,因为它是对服务器的另一个请求。

由于

2 个答案:

答案 0 :(得分:4)

我遇到这个问题,使用邮件servlet使用它来获取jsp的结果作为字符串:

HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(response) {
private final StringWriter sw = new StringWriter();

@Override
public PrintWriter getWriter() throws IOException {
    return new PrintWriter(sw);
}

@Override
public String toString() {
    return sw.toString();
}
};
request.getRequestDispatcher("email.jsp").include(request,
    responseWrapper);
String result = responseWrapper.toString();

设置电子邮件以提供HTML内容:

Email.send('me@me.com', 'you@you.com', 'My Subject', result);

答案 1 :(得分:1)

这不是您问题的答案,但我建议您考虑使用模板引擎撰写电子邮件,例如Velocity或Jelly

http://velocity.apache.org/

http://commons.apache.org/proper/commons-jelly/

通过这种方式,您可以将模板组合为HTML或XML,并在其中注入您的逻辑可能检索到的任何相关数据(甚至可以将某些逻辑集成在他们自己的模板语言中,例如if-then-else或while-loop结构)

在最糟糕的情况下,渲染完整的JSP是完全必要的,你可以在

上破解一些东西

RequestDispatcher::include

您可以从MyEmailAction执行此方法,但将其传递给被攻击的ServletResponse。这将是您实现ServletResponse编写的一些类...但是将结果写入某些ByteArrayOutputStream。在呈现页面之后(在您的假ServletResponse上),您可以从那里检索它(实际上使用servlet容器作为您自己的模板引擎)