2012-02-10 11 views
14

Tôi đang tạo trang động bằng JSP, tôi muốn lưu trang hoàn chỉnh được tạo động này vào tệp dưới dạng lưu trữ.làm thế nào để chuyển đổi PrintWriter thành String hoặc ghi vào một tệp?

Trong JSP, mọi thứ đều được ghi vào PrintWriter out = response.getWriter();

Vào cuối trang, trước khi gửi câu trả lời cho khách hàng Tôi muốn lưu trang này, hoặc trong tập tin hoặc trong bộ đệm như chuỗi cho điều trị sau này.

Làm cách nào để lưu nội dung Printwriter hoặc chuyển đổi thành String?

+0

hãy kiểm tra các câu trả lời cho câu hỏi sau đây. http://stackoverflow.com/questions/2010990/how-do-you-return-a-json-object-from-a-java-servlet – Raj

+0

Cảm ơn Raj, nhưng đây không phải những gì tôi đang tìm kiếm, khách hàng sẽ xem html bình thường, nhưng ở phía máy chủ, tập lệnh sẽ tạo bản sao cục bộ và ghi vào tệp. – superzoom

+0

bản sao có thể có của [Cách đăng nhập nội dung phản hồi từ máy chủ web java] (http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server) – BalusC

Trả lời

6

Nó sẽ phụ thuộc vào: cách PrintWriter được xây dựng và sau đó được sử dụng.

Nếu PrintWriter được xây dựng đầu tiên và sau đó được chuyển tới mã ghi vào nó, bạn có thể sử dụng mẫu Decorator cho phép bạn tạo một lớp con của Writer, lấy PrintWriter làm đại biểu và chuyển tiếp cuộc gọi đến đại biểu, nhưng cũng duy trì một bản sao của nội dung mà bạn có thể lưu trữ.

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(); 
    } 
} 
+0

Java: không bao giờ mất một dịp tốt để viết 36 dòng cho (gần như) không có gì! –

1

Bạn không thể tải nó chỉ với đối tượng PrintWriter của bạn. Nó xóa sạch dữ liệu và không chứa bất kỳ nội dung nào trong chính nó. Đây không phải là đối tượng bạn nên xem để lấy toàn bộ chuỗi,

+0

Cảm ơn Navneeth Gopalakrishnan, nếu tôi không thể sử dụng Printwriter, thì tôi có tùy chọn nào? Còn đối tượng phản ứng thì sao? Bởi vì tất cả mọi thứ đang trải qua phản ứng với khách hàng !!! – superzoom

+1

Bạn có thể viết những thứ bạn muốn viết vào một StringWriter và cuối cùng khi mọi thứ được thực hiện, bạn có thể viết nó vào nhà văn của người phản ứng. Bằng cách đó bạn có dữ liệu bạn đã viết có thể được sử dụng cho bất kỳ mục đích nào khác. –

+0

Khi tôi có nghĩa là viết, tôi có nghĩa là, tuôn ra các nội dung trong StringWriter để 'response.getWriter()' của bạn quá. –

0

Cách tốt nhất tôi nghĩ là chuẩn bị phản hồi của bạn trong các đối tượng khác như StringBuffer và xóa nội dung của nó thành phản hồi và sau khi lưu nội dung được lưu vào biến đó vào tệp.

7

Tại sao không sử dụng StringWriter thay thế? Tôi nghĩ rằng điều này sẽ có thể cung cấp những gì bạn cần.

Vì vậy, ví dụ:

StringWriter strOut = new StringWriter(); 
... 
String output = strOut.toString(); 
System.out.println(output); 
-1

này đã giúp tôi: để đạt được một đối tượng SOAP-thể như chuỗi XML.

JAXBContext jc = JAXBContext.newInstance(o.getClass()); 
Marshaller m = jc.createMarshaller(); 
StringWriter writer = new StringWriter(); 
m.marshal(o, new PrintWriter(writer)); 
return writer.toString(); 
+2

Điều này hoàn toàn là rác rưởi và vô nghĩa. –

+0

Làm thế nào là "rác" hay "vô nghĩa" này? Tôi không hiểu. – Jubz

0

Cùng các dòng tương tự với những gì cdc đang làm - bạn có thể mở rộng PrintWriter và sau đó tạo và vượt qua một trường hợp của lớp mới này.

Gọi getArchive() để nhận bản sao dữ liệu được truyền qua người viết.

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(); 
    } 
} 
4

Để có được một chuỗi từ sản phẩm của một PrintWriter, bạn có thể vượt qua một StringWriter đến một PrintWriter qua các nhà xây dựng:

@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); 
}