JSP页面静态化详解

JSP 1.JSP基础 2.EL表达式 一、JSP基础 1.简介 JSP(java server pages) Java服务器页面 静态网页:可以直接被浏览器渲染。但是不能做数据交互。 动态网页:不可以被浏览器直接渲染,需要第三方辅助,可以与Java进行数据交互操作。 JSP = html+java+jsp本身的标签 ... 阅读详情

这篇文章源码转载自☞http://www.cnblogs.com/xiaochangwei/p/5025790.html

我做了更详细的介绍。。。。。。。

我觉得这篇文章应该是介绍jsp页面静态化的最详细的文章了(尽管我可能没找到更详细的),但是我还是花了很长的时间来理解这里面调用的类和方法之类的,

并且记录了下来,现记录如下:


这是articleTemplate.jsp,测试用的jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文章标题——${id}</title>
</head>
<body>现在时间是${time},你访问的文章id为${id}
</body>
</html>

这是 JspStatic  servlet,用于出来前台的url链接的请求

package Test;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class JspStatic extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public JspStatic() {
        super();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if (request.getParameter("id") != null) {
            String fileName = "article_" + request.getParameter("id") + ".html";
            //getServletContext().getRealPath("/")获取的是
            //D:\mkeclipse\workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mkk\article_100.html
            //这里需要/mkk/下有这个文件夹,没有的话报错(系统找不到指定路径)
            String filePath = getServletContext().getRealPath("/articles/")+ fileName;
            System.out.println(filePath);
            File chapterFile = new File(filePath);
            if (chapterFile.exists()) {
//                System.out.println("html页面存在,直接跳转");
                response.sendRedirect(fileName);
                return;
            }
            
            
//            System.out.println("新生成html页面");
            //TODO 这里可调用service查询页面上需要的数据,然后封装到request里面
            request.setAttribute("time", new java.util.Date());
            request.setAttribute("id", request.getParameter("id"));
            new CreateStaticHTMLPage().create(request, response, getServletContext(), fileName, filePath,
                    "/articleTemplate.jsp");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

这里是CreateStaticHTMLPage()类,用于创建一个静态页面的具体步骤

package Test;


import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 * 创建HTML静态页面 
 * 
 * @author xiaochangwei
 * 
 */
public class CreateStaticHTMLPage {
    /**
     * 生成静态HTML页面的方法
     * 
     * @param request
     *            请求对象
     * @param response
     *            响应对象
     * @param servletContext
     *            Servlet上下文
     * @param fileName
     *            文件名称
     * @param fileFullPath
     *            文件完整路径
     * @param jspPath
     *            需要生成静态文件的JSP路径(相对即可)
     * @throws IOException
     * @throws ServletException
     */
	HttpServlet  da= new HttpServlet() {
	};
    public void create(HttpServletRequest request, HttpServletResponse response,
            ServletContext servletContext, String fileName, String fileFullPath, String jspPath)
                    throws ServletException, IOException {
        response.setContentType("text/html;charset=gb2312");// 设置HTML结果流编码(即HTML文件编码)
        
        /*
         * 这里用到javax.*;这里的类,所以把源文件引进来,然后自己看
         * 本tomcat是9.0M10,所以下载该版本的src_zip包。
         * 地址:http://archive.apache.org/dist/tomcat/tomcat-9/
         * 	  引入源码步骤:自己百度
         * 
         */
        
        RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);// 得到JSP资源
        /*
         *  ByteArrayOutputStream  中的数据被写入一个字节数组
         *  	方法:write(byte[] b):把b字节数组中的内容写到该ByteArrayOutPutStream中,该类中有一个byte buf[];
         *  	用于缓存读进来的b(其实就是复制一份)【源码分析】http://wangkuiwu.github.io/2012/05/03/ByteArrayOutputStream/
         *  	获取byte[]方法:byte[]  toByteArray():调用这个方法就可以获取一份经过Arrays.copyOf(buf, count);复制过的字节数组了。
         */
        
        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 用于从ServletOutputStream中接收资源
       
        
        final ServletOutputStream servletOuputStream = new ServletOutputStream() {// 用于从HttpServletResponse中接收资源
        
            public void write(byte[] b, int off, int len) {
                byteArrayOutputStream.write(b, off, len);
            }

            public void write(int b) {
                byteArrayOutputStream.write(b);
            }

			@Override
			public boolean isReady() {
				// TODO Auto-generated method stub
				return false;
			}

			@Override
			public void setWriteListener(WriteListener arg0) {
				// TODO Auto-generated method stub
				
			}
        };
        
        /*
         * OutputStreamWriter 是字节流到字符流的一个桥梁
         *    用法: new BufferedWriter(new OutputStreamWriter(System.out));这里就会返回一个字符流的对象
         */
        /*
         * PrintWriter  将对象的格式表示打印到文本输出流。
         * 	   构造函数: 1.PrintWriter(OutputStream out)
         * 		       2.PrintWriter(File file)
         * 		       ......
         *    用法: 1.print() 打印出内容
         *    		2.flush() 刷新流
         *    		3.write(char[] buf, int off, int len) 	写一个字符数组的一部分。
         */
        
        final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));// 把转换字节流转换成字符流
        
        /*
         * 
         * HttpServletResponseWrapper(HttpServletRequest req) 构造一个包装给定请求的请求对象
         */
        /*
         * 这里的response就是之前的response
         * 而这里的httpServletResponse已经具有了完整的信息的httpservletresponse了
         * 	并且
         */
        HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response) {// 用于从response获取结果流资源
           /*
            * 这里重写了HttpServletResponseWrapper的父类ServletResponseWrapper的getOutputStream()和getWriter()方法
	*	getOutputStream()和getWriter()返回一个字节流和一个字符流都是向客户端发送响应
	    getOutputStream()可以发送二进制数据,getWriter()可以发送字符数据
	    */
        	
        	public ServletOutputStream getOutputStream() {
        		return servletOuputStream;
            }

            public PrintWriter getWriter() {
                return printWriter;
            }
        };
	/*关于include的详细解释,请看这篇文章 http://www.jianshu.com/p/35d9e05d5989*/
        rd.include(request, httpServletResponse);// 发送结果流、、
						//向客户端发送response,
        printWriter.flush();// 刷新response中缓冲区,把缓冲区的数据输出,这样byteArrayOutputStream就获取了全部的数据

       
        FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);
        /* 此时的bytearrayoutputstream已经具有了所有的jsp中servletoutputstream的内容*/
   
        byteArrayOutputStream.writeTo(fileOutputStream);// 把byteArrayOuputStream中的资源全部写入到fileOuputStream中
        fileOutputStream.close();// 关闭输出流,并释放相关资源
        response.sendRedirect(fileName);// 发送指定文件流到客户端
    }
}







