动态JSP页生成静态HTML

具体实现:

         利用 Filter 的过滤功能把 *.jsp 过滤出来,判断是否存在对应的 .html 文件,如果不存在对应的 .html 文件,则将其内容读出写入指定的 .html 文件,再跳转到对应的 .html 即可。如果存在对应的 .html 文件,则直接跳转到对应的 .html 即可。

 

代码:

JspFilter.java

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class JspFilter implements Filter {

 

    public void destroy() {

        // TODO 自动生成方法存根

    }

 

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

 

        HttpServletRequest hreq = (HttpServletRequest) request;

        HttpServletResponse hresp = (HttpServletResponse) response;

 

        String name = hreq.getRequestURL().substring(

                    hreq.getRequestURL().lastIndexOf( "/" ) + 1,

                    hreq.getRequestURL().lastIndexOf( "." ));

        if (hreq.getRequestURL().indexOf( ".jsp" ) != -1 && ( null == hreq.getParameter( "type" ) || hreq.getParameter( "type" ).equals( "" ))) {           

                hresp.sendRedirect(hreq.getContextPath()+ "/conversion ?name=" +hreq.getRequestURL());

                return ;

        }

        chain.doFilter(request, response);

    }

 

    public void init(FilterConfig arg0) throws ServletException {

        // TODO 自动生成方法存根

    }

}

 

ConversionServlet.java

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.HttpURLConnection;

import java.net.URL;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class ConversionServlet extends HttpServlet {

 

    public ConversionServlet () {

        super ();

    }

 

    public void destroy() {

        super .destroy(); // Just puts "destroy" string in log

        // Put your code here

    }

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        response.setContentType( "text/html" );

        PrintWriter out = response.getWriter();

        //---- 获取请求的URL

        String reqTarget = request.getParameter( "name" );

        //---- 指定对应JSPHTML 名称

        String name = reqTarget.substring(reqTarget.lastIndexOf( "/" ) + 1,

                reqTarget.lastIndexOf( "." ));

        //--- 判断是否存在对应的HTML 文件

        File file = new File(request.getRealPath( "/" ) + name + ".html" );

       

        if (!file.exists()) {   //-------- 如果不存在对应的HTML 文件

            try {

               

                file.createNewFile();    //-------- 创建HTML 文件

                //-------JSP 的内容写入对应的HTML 文件内

                InputStream in;

                StringBuffer sb = new StringBuffer( "" );

            //---- 注意这里,不能直接访问请求的URL ,如果直接访问的话,会陷入死循环

                URL url = new java.net.URL(reqTarget.toString()+ "?type=11" );

                HttpURLConnection connection = (HttpURLConnection) url

                        .openConnection();

                connection.setRequestProperty( "User-Agent" , "Mozilla/4.0" );

                connection.connect();

                in = connection.getInputStream();

                java.io.BufferedReader breader = new BufferedReader(

                        new InputStreamReader(in, "GBK" ));

                String currentLine;

 

                FileOutputStream fos = new FileOutputStream(file);

                while ((currentLine = breader.readLine()) != null ) {

                    sb.append(currentLine);

                    fos.write(currentLine.getBytes());

                }

                if ( null != breader)

                    breader.close();

                if ( null != fos)

                    fos.close();

                //--------------- 转到与JSP 对应的HTML

                response.sendRedirect(request.getContextPath()+ "/" +name + ".html" );

            } catch (Exception e) {

 

                e.printStackTrace();

            }

        } else {

            //---------- 如果存在指定的HTML ,直接跳转到指定的HTML

            response.sendRedirect(request.getContextPath()+ "/" +name + ".html" );

        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        doGet(request, response);

    }

    public void init() throws ServletException {

        // Put your code here

    }

}

 

WEB.XML 配置:

 

<? xml version = " 1.0 " encoding = " UTF-8 " ?>

< web-app version =" 2.4 "

    xmlns =" http://java.sun.com/xml/ns/j2ee "

    xmlns:xsi =" http://www.w3.org/2001/XMLSchema-instance "

    xsi:schemaLocation =" http://java.sun.com/xml/ns/j2ee

    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd " >

  < filter >

    < filter-name >jsp filter </ filter-name >

    < filter-class > com.beanutil.JspFilter </ filter-class >

  </ filter >

  < filter-mapping >

    < filter-name > jspfilter </ filter-name >

    < url-pattern > *.jsp </ url-pattern >

  </ filter-mapping >

  < servlet >

    < servlet-name >c onversion </ servlet-name >

    < servlet-class > com.beanutil.ConversionServlet </ servlet-class >

  </ servlet >

 

  < servlet-mapping >

    < servlet-name > conversion </ servlet-name >

    < url-pattern > /conversion </ url-pattern >

  </ servlet-mapping >

</ web-app >

 

转自:http://www.blogjava.net/wyz191/archive/2007/05/30/120937.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值