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控制器,实现了完整的用户信息管理功能。 阅读详情

相关推荐

AI小智语音服务架构与嵌入式成本优化实践

语音交互系统是智能硬件的核心能力,其本质是端云协同的实时数据处理链路,涵盖音频采集、流式传输、语义理解与语音合成四大技术环节。原理上需严格划分物理层(确定性音频I/O)、协议层(WebSocket/Range可靠性通信)和语义层(ASR/LLM/TTS职责解耦),以保障低延迟与高可用。技术价值在于通过VAD前置过滤、分块下载、Token截断等嵌入式级优化,显著降低云端调用成本与网络开销。典型应用场景包括儿童故事机、智能音箱、教育机器人等对响应速度、音色自然度和单次交互成本敏感的AI小智设备。本文聚焦火山引擎

weixin_30653091的博客 351

静态网页篇:JavaScript相关基础

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

LGHKCVG的博客 932

Windows(Win10、Win11)本地部署开源大模型保姆级教程

最近开源大模型可谓闹的沸沸扬扬,尤其是Microsoft开源的和Meta开源的llama3 70b,评测都已经接近了的水平。鉴于还有很多同学不会在上部署和使用本地模型,因此我们出一期保姆级教程。本文讲述了如何在上本地部署大模型。从最基础的软件安装到环境配置都进行了截图展示,希望对非计算机的同学也有所帮助。AI时代我们每个人都必须要掌握一些AI知识,相信不断学习的你一定不会被AI淘汰。这只是开始,后面我们还有很多工作要做,尤其是提示词和智能体。

AIGIS的博客 3万+

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

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

weixin_33758863的博客 420

嵌入式主板系统配置实战:OTG切换、双网共存与开机自启详解

在嵌入式Linux系统开发中,系统配置是连接硬件平台与应用功能的关键桥梁。其核心原理在于通过内核参数、文件系统接口和系统服务等机制,实现对硬件资源和系统行为的精细控制。掌握这些配置技术,对于提升开发效率、保障系统稳定性和实现产品差异化至关重要。无论是工业物联网网关、智能终端还是边缘计算设备,都需要对网络、USB、启动项等基础功能进行可靠配置。本文聚焦于嵌入式主板开发中的高频需求,例如OTG功能模式切换、双网共存路由策略以及基于systemd的开机自启动实现,通过具体的命令和脚本示例,为开发者提供一套可直接复

weixin_30827827的博客 321

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 474

servlet请求的转发

servlet的请求

qq_53732688的博客 5922

【侯俊霞全网最全收集--PLC1200/200SMART(88+93课时) 第1章】

第1章:零基础快速入门西门子S7-1200

问就ycy的博客 2038

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

如何使用obspy下载地震波形数据

如果你是地震研究学者,或者需要进行地震方面的研究,那么地震数据下载是一个必不可少的流程,本文将告诉你如何使用obspy下载想要的地震数据

monsterk1的博客 2075

内网(极空间)搭建gitlab跳板机转发端口及域名配置

然后,回头尝试用内网地址+15022 clone,成功,用公网的ip+15222 clone失败,那就是定位到时nginx转发的问题了。首先想到的就是 git clone是通过ssh的22端口进行下载的,那就需要打通22端口,则又配置22端口的nginx转发。然后,我通过ssh命令,做一个端口转发,以实现内网穿透,将服务端口链接到跳板机上。然后穿透到阿里云服务器跳板机的端口,只能内网访问,需要用nginx做个转发,才能用公网ip进行访问。然后,如上,我的80端口,映射15080,22端口映射15022。

God丶Davide的博客 6074

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

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

HandsomeLinux的专栏 585

功能安全实战系列07-英飞凌TC3xx电源监控开发详解

本文对电源监控(PBIST及MONBIST)开发介绍,步骤详细配合开发中的测试情况,图文并茂,方便理解。

initiallizer的博客 1109

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

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

weixin_26516841的博客 535

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java生成静态页面

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

foxhlc的专栏 697

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

详解Servlet的使用

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

. 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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、付费专栏及课程。

余额充值