我们有一个应用程序,需要发送各种不同类型的模板电子邮件.目前的代码非常繁琐且不够灵活.有没有人能够帮助这种类型的工作...我们正在寻找某种用于电子邮件的模板库.
也许Apache Velocity可以为你工作?
StringTemplate也是一个非常好的模板引擎.
Jack Leow说他写了一个自定义的HttpServletResponse,以便他可以重新使用JSP来生成电子邮件模板,我只是做了同样的事情,并希望为那些不确定从哪里开始的人分享我的代码示例/原型:
通常在提供JSP页面时,你会做这样的事情:
res.setContentType("text/html"); RequestDispatcher jsp = req.getRequestDispatcher("/WEB-INF/templates/" + template); res.setStatus(200); jsp.forward(req, res);
现在,不要将jsp.forward转换为HttpServletResponse,而是为自定义Servlet响应执行jsp.forward:
EmailServletResponse res2 = new EmailServletResponse(); jsp.forward(req, res2); System.out.println(res2.toString()); <<-- email gets printed here
您的EmailServlet响应将只是一个实现HttpServletResponse的类,填充空白并使用底层StringWriter来完成toString转换:
public class EmailServletResponse implements HttpServletResponse { private int status; private StringWriter sw = new StringWriter(); @Override public void flushBuffer() throws IOException { sw.flush(); } @Override public int getBufferSize() { return 1024; } @Override public String getCharacterEncoding() { return "UTF-8"; } @Override public String getContentType() { return "text/html"; } @Override public Locale getLocale() { return Locale.getDefault(); } @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public void write(int b) throws IOException { sw.write(b); } }; } @Override public PrintWriter getWriter() throws IOException { PrintWriter pw = new PrintWriter(sw); return pw; } @Override public boolean isCommitted() { return false; } @Override public void reset() { } @Override public void resetBuffer() { } @Override public void setBufferSize(int arg0) { } @Override public void setCharacterEncoding(String arg0) { } @Override public void setContentLength(int arg0) { } @Override public void setContentType(String arg0) { } @Override public void setLocale(Locale arg0) { } @Override public void addCookie(Cookie arg0) { } @Override public void addDateHeader(String arg0, long arg1) { } @Override public void addHeader(String arg0, String arg1) { } @Override public void addIntHeader(String arg0, int arg1) { } @Override public boolean containsHeader(String arg0) { return false; } @Override public String encodeRedirectURL(String arg0) { return ""; } @Override public String encodeRedirectUrl(String arg0) { return ""; } @Override public String encodeURL(String arg0) { return ""; } @Override public String encodeUrl(String arg0) { return ""; } @Override public void sendError(int arg0) throws IOException { } @Override public void sendError(int arg0, String arg1) throws IOException { } @Override public void sendRedirect(String arg0) throws IOException { } @Override public void setDateHeader(String arg0, long arg1) { } @Override public void setHeader(String arg0, String arg1) { } @Override public void setIntHeader(String arg0, int arg1) { } @Override public void setStatus(int status) { this.status = status; } @Override public void setStatus(int status, String message) { setStatus(status); } public String toString(){ return sw.getBuffer().toString(); } }
随意在需要的地方改进代码,这是一个快速的原型设计会话:)
一年前我遇到了类似的问题.在我们的例子中,我们的前端开发人员都熟悉JSP,我真的不想将另一个模板引擎添加到组合中.我想要一些依赖于servlet容器的JSP处理器来为我生成电子邮件内容的东西.
这很简单:
我必须在我的应用程序中有一个JSP页面(如果你不希望它可以从外部访问,你可以把它放在/ WEB-INF中).
我编写了一个自定义文件HttpServletResponse
,ServletOutputStream
它捕获由servlet容器编写的内容并将其转换为String,并依赖于RequestDispatcher.include(...)
对模板JSP发出"请求"(我还编写了一个自定义HttpServletRequest
来隔离原始请求与变异).
因为这有点像hack,而不是servlet API的使用方式,所以我将所有这些封装在一个实用程序类中,因此所有客户端代码所要做的就是传递JSP模板的路径,并取回已处理的内容.
我更喜欢Freemarker,而不是Velocity; imo,Freemarker在这种情况下更简单.
如果您使用的是Spring,那么您可能对Spring MVC中的Freemarker感兴趣.
这是一个Java模板基准测试