Java Servlet实现静态页面技术

1.背景

往往首页是包含多很内容的,对于讲究首页访问速度。动态请求生成jsp页面,往往略显吃力,这样对于服务器和db都有很大的压力。

为此,通过定时器定时请求生成静态页面,进行定时更新。

2.实现逻辑

我们需要解决下面一些技术问题:

一、静态请求的逻辑:

1.拼装jsp请求,发送请求
2.将请求到的结果进行流输出,jsp->html的转换过程
额外需求:
定时调用生成静态页面
问题:
1.如何知道jsp请求?
查看配置文件便可知道
2.如何发送jsp请求?
转发即可(保留request,response)
----------------------------------------
1.如何将请求的结果保存并进行流输出?
虽然有源码,但还是不怎么清楚原理

二、如何让其定时的自动发送生成静态页面的请求?

1.使用URLConnection进行发送请求(携带必要参数)
2.使用Timer进行定时访问
3.使用wrapper生成后台服务,自动发送请求


3.实现源码

-------------------------------------------web端-------------------------------------------------------------------

1.生成静态页面的servlet请求源码-ToHtmlServlet

public class ToHtmlServlet extends HttpServlet {
	/**
	 * 需要转换成静态页面的动态请求,相对路径(request)
	 */
	private String url = "";
	/**
	 * 生成的静态文件的绝对路径
	 */
	private String path = "";
	/**
	 * 需要转换成静态页面的动态请求名称(ps:不需要添加do后缀)
	 */
	private String actionName="";
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 则你访问这个servlet时加参数.如http://localhost/test/toHtml?actionName=index
		actionName = req.getParameter("actionName");// 你要访问的jsp文件名,如index,不包括扩展名
		url = "/" + actionName + ".do";
		path = this.getServletContext().getRealPath("/") + "index.htm";
		// 这是生成的html文件名,如index.htm.文件名字与源文件名相同。扩展名为htm
		RequestDispatcher rd = req.getRequestDispatcher(url);
		// 通过匿名类来创建一个stream实例,只引用其中write方法
		// 通过匿名类创建PrintWriter实例,使用上面输出客户端的流stream
		// 通过自定义实例化pw对象
		/**
		 * 个人觉得产生的匿名产生的stream和rep以及新实例化的pw对象,都与本身此请求的steam,rep,pw对象完全不同。
		 * 这些自定产生的对象是用于保存流并输出到指定的静态文件。
		 */
		// 静态处理开始....
		final ByteArrayOutputStream os = new ByteArrayOutputStream();
		final ServletOutputStream stream = new ServletOutputStream() {
			public void write(byte[] data, int offset, int length) {
				os.write(data, offset, length);
			}

			public void write(int b) throws IOException {
				os.write(b);
			}
		};
		final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
		HttpServletResponse rep = new HttpServletResponseWrapper(resp) {
			public ServletOutputStream getOutputStream() {
				return stream;
			}

			public PrintWriter getWriter() {
				return pw;
			}
		};
		// 用来记录保留request和response,以后不能再修改response里表示状态的信息
		rd.include(req, rep);
		pw.flush();
		FileOutputStream fos = new FileOutputStream(path); // 把jsp输出的内容写到xxx.htm
		os.writeTo(fos);
		fos.close();
		// 静态处理结束...
		// 下面是针对此请求对应客户端的响应方式
		resp.setCharacterEncoding("utf8");
		PrintWriter out = resp.getWriter();
		out.print("生成成功~");
	}
}

2.需要生成静态页面的动态请求-IndexServlet(url)

public class IndexServlet extends HttpServlet {