智驾系统分层架构:从传感器到执行器的全链路解析 本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。 阅读详情

相关推荐

AD9026芯片开发实战:从Example Code到API调用的关键步骤解析

本文详细解析了AD9026芯片开发的核心流程,重点阐述了如何从官方提供的Example Code入手,逐步理解硬件平台发现、HAL层初始化、配置加载、芯片复位、固件启动、JESD链路建立等关键API调用序列。通过剖析示例工程的结构与核心文件,为开发者在自定义硬件平台上移植和调试AD9026驱动提供了清晰的实战指南。

java5的博客 767

JSP-购物类网站(购物车功能,翻页功能,文件下载功能,文末有代码及数据库备份)

目录 网站功能框架 网站架构图 网站项目树 网站首页 注册登录页面 用户个人中心页面 商家个人中心页面 搜索结果页面 商品详细信息页面 手机端页面(部署后) 之前在校内参加过网站设计大赛,贡献全部代码,供jsp小白学习。 这是一个购物类网站,后台采用纯jsp编写,,当时还没学明白框架,学了SSH框架后自然明白框架的好处。当时学的还浅,请大神绕道。 接下来是网站主要功能页面...

关注网络安全、云原生安全 1万+

jsp简单静态网页

NULL 博文链接:https://1074457664.iteye.com/blog/2286112

如何将jsp动态网页转换成静态页面

如果我可以将jsp动态网页转换成静态页面,那么访问的时候就不需要频繁的访问数据库了。jsp 显示内容缓存技巧 前段时间做自己社区的论坛,在jive 的基础上做一个页面显示所有论坛的帖子,可以称 之为总版,模仿forum 类的接口做个superforum 并且实现cachable,不过因为这个页面 刷新量比较大,虽然被cache 了,我还是想办法进行页面的缓存,感觉用jsp 产生的html...

ajwh64482的博客 395

java jsp静态常量,static与final变量-JSP教程,Java技巧及代码

一、illegal forward refrence前天写一个类时遇到一个很眼生的编译错误(问题简化后):punlic final class constants{public static int var2 = var1 + 1;public static int var1 = 1;}编译时出错(第2行):illegal forward refrence仔细一想,是因为var2引用的var1在v...

weixin_34690611的博客 554

jsp 静态化

JSP静态化   2012-10-25 12:45:39|  分类: java |  标签: |字号大中小 订阅 什么是静态化静态化就是将动态的jsp转换为静态的html; 为什么要静态化?提高性能加快访问速度,静态化页面html不需要访问数据库等操作所以要比动态的jsp快很多。 怎样实现静态化? 实现静态化的方法很多,本文章要说明的是通过过滤器实现jsp的静态

软件的世界 1206

java 页面静态化_java Freemarker页面静态化实例详解_JSP编程_脚本之家

FreemarkerFreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。目前企业中:主要用 Freemarker 做静态页面或是页面展示总结:freemarker 模版引擎...

weixin_39621427的博客 164

JSP页面静态化

