jsp解决高并发,其中一个方法就是生成静态页面,这样可以减少访问数据库次数,也可以省去后台处理逻辑。
那么实现生成静态页面的技术已经相当成熟了,向velocity,freemarks架构都已经包装好了。
但是在结合各种奇奇怪怪的架构中,还是在自己实现的代码复用最好,所以,接下来简单解析生成页面部分代码,
在这个生成静态页面代码中,URL的重定向,就是将URL改为约定好的html页面地址,这个步骤就是拼拼接接字符串,放在
requestDispatcher中,或是说requestDispatcher指向html页面资源
那么下面是关键生成讲台页面的代码,不管是哪个版本的,都会有如下代码:
{
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, encoding));
HttpServletResponse rep = new HttpServletResponseWrapper(response) {
public ServletOutputStream getOutputStream() {
return stream;
}
public PrintWriter getWriter() {
return pw;
}
};
logger.debug("HtmlCreatorServlet RequestDispatcher = " + templatePath);
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(templatePath);
dispatcher.include(request, rep);
pw.flush();
FileOutputStream fos = null;
try {
if(os.size() == 0) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "");
}
else {
fos = new FileOutputStream(cachhtmlFileName);
os.writeTo(fos);
dispatcher = getServletContext(). getRequestDispatcher("/"+htmlName);
dispatcher.include(request, response);
}
} finally {
if(fos != null) {
fos.close();
}
}
}
其目的就是从response中将目标资源jsp写入到静态页面html中,其中关键语句为
HttpServletResponse rep = new HttpServletResponseWrapper(response) {
public ServletOutputStream getOutputStream() {
return stream;
}
public PrintWriter getWriter() {
return pw;
}
他将输出流的方向改变了,将response中的内容转到打印流pw中,pw在写入到数组字节流os中,os就可以写到文件指定的html文件中了,可喜可贺可喜可贺。那么都是在哪句代码中实现的呢,在这句活
dispatcher.include(request, rep);
disparcher的include,玩过jsp都知道,是将目标资源处理结果包括在当前资源中,呈现给用户,可是response被rep重现包装后,前段已经说过,将输出流改变了方向。
以此实现了生成静态页面。
分享到:
相关推荐
### J2EE面试题知识点详解 #### Java基础知识 1. **字符串(String)与字符数组(char[])的区别** - 字符串(String)是不可变对象,一旦创建后其内容就不能更改。 - 字符数组(char[])是可以修改的,可以通过索引访问...
- **自动化技术应用**:利用XMI2.1接口与XML文件生成,自动创建数据库脚本、数据访问类代码,提高开发效率。 - **技术要素选择**:优先考虑Spring JDBC Template而非Hibernate或iBatis,简化数据库交互复杂度,确保...
JSP(Java Server Pages)是Java技术栈中用于生成动态网页的一部分。JSP提供了多种标签库,如`jsp:include`用于页面包含,`jsp:useBean`用于查找和操作JavaBean对象,`jsp:forward`用于页面跳转等。这些标签简化了...
通过定义一系列任务,Ant可以自动化完成项目构建的整个流程,包括编译源代码、生成文档、运行测试等。这不仅提高了开发效率,还减少了人为错误的可能性。 **6. 使用Ant构建J2EE应用** 对于基于J2EE的应用程序,Ant...
12. **JSP中的动态和静态INCLUDE**:动态INCLUDE可以传递参数,实时生成内容;静态INCLUDE类似于HTML的#include,加载预编译好的静态页面。 13. **应用服务器与Web服务器**:应用服务器提供更复杂的应用托管环境,...
17. **代码复用**:遵循设计模式,如装饰者模式在Java IO包中的应用,以及代码重用的一般原则。 这些知识点涵盖了Java SE的各个方面,从基础API到高级特性和工具,对于Java开发者来说都是重要的学习内容。通过深入...
JSP则是一种动态网页技术,可以将Java代码嵌入HTML中,实现视图层的动态生成。 4. **jsp在线投票**:JSP页面通常用来显示投票的选项、用户的投票状态以及投票结果。它们可以包含HTML、CSS、JavaScript以及嵌入的...
- **性能问题**:在高并发环境下可能会出现性能瓶颈。 - **可维护性**:代码结构如果不合理,将难以维护和扩展。 **1.16 XML 的优缺点** - **优点**:数据格式灵活、自描述性强、易于处理。 - **缺点**:文件体积...
- **性能瓶颈**:在高并发场景下可能会遇到性能问题。 - **XML 的优缺点** - **优点**:自描述性强、结构清晰、易于解析。 - **缺点**:相比 JSON 等格式,体积较大。 - **XML 的三个要素** - **模式**:定义 ...
预编译方式则是另一种实现EJB容器的方法,它在部署阶段就将EJB组件与容器集成,生成针对特定接口的静态类。这种方式在运行时性能通常优于动态代理,因为调用过程更为直接,避免了运行时的额外开销。然而,预编译方式...
### Core Java 重点要点笔记解析 #### 一、Java编程语言的发展历史与主要特性 - **起源**: Java 最初源自 Sun 公司的一个名为 Green 的项目,该项目旨在为家用消费电子产品开发一个分布式代码系统。最初考虑使用 ...
- **JSP:** 主要用于生成动态HTML页面,可以嵌入Java代码。 - **Servlet:** 是一个Java类,通常用于处理客户端请求和生成响应。 **2. Web开发中的HTML转义** - **HTML转义:** 当在Web页面中输出HTML标签时,...
根据给定的文件信息,以下是对“java面试题”中涉及的关键知识点的详细解析: ### 1. Java基础知识概述 Java是一种广泛使用的编程语言,特别适用于企业级应用开发,包括但不限于J2EE(Java Platform, Enterprise ...
EJB(Enterprise JavaBeans)是服务器端的组件模型,用于构建分布式、事务处理和安全性要求高的企业应用。Java Bean是轻量级的组件,主要用于客户端UI表现,不涉及服务器端功能。 5. **Java的多态与继承** 多态...
- **示例代码解析:** ```java Class c1 = new Integer(5).getClass(); // 使用Integer包装类 Class c2 = int.class; // 基本类型的Class Class c3 = new Integer(6).getClass(); // 另一个Integer实例 System....
- **静态include**:使用`<%@ include file="..." %>`标签,编译阶段完成合并,最终生成一个JSP文件。 - **动态include**:使用`<jsp:include page="..." />`标签,运行时才完成合并,每个包含的页面都可以有自己的...
- 使用 Dom4j 解析和生成 XML 文档。 **3.3 Java 语言的 XML 验证 API** - **XML验证** - 使用 Java API 验证 XML 文档的正确性。 **3.4 Hibernate的hello word** - **ORM框架** - 使用 Hibernate 进行对象...