	/* (non-Javadoc)
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		RequestDispatcher rd=req.getRequestDispatcher("template.jsp");
		rd.forward(req, resp);
	}
	
}

3.web.xml配置详情

  <servlet>
  	<servlet-name>toHtml</servlet-name>
  	<servlet-class>com.techbirds.servlet.ToHtmlServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>toHtml</servlet-name>
  	<url-pattern>/toHtml.do</url-pattern>
  </servlet-mapping>
  
  <!-- 需要静态的首页请求 -->
  <servlet>
    	<servlet-name>toIndex</servlet-name>
  		<servlet-class>com.techbirds.servlet.IndexServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>toIndex</servlet-name>
  	<url-pattern>/toIndex.do</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>toIndexHtm.jsp</welcome-file>
  </welcome-file-list>

4.jsp页面列表



-------------------------------------------定时服务端-------------------------------------------------------------------

5.发送请求-Service

public class CallHtmlService {
	public void callHtml(String actionName) {
		try {
			String str = "http://localhost:8080/toHtml/toHtml.do?actionName="
					+ actionName;
			int httpResult;
			URL url = new URL(str);
			URLConnection connection = url.openConnection();
			connection.connect();
			HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
			httpResult = httpURLConnection.getResponseCode();
			if (httpResult != HttpURLConnection.HTTP_OK) {
				System.out.println("生成失败...");
			} else {
				System.out.println("生成成功...");
			}
		} catch (Exception e) {
		}
	}	
}

6.定时任务

public class CallHtmlTimer {
	/**
	 * 延迟几秒执行
	 */
	private static Long DELAYTIME=1000*10l;
	/**
	 * 间隔几秒执行
	 */
	private static Long PERIODTIME=1000*10l;
	public static void main(String[] args) {
			Timer timer=new Timer();
			timer.schedule(new CallHtmlTask(), DELAYTIME, PERIODTIME);
	}
}

class CallHtmlTask extends TimerTask{

	@Override
	public void run() {
		new CallHtmlService().callHtml("toIndex");
	}			
}

ps:做成windows服务参考: http://blog.youkuaiyun.com/techbirds_bao/article/details/8799528


java web jsp 静态页面和动态页面对比。动态页面实现分页效果 基于Java Web,系统采用MVC架构,分为用户认证、信息管理两大功能模块。用户认证包括登录验证和验证码功能;信息管理实现了用户查询(分页/条件)、添加、修改和删除功能。技术栈包含JSP/Servlet前端、Java后端、JDBC数据库访问,使用Bootstrap框架美化界面。系统采用分层设计,包含实体类、DAO数据访问、Service业务逻辑和Servlet控制层,通过Druid连接池管理数据库连接。项目结构清晰,包含用户实体类、工具类及各类Servlet控制器,实现了完整的用户信息管理功能。 阅读详情

相关推荐

软件破解逆向安全(一)初识内存地址和偏移

工具:CE 内存:数字->存访在电脑中->内存 实例:如何修改植物大战僵尸阳光 内存搜索最核心:过滤数据 先用CE加载植物大战僵尸,如下图 我们可以看到目前我们的阳光数是50,我们尝试在ce里搜索精确数值,4 byte是int整数的表示。 我们发现有很多数据,尝试收集一个阳光变成75再次搜索: 我们发现就一个了,这时我们可以双击Value随便修改阳光的数值了。 这里我们说一下动态和静态地址 动态地址:临时用于存放数据的地址,黑色。特征:重新启动游戏地..

weixin_43781139的博客 2592

静态网页篇:JavaScript相关基础

基于对象和事件驱动的解释型脚本语言,嵌入HTTP页面中,将静态页面转为支持用户交互并响应应用事件的动态页面。 多用于数据验证、控制浏览器、生成时钟、日历和时间戳文档。 【事件】:用于描述发生了什么事情,用户的鼠标或键盘操作(如单击、文字输入。选中条目等,以及其它页面操作(如页面加载或页面卸载)) 【JavaScript位置】HTML头部、主体或单独外部文件,例: ①头部 <!DOCTYPE html> <html> <head> <meta charse

LGHKCVG的博客 932

UE5 Metahuman与Blender手动绑定:ARKit面部动画实战对比

面部动画是角色动画领域的核心技术,其核心原理在于通过驱动面部骨骼或混合形状来模拟真实肌肉运动,从而赋予数字角色生命力。这项技术的价值在于极大地提升了虚拟角色的表现力与沉浸感,广泛应用于游戏开发、影视制作、虚拟现实和实时交互应用。在技术实现路径上,开发者常面临工业化集成方案与高度自定义方案的选择。本文聚焦于使用行业标准的ARKit 52个面部混合形状数据,深度对比了虚幻引擎Metahuman的工业化流程与Blender手动绑定方案在视觉保真度、工作流效率、性能开销和扩展性上的差异,为不同项目规模与技术需求的团

