我正在使用JSP生成动态页面,我想将此动态生成的完整页面保存为文件存档。
在JSP中,所有内容都写入PrintWriter out = response.getWriter();
在页面的末尾,在向客户端发送响应之前,我想要保存此页面,无论是在文件中还是在缓冲区中作为字符串,以便以后处理。
如何保存Printwriter内容或转换为String?
请检查以下问题的答案。stackoverflow.com/questions/2010990/
谢谢Raj,但这不是我要找的,客户端会看到正常的html,但在服务器端,脚本将创建本地副本并写入文件。
可能重复如何从Java Web服务器记录响应内容
要从PrintWriter的输出中获取字符串,可以通过构造函数将StringWriter传递给PrintWriter:
@Test
public void writerTest(){
StringWriter out = new StringWriter();
PrintWriter writer = new PrintWriter(out);
// use writer, e.g.:
writer.print("ABC");
writer.print("DEF");
writer.flush(); // flush is really optional here, as Writer calls the empty StringWriter.flush
String result = out.toString();
assertEquals("ABCDEF", result);
}
为什么不使用StringWriter呢?我认为这应该能够满足您的需求。
例如:
StringWriter strOut = new StringWriter();
...
String output = strOut.toString();
System.out.println(output);
它取决于:如何构造然后使用PrintWriter。
如果将PrintWriter构造为1st,然后传递给写入它的代码,则可以使用Decorator模式,该模式允许您创建Writer的子类,将PrintWriter作为委托,并将调用转发给委托,但是还会保留您可以存档的内容副本。
public class DecoratedWriter extends Writer
{
private final Writer delegate;
private final StringWriter archive = new StringWriter();
//pass in the original PrintWriter here
public DecoratedWriter( Writer delegate )
{
this.delegate = delegate;
}
public String getForArchive()
{
return this.archive.toString();
}
public void write( char[] cbuf, int off, int len ) throws IOException
{
this.delegate.write( cbuf, off, len );
this.archive.write( cbuf, off, len );
}
public void flush() throws IOException
{
this.delegate.flush();
this.archive.flush();
}
public void close() throws IOException
{
this.delegate.close();
this.archive.close();
}
}
Java:永远不会失去一个为(几乎)没有写36行的好机会!
你只能使用PrintWriter对象来获取它。它会刷新数据,并且不会保留任何内容。这不是你应该看到的用于获取整个字符串的对象,
感谢Navneeth Gopalakrishnan,如果我不能使用Printwriter,那么我有什么选择? 响应对象怎么样? 因为一切都是通过对客户的回应!
您可以将要写入的内容写入StringWriter,最后在完成所有操作后,您也可以将其写入响应式编写器。 通过这种方式,您可以获得已编写的数据,这些数据可用于任何其他目的。
当我的意思是写,我的意思是,将StringWriter中的内容刷新到response.getWriter()。
与cdc正在做的类似 - 你可以扩展PrintWriter然后创建并传递这个新类的实例。
调用getArchive()以获取通过编写器传递的数据的副本。
public class ArchiveWriter extends PrintWriter {
private StringBuilder data = new StringBuilder();
public ArchiveWriter(Writer out) {
super(out);
}
public ArchiveWriter(Writer out, boolean autoFlush) {
super(out, autoFlush);
}
public ArchiveWriter(OutputStream out) {
super(out);
}
public ArchiveWriter(OutputStream out, boolean autoFlush) {
super(out, autoFlush);
}
public ArchiveWriter(String fileName) throws FileNotFoundException {
super(fileName);
}
public ArchiveWriter(String fileName, String csn) throws FileNotFoundException, UnsupportedEncodingException {
super(fileName, csn);
}
public ArchiveWriter(File file) throws FileNotFoundException {
super(file);
}
public ArchiveWriter(File file, String csn) throws FileNotFoundException, UnsupportedEncodingException {
super(file, csn);
}
@Override
public void write(char[] cbuf, int off, int len) {
super.write(cbuf, off,len);
data.append(cbuf, off, len);
}
@Override
public void write(String s, int off, int len) {
super.write(s, off,len);
data.append(s, off, len);
}
public String getArchive() {
return data.toString();
}
}
我认为最好的方法是在其他对象(如StringBuffer)中准备响应,并将其内容发送到响应,并将存储在该变量中的内容保存到文件中。
这有助于我:获取一个SOAP-able对象作为XML字符串。
JAXBContext jc = JAXBContext.newInstance(o.getClass());
Marshaller m = jc.createMarshaller();
StringWriter writer = new StringWriter();
m.marshal( o, new PrintWriter(writer) );
return writer.toString();
这绝对是垃圾和废话。
这个"垃圾"或"胡说八道"怎么样? 我不明白