总的思路是,利用HttpServletResponseWrapper封装HttpServletResponse,使HttpServletResponse采用我们自己定义的输入流(OutputStream)。这样,我们就可以通过这个OutputStream得到目标jsp页面内容。
这里有两个关键点。
1、怎样用当前HttpServletRequest访问目标jsp而不跳转;
2、怎样构建一个OutputStream,且让HttpServletResponse获得的jsp内容输入到这个OutputStream。
如果解决了这两个问题,那一切好办了。
看代码:
代码1:在不跳转下访问目标jsp。就是利用RequestDispatcher.include(ServletRequest request, ServletResponse response)。该方法把RequestDispatcher指向的目标页面写到response中。
public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
WrapperResponse wrapperResponse = new WrapperResponse(response);
request.getRequestDispatcher(jsppath).include(request, wrapperResponse);
return wrapperResponse.getContent();
}
此处一个自定义类WrapperResponse封装了HttpServletResponse,具体请看一下代码。
代码2:HttpServletResponse的封装类,继承自HttpServletResponseWrapper。其核心是构建一个OutputStream,且让HttpServletResponse获得的jsp内容输入到这个OutputStream。
package com.bobrow.framework.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class WrapperResponse extends HttpServletResponseWrapper {
private MyPrintWriter tmpWriter;
private ByteArrayOutputStream output;
public WrapperResponse(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
output = new ByteArrayOutputStream();
tmpWriter = new MyPrintWriter(output);
}
public void finalize() throws Throwable {
super.finalize();
output.close();
tmpWriter.close();
}
public String getContent() {
try {
tmpWriter.flush();
//刷新该流的缓冲,详看java.io.Writer.flush()
String s = tmpWriter.getByteArrayOutputStream().toString("UTF-8");
//此处可根据需要进行对输出流以及Writer的重置操作
//比如tmpWriter.getByteArrayOutputStream().reset()
return s;
} catch (UnsupportedEncodingException e) {
return "UnsupportedEncoding";
}
}
//覆盖getWriter()方法,使用我们自己定义的Writer
public PrintWriter getWriter() throws IOException {
return tmpWriter;
} public void close() throws IOException {
tmpWriter.close();
}
//自定义PrintWriter,为的是把response流写到自己指定的输入流当中
//而非默认的ServletOutputStream
private static class MyPrintWriter extends PrintWriter {
ByteArrayOutputStream myOutput;
//此即为存放response输入流的对象
public MyPrintWriter(ByteArrayOutputStream output) {
super(output);
myOutput = output;
}
public ByteArrayOutputStream getByteArrayOutputStream() {
return myOutput;
} }
好了,讲述完毕,以上代码经过我测试的。
分享到:
相关推荐
将获取到的JSP内容输出到一个`ByteArrayOutputStream`对象中。 5. 最后,将`ByteArrayOutputStream`中的内容写入到指定的HTML文件中。 #### 三、代码实现细节 1. **初始化设置**: - 设置Content-Type为"text/...
4. **内容捕获与保存**:通过`RequestDispatcher`的`include`方法调用指定的JSP页面,并将输出内容写入到内存中的`ByteArrayOutputStream`中。最后将内存中的内容写入到硬盘上的HTML文件中。 #### 关键点总结 - ...
源代码 博文链接:https://msj.iteye.com/blog/179663
- **JSP标签乱码**:如果使用`<%= %>`或`<jsp:expression>`标签输出中文,需确保页面编码正确。 - **表单提交乱码**:对于POST请求,需在JSP中设置请求编码,例如`<form method="post" accept-charset="UTF-8">`。...
通过`RequestDispatcher#include()`方法,Servlet能够将JSP的输出捕获到一个字节数组,然后将这个内容写入到一个静态HTML文件中。 这种方法的优点在于,原有的JSP页面无需改动,只需通过URL调用这个Servlet,动态...
由于Filter无法直接修改ServletResponse的编码,我们需要在响应内容发送前,通过`HttpServletResponseWrapper`包装原始响应对象,然后在包装类中重写`getOutputStream()`方法,返回一个自定义的`ServletOutputStream...
- 使用`Filter`拦截特定的JSP请求。 - 创建自定义的`ServletResponse`包装器`FileCaptureResponseWrapper`来重定向JSP输出到指定文件。 3. **自定义Filter实现**: ```java public class FileCaptureFilter ...
总结起来,Java过滤器通过HttpServletResponseWrapper和自定义的输出流包装类,可以在HTTP响应被发送到客户端之前对其进行修改,这在需要动态调整响应内容、添加额外信息或者实现其他自定义逻辑的场景下非常有用。...
- JSP页面通常在顶部使用`<%@ page pageEncoding="utf-8"%>`来指定页面编码。 2. **请求编码**: - 在Servlet或JSP中,通过`request.setCharacterEncoding("UTF-8")`设置请求编码,确保与页面编码一致。 - 如果...
通过使用`HttpServletResponseWrapper`,我们可以控制响应的输出流,将其存储在内存中,然后在需要时进行修改。这对于实现诸如日志记录、内容过滤、字符编码转换等任务非常有用。在实际应用中,开发者可以根据具体...
为了实现在过滤器中获取请求体内容以及响应内容的功能,本方案主要采用了以下技术手段: 1. **对`HttpServletRequest`进行封装**:通过创建`HttpServletRequestWrapper`子类来包装原始请求对象,并重写`getReader()...
5. **JSTL(JavaServer Pages Standard Tag Library)**:为了减少在JSP页面中使用脚本,JSTL提供了一套标准标签库,包括核心标签、XML标签、JDBC标签、函数标签等,提高了代码的可读性和可维护性。 6. **EL...
所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出。 本文解决办法: 在前面所说的网络解决办法中,使用的是一种躲避的方式解决该问题,也就是置之不理。 这里提供一个...
javax/servlet/jsp/resources/jsp_2_0.xsd javax/servlet/jsp/resources/jsp_2_1.xsd javax/servlet/jsp/resources/jspxml.xsd javax/servlet/LocalStrings.properties javax.servlet....
- **class: HttpServletResponseWrapper**:用于包装HttpServletResponse对象,允许修改响应属性。 ### 3. Filters Filter在Servlet容器中起着拦截器的作用,可以在请求到达目标资源之前或响应发送到客户端之前...
通过实现`Filter`接口,重写`doFilter()`方法,设置请求和响应的编码,如`HttpServletRequestWrapper`和`HttpServletResponseWrapper`。 8. 字符集理解: 对于不同的字符集,如GBK、UTF-8、GB2312等,理解它们之间...