weixin_33901926的博客 449

利用Java生成静态HMTL页面的方法收集

利用Java生成静态HMTL页面的方法收集 生成静态页面技术解决方案之一 转载者前言:这是一个全面的jsp动态页面静态化方案,本站的帖子静态化方案将借鉴这篇帖子中方法。向[url]http://www.agilejava.org[/url]的single的共享精神致敬。 转帖正文: 相信很多人都...

weixin_33758863的博客 420

【Python百日进阶-Web开发-Feffery】Day385 -“一起Dash”训练营Lesson-07_利用fac构建表单(上)

文章目录前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓一、费老师课堂1.1 什么是表单1.2 页面效果1.3 课堂源码二、课后作业2.1 页面效果2.2 项目源码 前言:fac是什么? feffery-antd-components(简称fac),是国内大佬费弗里(Feffery)老师基于著名的React UI组件库ant design进行二次开发,将ant design中的诸多实用组件及特性引入Dash,帮助开发者使用极低的纯Python代

专注于医院数据分析技术与系统开发的创作与分享。 251

基于YOLOv5的仪表读数识别系统:从检测到识别的完整解决方案

随着工业自动化水平的不断提高,仪表读数识别技术在电力系统、石油化工、智能制造等领域发挥着越来越重要的作用。本文提出了一种基于YOLOv5的仪表自动读数识别系统,该系统能够有效区分指针式和数字式仪表,并实现高精度的读数识别。我们详细介绍了系统的整体架构、数据集构建、模型训练策略以及用户界面设计,并提供了完整的代码实现。实验结果表明,本系统在仪表检测和读数识别任务上均取得了优异的表现,为工业现场的自动化监控提供了可靠的技术支持。关键词:仪表读数识别;YOLOv5;目标检测;深度学习;工业自动化。

YOLO 678

servlet请求的转发

servlet的请求

qq_53732688的博客 5922

OpenClaw实战系列10(完结篇):企业级应用实战案例——从0到1搭建智能客服系统

本文以一家跨境电商公司为例,从需求分析、系统设计、分步搭建到上线运营,完整呈现智能客服系统的落地全过程。所有配置命令和截图均来自实测环境,你可以直接复制使用。

PeterPan的博客 1305

servlet 生成 html 静态

package com.servlet; import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter; import javax.servle...

管子(zero)的杂乱空间 170

Windows 11 安装 MySQL 8.4:安装包方式、下载、安装、使用

本文详细介绍了在 Windows 11 系统下通过 MSI 安装包方式安装 MySQL 8.4 LTS 社区版的完整流程,包括版本选择、下载、自定义安装路径、服务配置、日志设置、示例数据库创建及后续使用方法。同时提供了命令行客户端与图形化工具 DBeaver 的连接与操作演示,适合初学者和开发者快速搭建本地 MySQL 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2262

⑤单细胞学习-cellchat组间通讯差异分析

参考:

hx2024的博客 1980

【Servlet笔记】Servlet的转发(其他servlet、静态页面、JSP)

