我想同时实现这两件事。
我在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来获取结果,但我不想使用这种方式,因为它是对服务器的另一个请求。
由于
答案 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://commons.apache.org/proper/commons-jelly/
通过这种方式,您可以将模板组合为HTML或XML,并在其中注入您的逻辑可能检索到的任何相关数据(甚至可以将某些逻辑集成在他们自己的模板语言中,例如if-then-else或while-loop结构)
在最糟糕的情况下,渲染完整的JSP是完全必要的,你可以在
上破解一些东西您可以从MyEmailAction执行此方法,但将其传递给被攻击的ServletResponse。这将是您实现ServletResponse编写的一些类...但是将结果写入某些ByteArrayOutputStream
。在呈现页面之后(在您的假ServletResponse上),您可以从那里检索它(实际上使用servlet容器作为您自己的模板引擎)