热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过动态包含和Ajax机制抽取Web应用的公共页面

在JavaWeb应用开发中,经常遇到的一种情况是,许多的页面中都包含着“公共页面”,这部分动态页面的特征是:访问量大,会带来较大的性能压力。功能设计上会动态地改变自身的元素。比如在

在Java Web应用开发中,经常遇到的一种情况是,许多的页面中都包含着“公共页面”,这部分动态页面的特征是:访问量大,会带来较大的性能压力。功能设计上会动态地改变自身的元素。比如在登录前和登录后所展示的页面有所不同,比如以下代码:

 1 
class="col-md-3" > 2
    class="list-inline"> 3 <%-- 根据Session中的loginUser是否为空, 来判断展示的内容 --%> 4 if test="${empty loginUser}"> 5
  1. 登录
  2. 6
  3. 注册
  4. 7
    if> 8 9 if test="${not empty loginUser}"> 10
  5. 欢迎${loginUser.username}
  6. 11
  7. 退出
  8. 12
  9. 购物车
  10. 13
  11. 我的订单
  12. 14
    if>
    15 16
17

这是一段前端JSP代码,实现的是根据服务器处理登录功能后,session对象中的loginUser值是否为空,来判断是否登录完成,从而决定显示哪一段的标签内容。

事实上,因为这是一段顶层页面的公共菜单栏,从而在成百上千的网页中都包括这段代码。如果每个页面都要更改这是不可想象的。

解决的方法是通过动态包含机制来解决。

静态包含和动态包含

以JSP为例说明页面的静态包含和动态包含

JSP中有两种包含:

静态包含:<%@include file="被包含页面"%>

动态包含:。下面以一个例子来说明如何使用包含。

实例
项目文件树:

header.jsp文件中内容:

1 
2 
3 
4 
5 
6 
7 

This is header

content.jsp文件中内容

 1  2 3 4 5 6 7 8 910
col1 col2
col1 col2

footer.jsp文件中内容:

1 
2 copyright: 1999-2010 3 4

静态包含:
index.jsp文件中内容:

1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
2 <%@ include file="/header.jsp" %>
3 <%@ include file="/content.jsp" %>
4 <%@ include file="/footer.jsp" %>

页面显示结果:

被编译成的java文件:

动态包含

index.jsp文件中内容:

1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
2 
3 
4 

页面显示结果:

被编译成的java文件:

这个例子说明,使用静态包含和动态包含最终的执行结果相同,但是实现过程不同,很明显编译成的java文件数目不同。

静态和动态包含的区别与联系

注:下文将包含有其它文件的jsp文件称为主体文件,比如上文中的index.jsp文件.将被包含的文件称为包含文件,比如上文中的header.jsp文件.

  1. <%@ include file="" %>是指令元素。是行为元素
  2. 最终编译成java文件的数目不同。(从上面的例子可以看出)
    • 静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。
    • 动态包含是各个jsp文件分别转换,分别编译。最终编程成多个java文件。
  3. 执行时间不同
    • 静态包含发生在:JSP编译为java文件阶段。
    • 动态包含发生在:执行class文件阶段。动态加入。
  4. 静态包含在两个文件中不能有相同的变量,动态包含允许。
    • 由于静态包含相当于将包含文件内容直接复制到主体文件中,如果出现相同的变量,就会出现覆盖等问题,导致文件出错。而动态包含相当于调用不同的jsp,变量所在的空间不同,自然不会出现覆盖等现象。
  5. 无论是动态包含还是静态包含,其request对象都是相同的。也就是同一个request对象。
    • 静态包含最终编译成一个java文件,有一个request对象很好理解。而动态包含最终编译成多个jsp文件,为何会使用一个request对象呢?其实这些jsp组合的过程是一个请求转发的过程,自然也使用同一个request对象了。

静态包含和动态包含的使用
简单总结一下,就一句话:被包含的页面是静态页面就用静态包含,是动态页面就用动态包含。(当然不是很绝对,但是这样用没有错)

Ajax动态获取公共页面元素的JSON格式数据

公共页面,除了经常作为Header或Footer被多个页面引入外,更主要的是动态获取后台数据库Category数据作为菜单选项元素。在经典MVC架构中,这对应着一个Service和Dao服务如下:

Servlet层

1             CategoryService CategoryService=new CategoryServiceImp();
2             List list = CategoryService.getAllCats();
3             req.setAttribute("CatList", list);
4             return "/jsp/info.jsp";

Service层

1     CategoryDao CategoryDao=new CategoryDaoImp();
2     return CategoryDao.getAllCats();        

Dao层

1      String sql="select * from category";
2         QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
3         return qr.query(sql, new BeanListHandler(Category.class));

但如果有成百上千的页面都需要用到这个公共页面,那就要在成百上千的交互中添加这段Servlet代码,这样的话代价很高。

实践中主要是利用Ajax和Json格式来实现这样的菜单功能。

基于JQuery的Ajax功能代码实现如下:

 1 $(function(){
 2     //向服务端CategoryServlet__>gteAllCats发起ajax请求,服务端经过处理,
 3     //将所有分类信息以JSON格式的数据返回,获取到返回的所有分类绑定在页面的显示分类区域
 4     var url="/ServletStoreDemo/CategoryServlet";
 5     var obj={"method":"findAllCats"};
 6     $.post(url,obj,function(data){
 7         //alert(data);
 8     
 9         //获取到服务端响应会的数据,经过观察data中存放的是一个JSON格式数组,遍历数组,动态的显示分类区域代码    
10         $.each(data,function(i,obj){
11             var li="
  • "+obj.cname+"
  • "; 12 $("#myUL").append(li); 13 }); 14 15 },"json"); 16 17 });

    同时在CategoryServlet中,将数据库返回的数据,包装成JSON格式返回到客户端浏览器

    1 jsOnStr=JSONArray.fromObject(list).toString();
    2 //将全部分类信息响应到客户端
    3 //告诉浏览器本次响应的数据是JSON格式的字符串
    4 resp.setContentType("application/json;charset=utf-8");
    5 resp.getWriter().print(jsonStr);

    原理解析

    1. 页面加载后,Ajax会向服务端CategoryServlet发起请求,触发getAllCats方法,服务端会处理该方法。

    2. 服务端查询数据库,将所有分类信息以JSON格式的数据返回。前端获取到返回的所有分类,通过使用匿名函数,绑定分类数据到页面的显示分类区域。

    3. 对获取的JSON格式数组进行遍历数组,动态的展示分类区域代码。

    通过使用Redis缓存,可以大幅提高首页访问的性能,在以后的博文中将介绍其原理。
     
    posted on 2018-11-20 15:10 Leoliu168 阅读(...) 评论(...) 编辑 收藏

    推荐阅读
    • 本文详细介绍了如何使用JavaScript实现面部交换功能,包括基本原理和具体实现步骤。 ... [详细]
    • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
      本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
    • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
    • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
      文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
    • 为什么多数程序员难以成为架构师?
      探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
    • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
      HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
    • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
    • 网站访问全流程解析
      本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
    • 如何在Java中使用DButils类
      这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
    • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
    • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
      在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
    • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
    • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
    • Spring Boot 中配置全局文件上传路径并实现文件上传功能
      本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
    • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
    author-avatar
    Aaron Chen
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有