动态Jsp文件生成对应Html文件

1.在 index.jsp文件中,加入一条超链接,用来访问将 Jsp 转换成Html的servlet

<a href="servlet/GeneraticServlet">把template文件夹下的jsp都生成静态html文件</a>

2. 在项目根目录下新建一个template文件夹,将要转换成静态html的 jsp页面放入,我新建的的文件为MyJsp1.jsp, MyJsp2.jsp, MyJsp3.jsp, 内容类似

  <body>
     这是第<%=1 %> 个jsp页面 <br>
  </body>

3. GeneraticServlet这个servlet中使用 RequestDispatcher 访问多个Jsp


public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//将Jsp页面转换成html,存储在项目路径下,source为要转换的jsp, target为生成的html文件名
		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/servlet/JspToHtml?source=MyJsp1.jsp&target=1.html");
		//发送request的请求,请求成功后,程序返回到此处继续执行,这是用dispatcher.include()方法的主要原因,可以发出多次reqeust的请求
		dispatcher.include(request, response);
		//生成第二个html
		dispatcher = getServletContext().getRequestDispatcher("/servlet/JspToHtml?source=MyJsp2.jsp&target=2.html");
		dispatcher.include(request, response);
		//生成第三个html
		dispatcher = getServletContext().getRequestDispatcher("/servlet/JspToHtml?source=MyJsp3.jsp&target=3.html");
		dispatcher.include(request, response);
		
		response.sendRedirect("../index.jsp?responsecode=1");
	}


4. 注意到 ,真正将Jsp转换为Html的为JspToHtml这个Servelt , 参数 source是template文件夹下要转换成html的 jsp文件,target为生成的html的文件名

JspToServelt的代码如下


	response.setContentType("text/html;charset=utf-8");
		
		String source =request.getParameter("source");
		String target = request.getParameter("target");
		
		
		try {
			//获取jsp响应内容,第一个参数为文件路径
			String content = getJspOutput("../template/"+source,request,response);
			//将得到的响应内容写入一个html文件中 
			//获得项目根目录地址
			String rootPath = this.getServletConfig().getServletContext().getRealPath("/");	
			//创建文件
			File file = new File(rootPath+target);
			if(!file.exists())
			{
				file.createNewFile();
			}
			else
			{
				//先删除原文件
				file.delete();
				file.createNewFile();
			}
			//在文件中写入内容
			FileOutputStream fos = new FileOutputStream(rootPath+target);  
			
			
			fos.write(content.getBytes());
			fos.flush();
			fos.close();
			System.out.println(file.getAbsolutePath()+"生成成功");

5 注意到,getJspOutput("../template/"+source,request,response) 改方法也是自己定义的,第一个参数为要转换的jsp文件的路径

public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response)
			throws Exception
		{	
			
			WrapperResponse wrapperResponse = new WrapperResponse(response);
			//浏览器显示的数据都是response流输出的(response.getWriter().print())
			//所以可以通过修改response的getWriter()方法,将文件输出流传入PrintWriter中
			//getWriter方法是容器自己调用的,我们只需要重写 wrapperResponse的getWriter方法就可以
			request.getRequestDispatcher(jsppath).include(request, wrapperResponse);
			//获取自定义文件流的内容
			return wrapperResponse.getContent();
		}


6. WrapperResponse 自己定义的,继承了  HttpServletResponseWrapper  ,用来包装HttpServletResponse


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




因为浏览器显示的数据都是response流输出的(response.getWriter().print())

所以可以通过修改response的getWriter()方法,将文件输出流传入PrintWriter中

getWriter方法是容器自己调用的,我们只需要重写 wrapperResponse的getWriter方法就可以




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。