文章目录

    • @[toc]
  • 一、学习目标
    • 二、include指令
  • 二、application内置对象
  • 三、JSP对象作用域
    • 3.1page作用域
    • 3.2request作用域
    • 3.2session作用域
    • 3.2application作用域
  • 四、JavaBean
    • 4.1JavaBean的特点
    • 4.2使用JavaBean封装数据
  • 五、在JSP中访问数据库
    • 5.1JDBC回顾
    • 5.2DAO模式与业务层回顾
    • 5.3搭建三层架构
      • 5.3.1添加maven依赖和database.properties
      • 5.3.2添加工具类BaseDao与ConfigManager
      • 5.3.3添加实体类
      • 5.3.4添加DAO接口
      • 5.3.5添加DAO实现
      • 5.3.6添加业务接口
      • 5.3.7添加业务实现
      • 5.3.8在JSP页面显示加载数据
      • 5.3.9运行结果
  • 六、总结

一、学习目标

  1. 会使用include指令
  2. 掌握application对象的原理和应用
  3. 掌握对象的作用域
  4. 会使用JSP访问数据库
  5. 掌握JavaBean的概念和应用

二、include指令

问题:

同一项目中多个页面中含有大量相同代码。重复内容:页面头部、页面尾部、权限验证、…;存在问题:代码冗余、修改不便、开发工作量大

分析:

提取相同部分内容,统一维护

在原页面中加载==提取出的公共代码==

JSP提供了include指令,可以静态加载其他JSP页面

在翻译JSP文件时,插入一个包含文本或代码的文件

语法:

<%@ include file="应用文件路径" %>

