Voj*_*ěch 5 java concurrency freemarker
我试图阅读FreemarkerView渲染的结果:
View view = viewResolver.resolveViewName(viewName, locale);
view.render(model, request, mockResponse);
Run Code Online (Sandbox Code Playgroud)
要读取结果,我创建了mockResponse,它封装了HttpServletResponse:
public class HttpServletResponseEx extends HttpServletResponseWrapper {
ServletOutputStream outputStream;
public HttpServletResponseEx(HttpServletResponse response) throws IOException {
super(response);
outputStream = new ServletOutputStreamEx();
}
@Override
public ServletOutputStream getOutputStream() {
return outputStream;
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
}
}
Run Code Online (Sandbox Code Playgroud)
还有我的ServletOutputStream,它使用StringBuilder构建String:
public class ServletOutputStreamEx extends ServletOutputStream {
StringBuilder stringBuilder;
public ServletOutputStreamEx() {
this.stringBuilder = new StringBuilder();
}
@Override
public void write(int b) throws IOException {
}
@Override
public void write(byte b[], int off, int len) throws IOException {
stringBuilder.append(new String(b, "UTF-8"));
}
@Override
public String toString() {
return stringBuilder.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
有了这些,我能够轻松地用方法阅读响应ServletOutputStreamEx.toString.
我的问题是write方法没有按正确的顺序调用,最后最终的String 混合而且顺序不正确.这可能是由Freemarker中的并发引起的,但我不知道如何修复它.
感谢您的答复:write(int b)未实施,因为它从未被调用。最后的问题是字节数组,它也包含了之前的字符串。因此需要将字符串创建为String(b, off, len, "UTF-8").
| 归档时间: |
|
| 查看次数: |
10655 次 |
| 最近记录: |