首先说说为什么要静态化。 对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。 为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资源。如果这期间还有和数据库的通讯,那么代价将会更大。 如果一个页面在一定的时间内,其内容没有发生

IT藏经阁:收集各种精华帖 910

jsp页面静态化问题

首先说说为什么要静态化。《转载他人,感觉很实用》 对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。 为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资源。如果这期间还有和数据库的通讯,那么代价将会更大。 如果一个页面在一定

waiting的专栏 1907

JSP静态化

<br />首先说说为什么要静态化。<br /> 对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。<br /> 为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资源。如果这期间还有和数据库的通讯,那么代价将会更大。<br /> 如果一个页面在一定的时间内,其内容没有发生改变,那么就不必为每一次对它的访问进行一次“新”的编译或执行。我

王康的技术博客 619

java jsp静态常量_JSP页面静态化

Ps:好久没写博客了,不是我太懒,是因为苦逼的我出差去上海了,天天加班 刚回成都....今天说说jsp页面静态化,知道静态化的朋友都不陌生,说白了就是访问后缀是html 而不是jsp。没听说过静态化的朋友会问为啥要这么做,jsp访问好好的 为啥多此一举好处:1. 效率方面,访问html页面时,服务器找到页面后直接返回,不会再进行后台处理,速度快很多很多,同时也是解决高并发,降低服务器资源占用最有效...

weixin_34238178的博客 336

jsp页面静态化

JSP实现页面静态化  Java, JSP Add comments 六092012   对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。 为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资

zzjjiandan的专栏 1万+

实现页面静态化,PHP是如何实现的?

随着网站的内容的增多和用户访问量的增多,无可避免的是网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化。 一般情况下会从以下方面来做优化 1、动态页面静态化 2、优化数据库 3、使用负载均衡 4、使用缓存 5、使用CDN加速 现在很多网站在建设的时候都要进行静态化的处理,为什么网站要进行静态化处理呢?我们...

谢谢你,慌乱了我的年华 8326

java页面静态化

1.概念 页面静态化,其实就是将动态生成的jsp页面,变成静态的HTML页面,让用户直接访问。 2.优点 (1)加快页面打开浏览速度,静态页面无需连接数据库,打开速度较动态页面有明显提高。 (2)降低数据库压力,数据库只有在最初写入HTML文件时被访问一次,之后都直接访问静态页面,大大降低与数据库交互次数。 (3)即使客户端数据库出错,也不影响网站的正常访问。 2.原理 ...

qq_42922647的博客 1615

JSP 设置静态文件资源访问路径

我们直接这样写 如下图 找到父级目录 然后寻找下面的 static 下的 img.png。这边 我们直接找到 webapp目录下的 WEB-INF目录下的 web.xml。这里 我们先在 WEB目录webapp 下创建一个包 叫 static。然后 运行代码 我们内容就出来了。运行代码 很明显 它没有找到。然后 我们扔一张图片进去。然后 jsp代码更改如下。

weixin_45966674的博客 886

jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结

为什么使用该功能? 项目中的每个页面都包含产品名称、Logo、版本等信息,我希望修改一处,其它所有的全部跟着变。  有同学会说那就都引用一个页面“”就Ok了;但是我希望这些信息都是可以通过后台代码修改的,修改后保存到数据库和一个静态类中;其实后台直接读写这个引用 的页面或者保存到属性文件(properties)中也是可以的,我觉得还是存到数据库中好一些。  还有同学会说直接使用“”就

rongge2008的专栏 966

JSP静态包含与动态包含的区别

JSP提供了两种主要的包含机制:静态包含(Static Include)和动态包含(Dynamic Include)。这两种包含方式在多个方面存在显著差异,本文将详细探讨这些差异。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 7673

JSP中的静态引入和动态引入

<%@ include file = “…” %>静态引入 include 指令用于通知 JSP 引擎在翻译当前 JSP 页面时,将其他文件中的内容合并进当前 JSP 页面转换成的 Servlet源文件中,这种在源文件级别进行引入的方式,称为静态引入,当前 JSP 页面与静态引入的文件紧密结合为一个 Servlet。这些文件可以是JSP 页面、HTML 页面、文本文件或是一段 Jav...

weixin_43498251的博客 690

Jsp生成静态页面

Jsp生成静态页面 为了减轻服务器压力,将原来的文章管理系统由JSP文件的从数据库中取数据显示改为由jsp生成静态html文件后直接访问html文件。下面是一个简单的示例 1.buildhtml.jsp &lt;%@ page contentType=“text/html; charset=gb2312” import=“java.util.,java.io.”%&gt; &lt;% try{ S...

anhldd的博客 1409

振动故障诊断.zip_matlab__matlab_

震动故障诊断的相关例程和源码,非常有参考价值

上一篇: Tips—1(c标签)
下一篇: 留言板功能—jQuery解析json并加载到HTML
static_mkk
博客等级 码龄11年 7粉丝 52原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值