我想通过 Google 或我的 Servlet 代码中的其他电子邮件服务之一发送电子邮件。由于电子邮件内容是动态的——收件人姓名或其中的某些其他部分会因情况而异,因此我想使用其中的 JSP 页面和 JSTL 功能来生成电子邮件内容。
如何在我的 Servlet 代码内部获取 JSP 生成的页面内容。
如果可能,我不想与电子邮件内容页面建立任何本地 HTTP 连接。我的 Web 服务器环境是 Tomcat 6 和 Servelt 2.5。
我想通过 Google 或我的 Servlet 代码中的其他电子邮件服务之一发送电子邮件。由于电子邮件内容是动态的——收件人姓名或其中的某些其他部分会因情况而异,因此我想使用其中的 JSP 页面和 JSTL 功能来生成电子邮件内容。
如何在我的 Servlet 代码内部获取 JSP 生成的页面内容。
如果可能,我不想与电子邮件内容页面建立任何本地 HTTP 连接。我的 Web 服务器环境是 Tomcat 6 和 Servelt 2.5。
我看到了几个解决方案:
1)正常创建您的JSP,从java类向它发出请求并将响应内容放入您的邮件中。(在这里找到)
URL urlPage = new URL(url);
HttpURLConnection conn = (HttpURLConnection)urlPage.openConnection();
conn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//then loop through lines of webpage with br.readLine();
//and add it to your mail to send
2)您可以注入 JspWriter 的自定义实现,将所有输出重定向到文件(或 Reader ...)。一个简单(但有点脏)的实现可能是: 在您的 JSP 中:
<%@page import="foo.bar.JspFileWriter"%>
<%
String fileName = "JspStartContent" + System.currentTimeMillis() + ".html";
out = new JspFileWriter(new File("c:\\Mobile", fileName), out);
%>
具有以下 JspWriter 实现
public class JspFileWriter extends JspWriter {
BufferedWriter out;
JspWriter originalOut;
/**
* @param bufferSize
* @param autoFlush
*/
public JspFileWriter(File file, JspWriter originalOut) {
super(originalOut.getBufferSize(), originalOut.isAutoFlush());
try {
this.originalOut = originalOut;
FileWriter fw = new FileWriter(file);
out = new BufferedWriter(fw);
} catch (IOException ex) {
;
}
/**
* @see javax.servlet.jsp.JspWriter#clear()
*/
@Override
public void clear() throws IOException {
originalOut.clear();
}
/**
* @see javax.servlet.jsp.JspWriter#clearBuffer()
*/
@Override
public void clearBuffer() throws IOException {
originalOut.clearBuffer();
}
/**
* @see javax.servlet.jsp.JspWriter#close()
*/
@Override
public void close() throws IOException {
originalOut.close();
out.close();
}
...
3) 这不是您问题的答案,但您可以考虑使用 XSLT 生成 HTML。
对于这种事情,使用 JSP 往往很尴尬。每当我必须为 Web 以外的任何内容动态生成内容时,我都会完全使用不同的框架。我有点偏爱Apache Velocity,但还有一些其他的,比如FreeMarker。我确定还有其他人。
我发现一个单独的框架比 JSP 更便携、更可靠且更易于使用。