使用include指令减少重复代码示例:

  1. 创建公共代码页面(authentication.jsp
  2. 提取登录权限验证的公共代码,放入其中
  3. 在首页( index.jsp )中引入公共代码页面

创建公共代码页面(authentication.jsp)提取登录权限验证的公共代码,放入其中

<%@ page import="com.aiden.entity.User" %>
<%@ page import="com.aiden.utils.Constants" %>
<%@ page import="com.aiden.utils.CookieUtils" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%//验证用户访问权限User user = (User) session.getAttribute(Constants.SESSION_USER);if (user == null) {//检查CookieString loginPwd = CookieUtils.getCookieValue(request, "loginPwd");String loginName = CookieUtils.getCookieValue(request, "loginName");//判断非空与用户名密码验证if (loginName != null && loginPwd != null && "yunGe".equals(loginName) && "123456".equals(loginPwd)) {User userInfo = new User(10001, loginName, loginPwd, "男", new Date());session.setAttribute(Constants.SESSION_USER, userInfo);session.setMaxInactiveInterval(60);//设置失效时间为60秒} else {response.sendRedirect("login.jsp");return;}}
%>

在首页( index.jsp )中引入公共代码页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>首页</title>
</head>
<body><%@include file="authentication.jsp" %><h1>欢迎【<%=user.getUserName()%>】登录后台首页</h1>
</body>
</html>

二、application内置对象

需求:

在微博系统的用户登录页面,统计并显示网站访问人数

分析:

在application对象中添加一个数字类型属性用于统计登录人数,有用户登录时,属性值+1

使用application对象统计登录人数示例代码:

Integer count = (Integer) application.getAttribute("visitorCount");
if(count != null) {count = count + 1;
} else { count = 1;
}
application.setAttribute("visitorCount",count);
【您是本网站第<%= (Integer)application.getAttribute("visitorCount")%>位到访用户】

小结:

application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

存储数据类型:Object

作用域:整个网站

销毁时间:关闭服务器

获取值:application.getAttribute(“key”)

存储值:application.setAttribute(“key”,value);


三、JSP对象作用域

JSP中包含四大作用域

1、page作用域: 当前页面

2、request作用域: 当前请求

3、session作用域: 当前会话

4、application作用域: 当前Web应用

作用域从小到大范围排序:

page < request < session < application

3.1page作用域

page作用域

作用域范围:当前页面
作用域对象:pageContext 对象

本页面读取pageContext对象中的数据

<%//pageA.jspString pageName = "This is pageA";pageContext.setAttribute("pageName",pageName);System.out.println("控制台输出pageName:"+ pageContext.getAttribute("pageName"));//转发跳转pageB.jsprequest.getRequestDispatcher("pageB.jsp").forward(request,response);%>

其他页面读取pageContext对象中的数据

<!--pageB.jsp-->
pageName: <%= pageContext.getAttribute("pageName")%>

观察pageB.jsp页面发现 pageName:Null

控制台运行结果正常输出 “控制台输出pageName:This is pageA”

结论: page作用域范围只在当前页有效


3.2request作用域

request作用域

作用域范围:当前请求

作用域对象: request对象

观察请求转发过程中,request对象中的数据

创建count.jsp页面,设置countPage属性并赋值

Integer countPage= (Integer)request.getAttribute("countPage");
if(countPage==null){countPage = 1;
}else{countPage++;
}
request.setAttribute("countPage",countPage);

one.jsp页面通过include指令引入count.jsp页面,并转发至two.jsp

<%@ include file="count.jsp" %>
<%request.getRequestDispatcher("two.jsp").forward(request,response);
%>

two.jsp页面通过include指令引入count.jsp页面,并输出request对象中的countPage属性

<%@ include file="count.jsp" %>
<h3>count in request: <%= request.getAttribute("countPage")%></h3>

运行结果:


3.2session作用域

session作用域

作用域范围:当前会话

作用域对象: session对象

观察请求过程中, session对象中的数据

修改count.jsp页面,在request对象和session对象中分别设置不同属性

Integer countInRequest = (Integer)request.getAttribute("countInRequest");
Integer countInSession = (Integer)session.getAttribute("countInSession");countInRequest = (countInRequest==null)?1:countInRequest+1;
countInSession = (countInSession==null)?1:countInSession+1;request.setAttribute("countInRequest",countInRequest);
session.setAttribute("countInSession",countInSession);

one.jsp页面通过include指令引入count.jsp页面,并重定向至two.jsp页面

<%@ include file="count.jsp" %>
<%response.sendRedirect("two.jsp");
%>

two.jsp页面通过include指令引入count.jsp页面,并输出request对象和session对象中的属性

<%@ include file="count.jsp" %>
<h3>count in request: <%= request.getAttribute("countInRequest")%></h3>
<h3>count in session: <%= session.getAttribute("countInSession")%></h3>

运行结果

3.2application作用域

application作用域

作用域范围:当前Web应用

作用域对象: application对象

观察请求过程中, application对象中的数据

修改count.jsp页面,在session对象和application对象中分别设置不同属性

Integer countInSession = (Integer) session.getAttribute("countInSession");
Integer countInApplication = (Integer) application.getAttribute("countInApplication");countInSession = (countInSession == null) ? 1 : countInSession + 1;
countInApplication = (countInApplication == null) ? 1 : countInApplication + 1;session.setAttribute("countInSession", countInSession);
application.setAttribute("countInApplication", countInApplication);

one.jsp页面通过include指令引入count.jsp页面,并重定向至two.jsp

<%@ include file="count.jsp" %>
<%response.sendRedirect("two.jsp");
%>

two.jsp页面通过include指令引入count.jsp页面,并输出session对象和application对象中的属性

<%@ include file="count.jsp" %>
<h3>count in session: <%= session.getAttribute("countInSession")%></h3>
<h3>count in application: <%= application.getAttribute("countInApplication")%></h3>

运行结果


四、JavaBean

将基础模块组件化,通过简单的组装,可以快速组成成品

JavaBean是可以跨平台的重用组件,本质是一个特殊的Java类

4.1JavaBean的特点

JavaBean的功能分类

  1. 封装数据
  2. 封装业务

JavaBean的规范

  1. 提供无参的公有构造方法
  2. 实现Serializable接口
  3. 属性私有
  4. 属性的getter、setter方法公有

JavaBean的优势

  1. 解决代码重复编写,减少代码冗余
  2. 功能区分明确
  3. 提高了代码的维护性

4.2使用JavaBean封装数据

在JSP中使用JavaBean : 按照JavaBean的规范修改User实体类

getter 、 setter方法命名规范

属性首字母大写,名为xxx的属性对应setXxx()方法

特殊属性的getter、setter方法命名规范

属性第二个字母大写,该属性名直接用作getter、setter方法的后半部分

属性名:uName,方法:getuNamesetuName

属性前两个字母大写,该属性名直接用作getter 、setter方法的后半部分

属性名:URL ;方法:getURLsetURL

属性首字母大写;该属性名直接用作getter 、setter方法的后半部分

属性名:Name;方法:getNamesetName

public class User implements Serializable {//1.实现序列化接口private static final long serialVersionUID = -6890038231098895941L;//2.属性私有化private int id;private String userId;//账户//省略其他属性public int getId() { //3.提供公有的getter、setter方法return id;}public void setId(int id) {this.id = id;}//省略其他属性的getter和setter方法
}

五、在JSP中访问数据库

在JSP中可以借助JSP小脚本实现数据库连接

Java部分

  1. 数据控制、业务处理
  2. DAO接口:把对数据库的所有操作定义成抽象方法
  3. DAO实现类:给出DAO接口中定义方法的具体实现
  4. 实体类:用于存放、传输对象数据
  5. 工具类:配置文件读取类

JSP部分

数据展示


5.1JDBC回顾

第一步:加载JDBC驱动

​ 使用Class.forName( )方法加载JDBC驱动类到Java虚拟机中

第二步:与数据库建立连接

​ 调用DriverManager 类的getConnection()方法,获取数据库连接

第三步:发送SQL语句,得到返回结果

第四步:处理返回结果

第五步:数据库访问结束后,进行资源释放

JDBC编程模板

5.2DAO模式与业务层回顾

回顾数据访问层与业务层

  1. 数据库工具类 BaseDao =>位于 dao 包下
  2. 实体类 =>位于 entity 包下
  3. DAO接口 =>位于 dao 包下
  4. DAO实现类 =>位于 dao.impl 包下
  5. 业务接口 =>位于 service包下
  6. 业务接口实现类 =>位于 service.impl包下

5.3搭建三层架构

需求: 实现第三波书店首页图书类型导航菜单数据动态加载。

5.3.1添加maven依赖和database.properties

maven中添加依赖包

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version>
</dependency>
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version>
</dependency>

resources根资源文件夹下添加database.properties配置文件

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/bookshopplus?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
user=root
password=root

5.3.2添加工具类BaseDao与ConfigManager

BaseDao

package com.bookshop.dao;import com.bookshop.utils.ConfigManager;import java.sql.*;/*** 操作数据库的基类--静态类* @author Aiden*/
public class BaseDao {//构造函数私有化private BaseDao() { }//在该类的内部提供一个静态的实例对象private static BaseDao baseDao = new BaseDao();//饿汉模式//提供一个对外获取实例对象的静态方法public static BaseDao getInstance() {return baseDao;}/*** 获取数据库连接对象** @return*/public static Connection getConnection() {Connection connection = null;String driver = ConfigManager.getInstance().getProperty("driver");String url = ConfigManager.getInstance().getProperty("url");String user = ConfigManager.getInstance().getProperty("user");String password = ConfigManager.getInstance().getProperty("password");try {Class.forName(driver);//加载驱动connection = DriverManager.getConnection(url, user, password);//建立连接} catch (Exception e) {e.printStackTrace();}return connection;}/*** 查询操作*/public static ResultSet execute(Connection connection, PreparedStatement stmt, ResultSet rs,String sql, Object... params) throws SQLException {stmt = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {stmt.setObject(i + 1, params[i]);}rs = stmt.executeQuery();return rs;}/*** 更新操作*/public static int execute(Connection connection, PreparedStatement stmt,String sql, Object... params) throws SQLException {int updateRows = 0;stmt = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {stmt.setObject(i + 1, params[i]);}updateRows = stmt.executeUpdate();return updateRows;}/*** 释放资源*/public static boolean closeResource(Connection connection, PreparedStatement stmt, ResultSet rs) {boolean flag = true;if (rs != null) {try {rs.close();rs = null;//GC回收} catch (SQLException e) {e.printStackTrace();flag = false;}}if (stmt != null) {try {stmt.close();stmt = null;//GC回收} catch (SQLException e) {e.printStackTrace();flag = false;}}if (connection != null) {try {connection.close();connection = null;//GC回收} catch (SQLException e) {e.printStackTrace();flag = false;}}return flag;}
}

ConfigManager

package com.bookshop.utils;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;/*** @author Aiden* 读取配置文件的工具类-单例模式*/
public class ConfigManager {//1.定义静态的实例属性private static ConfigManager configManager;//Properties操作配置文件的实例属性private static Properties properties;//2.将构造函数私有化private ConfigManager() {String configFile = "database.properties";InputStream is = null;properties = new Properties();try {is = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);properties.load(is);is.close();} catch (IOException e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}}//3.静态内部类public static class ConfigManagerHelper {//final修饰private static final ConfigManager CONFIG_MANAGER = new ConfigManager();}//4.对外提供的获取ConfigManager实例的方法public static ConfigManager getInstance() {configManager = ConfigManagerHelper.CONFIG_MANAGER;return configManager;}//5.提供根据key获取对应value值的方法public static String getProperty(String key) {return properties.getProperty(key);}
}

5.3.3添加实体类

package com.bookshop.entity;import java.io.Serializable;/*** 图书类型实体类* @author Aiden*/
public class Categorie implements Serializable {private static final long serialVersionUID = 3646156839950581681L;private Integer id;private String name;public Categorie() {}public Categorie(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

5.3.4添加DAO接口

package com.bookshop.dao;import com.bookshop.entity.Categorie;import java.sql.SQLException;
import java.util.List;/*** @author Aiden*/
public interface CategorieDao {/*** 查询所有图书分类*/List<Categorie> findAll() throws SQLException;
}

5.3.5添加DAO实现

package com.bookshop.dao.impl;import com.bookshop.dao.BaseDao;
import com.bookshop.dao.CategorieDao;
import com.bookshop.entity.Categorie;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** 图书分类DAO实现** @author Aiden*/
public class CategorieDaoImpl implements CategorieDao {private Connection connection;public CategorieDaoImpl(Connection connection) {this.connection = connection;}@Overridepublic List<Categorie> findAll() throws SQLException {List<Categorie> list = new ArrayList<>();String sql = "SELECT id,name FROM `categorie`";PreparedStatement stmt = null;//执行对象ResultSet rs = null;//结果集rs = BaseDao.execute(connection, stmt, rs, sql);//调用查询方法while (rs.next()) {Categorie categorie = new Categorie(rs.getInt("id"), rs.getString("name"));list.add(categorie);}BaseDao.closeResource(null, stmt, rs);//释放资源return list;}
}

5.3.6添加业务接口

package com.bookshop.service;import com.bookshop.entity.Categorie;import java.util.List;/*** 图书分类业务接口** @author Aiden*/
public interface CategorieService {/*** 查询所有图书分类*/List<Categorie> findAll();
}

5.3.7添加业务实现

package com.bookshop.service.impl;import com.bookshop.dao.BaseDao;
import com.bookshop.dao.CategorieDao;
import com.bookshop.dao.impl.CategorieDaoImpl;
import com.bookshop.entity.Categorie;
import com.bookshop.service.CategorieService;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;/*** 图书类型业务实现类* @author Aiden*/
public class CategorieServiceImpl implements CategorieService {@Overridepublic List<Categorie> findAll() {List<Categorie> list = null;Connection connection = BaseDao.getConnection();CategorieDao dao = new CategorieDaoImpl(connection);try {list = dao.findAll();} catch (SQLException e) {e.printStackTrace();} finally {//关闭连接对象BaseDao.closeResource(connection, null, null);}return list;}
}

5.3.8在JSP页面显示加载数据

<%@ page import="com.bookshop.entity.Categorie" %>
<%@ page import="com.bookshop.service.CategorieService" %>
<%@ page import="com.bookshop.service.impl.CategorieServiceImpl" %>
<%@ page import="java.util.List" %>
<%@ page language="java" pageEncoding="UTF-8" %>
<div id="basket"><a href="#">目前您的购物篮是空的</a></div>
<div id="search"><form action="" method="post" target="_blank"><input type="text" class="search_key"/><input type="submit" class="search_sub" value=""/></form>
</div>
<div id="alltype"><h1 class="all_type black"><a href="#">查看所有分类>></a></h1><div id="subnav"><ul class="black"><%//实例化图书类型业务对象CategorieService categorieService = new CategorieServiceImpl();//查询所有图书类型列表List<Categorie> list = categorieService.findAll();if (list != null) {for (Categorie categorie : list) {%><li><a href="#"><%=categorie.getName()%></a></li><%}}%></ul></div><!--subnav end-->
</div>
<!--link start-->
<div id="choice_pub"><select name="publishs" id="publishs" class="n_select"><option>>>根据出版社选择图书</option><option>北京师范大学出版社</option><option>电子工业出版社</option></select><select name="publishs" id="special" class="n_select"><option>>>根据专题选择图书</option><option>国庆出游专题</option><option>新年计划专题</option></select>
</div><div id="s_b_03"><a href="#">赖世雄美语从头学</a><br/><a href="#">沪江团购 ,价格更优惠</a></div>

5.3.9运行结果


六、总结

思维导图


学习讨论群: 617530501

JSP-04JSP数据访问相关推荐

  1. jsp导出数据时离开页面_您应该在要离开的公司开始使用数据

    jsp导出数据时离开页面 If you're new in data science, "doing data science" likely sounds like a big ...

  2. MVC3学习第六章 排山倒海第二变----使用 Entity Framework Code-First 进行数据访问

    本章学习内容 1.Entity Framework 4.1介绍 2.Entity Framework Code-First 进行数据访问 3.利用EF实现用户的增加和列表功能 1.Entity Fra ...

  3. html访问access,HTML_ACCESS数据访问页配置实例,今天在本机上配置成功三层式 - phpStudy...

    ACCESS数据访问页配置实例 今天在本机上配置成功三层式访问! 环境: Windows XP Pro Office XP 配置步骤: 第一步:制作ACCESS数据访问页j.htm,并测试正常; 第二 ...

  4. 分层:数据访问层、业务逻辑层、视图层

    分层:开发模式     数据访问层 业务逻辑层:调用数据访问层 视图层:调用业务逻辑层 数据库表 1.创建项目 2.创建包:     com.zking.util         com.zking. ...

  5. 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...

  6. Java小项目中WEB-INF下jsp页面如何访问?

    Java小项目中WEB-INF下jsp页面如何访问? - 今天又是充满希望的一天 - CSDN博客 关闭 今天又是充满希望的一天 目录视图 摘要视图 订阅 var username = "H ...

  7. DNN 数据访问策略 (转)

    经过几天断断续续的努力,这篇文章终于翻译结束,文章主要讲了DNN的数据访问策略,对于了解系统整体上是如何工作的有一定的帮助,希望能给dnn的初学者一些有用的信息.由于翻译的匆忙+水平有限,错误或不当之 ...

  8. Enterprise Library 4 数据访问应用程序块

    Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务.应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据.传递数据穿过应用程序层( applicat ...

  9. 写一个通用数据访问组件

    出处:http://www.csharp-corner.com willsound(翻译) 我收到过好多Email来问我如何用一个通用的数据提供者(data provider)在不失自然数据提供者(n ...

最新文章

  1. 【Qt】Qt再学习(二):Bars Example(Q3DBars)
  2. list lt t gt java_将DataTable转换成Listlt;Tgt;实现思路及示例代码
  3. 深度学习之卷积神经网络(13)DenseNet
  4. 这份1307页Android面试全套真题解析,源码+原理+手写框架
  5. java 项目启动初始化_Spring Boot解决项目启动时初始化资源的方法
  6. Linux学习 - sed使用
  7. Think in AngularJS :对比 jQuery 和 AngularJS 的不同思维模式
  8. ajax第一个例子,第一个ajax例子【ajax有哪几种啊,了解的指导哈】
  9. GCC Command Options
  10. mysql tee_MySQL 使用tee记录语句和输出日志
  11. ExtJS初学——renderTo/applyTo区别
  12. 华为又又又白给了,自动化福利领取了吗?
  13. 怎么在线收听郭德纲于谦相声全集MP3
  14. 华为如何不关闭进程_关闭华为手机后台程序的小技巧,终于知道了,再也不用担心内存了...
  15. 动手学习深度学习 04:多层感知机
  16. 火狐浏览器上的广告过滤插件
  17. 飞鸽传书——短信接口
  18. 2023安徽师范大学计算机考研信息汇总
  19. QVGA HVGA WVGA VGA
  20. klayout 源码分析系列续 执行脚本

热门文章

  1. javaScript 中 reduce的使用技巧
  2. 【春节安全保障有我们】安全狗春节放假值班通知
  3. 【软通动力鸿湖万联扬帆系列“竞”开发板试用体验】折腾”竞“开发板
  4. php 除法/,php 除法函数怎么用
  5. conv2d函数中dilation参数:int or tuple
  6. 弹框 点击弹框以外的地方 弹框隐藏
  7. 如何在个人博客上添加自己的备案信息
  8. 一、网页、Web浏览器、Web标准
  9. 神经网络matlab拟合,使用浅层神经网络拟合数据
  10. 曾为你泪水狂流 曾为你万事都低头