注意转发和重定向的区别,在这里先说一下:转发只是服务器内部的操作,客户端只向服务器发送一起请求,而且URL是不变的。而重定向却恰恰相反。     Servlet 的转发有三种方式,其实严肃点,也就两种方法:     1.利用 HttpServletRequest 转发; RequestDispatcher dispatcher = request.getRequestDispatcher("

HandsomeLinux的专栏 585

RK3568平台YOLOv11模型部署全流程实战:环境搭建、模型转换与性能优化解析

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

LXY_LOVE36的博客 120

静态页面技术 java_Java Servlet实现静态页面技术

1.背景往往首页是包含多很内容的,对于讲究首页访问速度。动态请求生成jsp页面,往往略显吃力,这样对于服务器和db都有很大的压力。为此,通过定时器定时请求生成静态页面,进行定时更新。2.实现逻辑我们需要解决下面一些技术问题:一、静态请求的逻辑: 1.拼装jsp请求,发送请求2.将请求到的结果进行流输出,jsp->html的转换过程额外需求:定时调用生成静态页面问题:1.如何知道jsp请求?查...

weixin_26516841的博客 535

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java生成静态页面

0 Java生成静态页面 类型:转载  |  日期:2012-09-15 21:27  |  标签: #java 提升网站性能的方式有很多,例如有效的使用缓存,生成静态页面等等。今天要说的就是生成静态页面的方式。这个也是我近期一直在搞的一个问题,近期在做使用html + servlet做个人网站,为什么是这2个东西呢? 1、直接用servlet是为了保证网

foxhlc的专栏 697

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

详解Servlet的使用

详解Servlet的使用,以及Smart Tomcat的安装与使用,以及Servlet的运行原理。

. 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Servlet 技术简介

Web技术的发展静态页面阶段用户访问页面过程: 用户用浏览器通过HTTP协议请求服务器上的Web页面 服务器上的Web服务器软件接收到请求后,读取URI所标识的资源 在读取的资源上加上消息报头发送给客户端的浏览器。 浏览器解析响应中的HTML数据,想用户呈现内容。 CGI(Common Gateway Interface)动态页面阶段用户访问页面过程: 用户通过点击链接或者直接输入URL访问CGI

i逆天耗子 1万+

Java Servlet技术

Java Servlet技术

fdyufgf的博客 3578

Servlet:实现动态页面的技术,看我从头到尾带你穿过servlet基础的海洋,使君有所获,有所悟

关于对servlet基础的理解

m0_65431718的博客 6638

java Servlet技术·笔记

Servlet基础 Servlet技术简介 Servlet是一种独立于平台和协议的服务器端的java技术,可以用来动态的生成Web界面。Servlet具有非常好的可移植性、强大的功能、更少的投资、更高的效率、更好的安全性等特点 Servlet一般用来处理HTTP的请求用来返回一个响应,它能够处理的请求有doGet()、doPost()、service()等方法,在开发Servlet时可以直接继承javax.servlet.http.HttpServlet类 值得注意的是Servlet需要在web.xml中

qq_49326435的博客 2859

Java使用Jetty实现嵌入式Web服务器及Servlet容器

文章浏览阅读494次。涵盖了 Java 基础、集合框架、并发编程、JVM 、操作系统、MySQL、Redis、ES、系统设计、分布式、高并发等知识点的面试题,全部都是面试常问的高频面试题。Jetty 是一个 Java 实现的开源的 servlet 容器,它既可以像 Tomcat 一样作为一个完整的 Web 服务器和 Servlet 容器,同时也可以嵌入在 Java 应用程序中,在 Java 程序中调用 Jetty。因为它的“轻量级”,在不是很复杂的小项目中是个不错的选择,启动(加载)也非常的快速。

2403_88996764的博客 854

JavaWeb技术发展(Servlet/JSP/EJB)

JavaWeb早期技术,Servlet,JSP,EJB

weixin_43410245的博客 2309

技术演进中的开发沉思-147 java-servlet:servlet框架

摘要:本文回顾了JavaWeb服务器的发展历程,重点分析了JavaSoft早期设计的JavaWeb服务器架构。作为Servlet技术的"始祖",这套系统奠定了现代JavaWeb服务的基础框架:服务框架实现多协议支持、服务器框架管理多服务实例、Servlet框架提供可插拔组件。文章通过"餐馆经营"的比喻,详细解析了服务线程池、系统管理、安全控制等核心机制,并指出当今Tomcat等服务器仍保留着这些设计基因。作者强调理解底层架构的重要性,认为新技术都是对经典设计的迭代优化

你的天空阅读专栏 1335
上一篇: Java Service Wrapper工具把Java程序转换为Windows服务小结(新版3.5.17)
下一篇: 前端开发者使用JS框架的三个等级
IMSIB
博客等级 码龄17年 5粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值