JAVA Web 期末速成
一、专业术语及名词
1. Web 的特点
定义:web 是分布在全世界,基于 HTTP 通信协议,存储在 Web 服务器中的所有相互链接的超文本集
- Web 是一种分布式超媒体系统
- Web 是多媒体化 和 易于导航的
- Web 与平台无关
- Web 是动态、交互的
2. TCP/IP 结构和作用
- 网络接口层:负责将 IP 分组封装成 合适在具体的物理网络上传输的帧
- 网络层:解决网络互联 IP 分组的寻址问题
- 传输层:负责报文段的完整性和提供端到端的通信
- 应用层:提供了 计算机 之间的各种 应用服务 和 协议
3. HTTP/HTTPS
概念:HTTP 即 超文本传输协议,是 Web 的基本通信协议,Web 的服务器和浏览器均采用 HTTP 协议传输 Web 文档,位于 TCP/IP 的应用层
- 在 Internet 上通常采用 TCP 连接,默认使用 80 端口
- 客户机浏览器与服务器的 TCP 连接仅能处理 一次事务
HTTP 定义的一次事务处理流程
- 客户机浏览器与 Web 服务器建立连接
- 客户机浏览器向 Web 服务器提出请求,在请求中指明所要求的特定文件
- Web 服务器响应客户机浏览器的请求
- 客户机浏览器 与 Web 服务器断开连接
http 请求中 get 和 post 区别
- get 用于获取数据,post 用于上传数据
- get 不安全,因为传输过程中 数据 放在请求的 URL 中,而 Post 的所有操作对用户来说都是不可见的
- Get 传输数据量小(受 URL 限制),而 Post 可以传输大量数据(比如:上传文件只能用 Post)
- Get 是 Form 的默认方法
- Get 限制 Form 表单的数据集必须是 ASCII 字符,而 Post 支持整个 ISO10646 字符集
4. JavaBean
Javabean是Java开发语言中一个可以重复使用的软件组件,它本质上就是一个Java类
- 解释:JavaBean 实际上是一个遵循特定写法的 JAVA 类,封装了数据和业务逻辑,供 JSP 和 Servlet 调用,完成了数据封装 和 数据处理功能
<jsp:useBean>
标签用来声明JavaBean对象
- JSP提供了访问JavaBean属性的标签,如果要将JavaBean的某个属性输出到网页上,可以用
<jsp:getProperty>
标签。如果要给JavaBean的某个属性赋值,可以用<jsp:setProperty>
标签
简述Javabean规范都有哪些?
-
它必须具有一个公共的、无参的构造方法,这个方法可以是编译器自动产生的缺省构造方法。
-
它提供公共的setter方法和getter方法让外部程序设置和获取JavaBean的属性
-
它是一个公有类
-
通常需要实现
java.io.Serializable
,用于序列化。
① Java 开发过程
-
编写 JavaBean
-
编译 JavaBean
javac text.java
-
部署 JavaBean
② JavaBean 属性值
-
设置
<jsp::setProperty name="beanname" property="propertyname" value="beanvalue">
-
获取
<jsp::getProperty name ="beanname" property="propertyname">
5. 比较线程 和 进程
二、前端三大件
1. HTML常见标签
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>网页标题</title>
</head>
<body>这是网页身体
</body>
</html>
超文本标签
<!--1. 跳转网页-->
<a href = "http://www.com">112</a> <!--2. 跳转某个文档的段落-->
<a href = "#clients">跳</a>
<a name = "clients">Clients</a> <!--相同文档-->
<a name = "filenameBclients">Clients</a> <!--不同文档, 比如文档 B-->
表格标签
<table><tr><td></td></tr><tr><td></td></tr>
</table>
HTML5 新特性:语义、本地存储、连接、网页多媒体、三维图形特效(各标签干嘛,一定要清楚,尤其是它的特有标签元素)
2. CSS
CSS 样式如下:(优先级,从上到下逐渐减小)
-
内联样式
<div style="color: red;">
-
内部样式
<style>p{color: red;}</style>
-
外部样式
通过 link 标签引入外部CSS 样式表
3. javascript
定义:是一种嵌入在 HTML 文档中,具有跨平台性、安全性,基于对象和事件驱动的解释型编程脚本语言
Js 特点
- 是一种脚本语言
- 基于对象
- 安全、跨平台、动态
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>alert("内部 JS")</script><!-- 外部 JS --><script src = "./Js/my.js"></script> <button onclick="alert('I miss You')">错过</button>
</body>
</html>
Js 关键字:let、var,区别如下:
- let 把声明变量的生命周期限定在一个代码块内
- var 声明的变量在整个方法内均可访问
Js 常见事件
-
事件概念:用户与 Web 网页交互产生的操作
-
事件处理概念:浏览器响应事件并进行处理的过程。而进行这种处理的代码称为 事件的响应函数
Js 对象
-
内置对象:String、Math、Array、Date
//数组创建 var arr = new Array(8);
-
window 对象:
-
document 对象:
-
自定义对象:
JAVA 和 Javascript 区别
① JS 是基于对象的脚本语言,而 JAVA 是面向对象的编程语言
② 在浏览器的执行方式不同:解释(JS)、编译(JAVA)
③ 采用的变量不同:弱类型(JS,声明变量时无需指定变量类型),强类型(JAVA)
④ 代码格式不同:JS 嵌入 HTML,JAVA 与 HTML 无关
三、Servlet
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但 servlet
的实质就是 java
代码,通过java的API动态地向客户端输出内容
Servlet 的常见配置如下
<!-- 配置Servlet -->
<servlet><servlet-name>xxx</servlet-name><servlet-class>xxx.xxx.xxx</servlet-class>
</servlet><!-- 配置Servlet映射路径 --><servlet-mapping><servlet-name>xxx</servlet-name><url-pattern>/xxx</url-pattern>
</servlet-mapping>
1. Servlet 在 Web 应用中的作用
Servlet 在 Web 中主要用于处理客户端发送的 HTTP 请求,并生成相应的 HTTP 响应,通过 Servlet 开发者可实现各种功能,比如用户认证、数据处理等.
2. Servlet 生命周期工作流程
1)加载阶段:Servlet 容器加载 Servlet 类并实例化一个 Servlet 实例对象
2)初始化阶段:Servlet 容器调用 Servlet 类的实例对象的 init()
方法进行 Servlet 的初始化
3)调用阶段:如果 Servlet 容器收到对该 Servlet 的请求,则调用此实例对象的 service()
方法处理请求并返回响应结果
4)销毁阶段:Servlet 容器在卸载该 Servlet 前,调用它的 destroy() 方法将其销毁
3. Servlet 常用方法
1)Servlet 类需要继承 HttpServlet 类
2)Servlet 类的父类 HttpServlet 中包含以下几种方法:
init()
:Servlet 的初始化方法,Servlet 创建后执行doGet()
:请求类型为 get 时调用doPost()
:请求类型为 post 时调用destroy()
:用于释放资源forward()
/sendRedirect()
:用于请求转发或重定向到其他页面
4. 请求转发和重定向
请求转发与重定向的异同点如下:
- 请求转发和重定向都可以实现访问一个资源时转向当前应用资源
- 请求转发 是一次请求一次响应,而 重定向 为 两次请求两次响应
重定向:(两次请求,地址栏看得到变化,数据丢失)
response.sendRedirect("相对路径");
请求转发:(一次请求,地址栏看不到改变,数据不丢失,可以getParameter数据,也可以getAttribute数据)
request.getRequestDispatcher("相对路径").forward(request,response);
应用场景
- 一般情况下应该使用请求转发,减少浏览器对服务器的访问,减轻服务器压力
- 如果需要改变浏览器的地址栏,或更改浏览器的刷新按钮的功能时需要使用重定向
Servlet 过滤器
概念:运行在服务器上,位于请求和响应之间,起过滤作用的程序
Filter工作原理(执行流程)
- 请求首先被过滤器链的第一个 Servlet 过滤器处理
- 在第一个 Servlet 过滤器的请求处理完毕后,请求会被交给下一个 Servlet 过滤器处理
- 客户的请求就这样在 过滤器中 逐个处理,直到请求发送给目标为止
Servlet 过滤器通过 javax.servlet.Filter
接口提供一个无参构造函数来实现
void init(FilterConfig config)
:初始化功能void doFilter(servletRequest request, ServletResponse response, Filter chain)
:实现过滤功能void destroy()
:生命周期结束,自动调用
1、请列举Servlet接口中的方法,并分别说明这些方法的特点及其作用(书 189 页)
Servlet接口中有init、service、destroy 、getServletConfig和getServletInfo这 5个方法,这些方法的特点及其作用具体如下:
-
init(ServletConfig config)
方法,该方法在服务器对Servlet第一次访问时调用,负责Servlet初始化工作。在一个Servlet的生命周期中只执行一次。该方法接收一个ServletConfig类型的参数,Servlet容器可以通过这个参数向Servlet传递初始化配置信息。 -
service(ServletRequest request,ServletResponse response)
方法,该方法负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调用此方法。 -
destroy()
方法,该方法方法负责释放Servlet对象占用的资源。当Servlet对象被销毁时,容器会调用此方法。 -
getServletConfig()
方法,该方法返回容器调用init(ServletConfig config)方法时传递给Servlet的ServletConfig对象。 -
getServletInfo()
方法,该方法返回一个字符串,其中包含了关于Servlet的信息,例如,作者、版本和版权等信息。
2、简述 ServletContext
接口的三个主要作用
-
获取 Web 应用程序的初始化参数
-
实现多个Servlet 对象共享数据
-
读取 Web 应用下的资源文件
3、如何部署和访问 servlet 服务器
- 部署:打开【servers】选项卡,选中部署web应用的Tomcat服务器,右键单击并选择【Add and Remove】选项,进入部署web应用的界面,选中“chapter03”,单击【Add】按钮,将chapter03项目添加到Tomcat服务器中,单击【finish】按钮,完成web应用的部署
- 访问:接下来启动eclipse中的Tomcat服务器,在浏览器的地址栏上输入地址
“http://localhost:8080/chapter03/TestServlet01”
访问TestServlet01
四、MVC
基本概念:MVC设计模式是 编程语言的一种软件设计模式 ,提供了一种 按功能对软件进行模块划分 的方法。MVC设计模式将软件程序分为三个核心模块:模型(Model)、视图(View)和控制器(Controller)
- MVC模式中,模型对应的组件在:JavaBean
- MVC模式中,视图对应的组件是:JSP或HTML文件
- MVC模式中,控制器的作用是:控制器负责转发请求,对请求进行处理
M(模型层)指的是:实体类、Service层、dao层
MVC设计模式中模型(Model)模块的作用如下:
- 管理 应用程序的 业务数据
- 定义访问控制和修改 这些数据的 业务规则
- 当模型的状态发生改变 时,它会 通知视图 发生改变,并 为视图提供查询模型状态的方法
MVC模式的优缺点如下:
- 优点:各司其职,互不干涉、利于分工、利于重用和扩展
- 缺点:不适用于开发 中小型 应用程序
Model2(JSP + Servlet + JavaBean)
四、SSM 框架
1. SSM 框架处理步骤
(1)客户机发送请求,该请求会被配置在web.xml文件中的前端控制器( DispacherServlet)接收和拦截。
(2)由 DispacherServlet调用处理器映射器(HandlerMapping),处理器映射器根据请求找到具体的处理器(Handler),并生成Handler 对象和拦截器返回给 DispacherServlet。
(3)DispacherServlet选择对应的处理器适配器(HandlerAdapter),HandlerAdapter调用并执行Handler。通过Handler对持久化对象(PO)进行增删改查操作,由实体对象(POJO)将操作映射到持久层框架。最终持久层框架将操作映射到数据库。
(4)数据库将操作后得到的结果返回,经由PO和Handler将操作结果提交给
一个包含模型和视图名称的ModelAndView对象。该模型会由HandlerAdapter 返回给DispacherServlet。
(5) DispacherServlet根据模型选择合适的视图解析器(ViewResolver)对模型进行解析,并返回合适的视图,DispacherServlet对视图进行渲染,视图被发送至客户机显示。
2. SSM 配置
- 在
pom.xml
中配置 Spring、JDBC 等等 - 在
web.xml
中配置 编码、过滤器、监听器、Spring MVC、日志等- 用
<servlet>
标记对 命名 Servlet - 用
<servlet-mapping>
标记对 为 Servlet 指定对应的 URL <context-param>
和<init-param>
来定义参数- 前者定义的参数整个项目均可访问
- 后者定义的项目只有在指定的 Servlet 中才能访问
- 用
<Listener>
标签 配置监听器 - 用
<filter>
和<filter-mapping>
标签 配置过滤器
- 用
- 配置
jdbc.properties
文件(与数据库相关的属性,比如:连接数量的限制) - 配置
SpringMVC.xml
文件 - 配置
Spring.xml
文件 - 配置
MyBatis.xml
文件(比如:全局映射器是否使用缓存、延迟加载等)
3. SSM 层次结构
- 视图层:负责前台网页显示,将视图返回给客户机
- 表现层(controller):系统接收用户请求后,根据用户请求的 URL 确定处理用户请求的业务逻辑
- 业务层(service + serviceimpl):负责业务模块设计
- 持久层(mapper + 实体类)
- 用 dao 接口来实现持久层,在
mapper.xml
设计对数据库的具体操作的 SQL 语句,并且可以指定 namespace 路径来建立 mapper 和 dao 接口的关联
- 用 dao 接口来实现持久层,在
- 数据库
4. SSM 核心技术
包含 SpringIOC、DI 和 AOP 等(DI 是 IOC 的一种实现方式)
IOC 容器中管理的 Bean 的生命周期的过程如下:
- 第一阶段:Bean 配置原始数据
- 第二阶段:Bean 实例化阶段
- 第三阶段:Bean 的属性赋值阶段
- 第四阶段:Bean 的销毁回收阶段
IOC 的优点
- 可以将对象内部的构造细节进行封装
- 解决了对象之间的 耦合性
依赖查找 和 依赖注入的区别:
- 前者需要在 Java 程序中主动调用 IOC 容器提供的接口来获取 Java 对象,后者获取对象的工作由 IOC 容器代替开发者完成
IOC 对象创建的 3 个途径:属性注入、使用注解自动装配、构造器注入
5. AOP 面向面编程
- 连接点(JoinPoint)
- 切点(PointCut)
- 通知(Advice)
- 切面(Aspect)
- 引入(Introduction)
- 目标对象(Target Object)
- 代理(Proxy)
请说明反转控制(IOC) 和 面向切面编程(AOP)在 spring 中的应用
6. Mybatis
Mybatis 在 SSM 中的 pom.xml 配置如下:
<dependency><grouId>org.mybatis</grouId><artifactId>mybatis</artifactId><version>3.4.5</version>
</dependency>
五、JSP
1. 基本概念
1、JSP基本结构:java程序段、声明、输出表达式
<% java程序段 %> 局部变量
<%! 声明 %> 在整个页面有效
<%= %>相当于out.print() //输出的变量或者表达式:<%=……%>,EL表达式里的${……}
out.println()和out.print()效果是一样的。如果要换行</br>
2、JSP注释:<!-- HTML注释 -->
、//
java语句注释、/* java程序段注释...*/
、<%-- jsp注释 --%>
3、文档UTF-8设置
打开Eclipse软件时 整体设置–属性; 项目属性设置;
- request.setCharacterEncoding=“UTF-8”;;
- response.setCharacterEncoding=“UTF-8”;
4、重点JSP指令:
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" %><%@ page errorPage="..." iserrorPage="true" %><%@ page import="..." %><%@ include file="..." %>
动作指令
<jsp:include page="..." flush="true"/>
<jsp:include page="..." flush="true">
<jsp:param name="..." value="...">
</jsp:include><jsp:forward page="...">
<jsp:param name="..." value="..." />
<jsp:forward>
跳转方式
<a href="...?param=...¶m1=...&...">
JSP 网页文档特点
- JSP 网页被编译后可以多次之间运行,代码执行效率高
- 组件的可重用性高
- 将内容的生成和显示分离,对源代码进行封装
2. 九大内置对象
-
request
:对象主要用于处理客户端请求,在(页面转发,获取cookie)用到 -
response
:用于处理响应客户端请求,在(页面重定向)中使用 -
session
:在网络中被称为会话,一个会话就是浏览器与服务器之间的一次通话(保存登录状态时) -
application
:就像全局变量,用于保存应用程序中的共有数据(上传时获取真实路径) -
out
:对象用于在web浏览器内输出信息,数据输出完,要及时关闭输出流 -
pageContext
:用于获取页面的上下文,通过此对象可以获取页面的其他8个内置对象 -
config
:用于取得服务器的配置信息 -
page
:代表jsp本身,只有在jsp页面内才是合法的 -
exception
:用于处理jsp页面发生的异常
关于上面对象的比较如下:
pageContext JSP页面容器 -->当前页面有效
request 请求对象 -->同一次请求有效(请求转发还是有效,重定向[两次请求]无效)
session 会话对象 -->同一次会话有效(只要不关闭或者切换浏览器)
application 全局对象 -->全局有效(整个项目有效,切换浏览器有效,关闭server、其他项目无效)
四大域对象 作用:保存数据和获取数据,用于数据共享
名称 | 作用域 | 范围 |
---|---|---|
ServletContext | context域 | 只能在同一个web应用中使用 (全局的) |
HttpServletRequet | request域 | 只能在同一个请求中使用(转发) |
HttpSession | session域 | 只能在同一个会话(session对象)中使用 (私有的) |
PageContext | page域 | 只能在当前jsp页面使用 (当前页面) |
3. Request VS Response
① request 对象是 javax.servlet.httpServletRequest类型的对象
- 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)
- request对象的作用域为一次请求
Request.setCharacterEncoding=“UTF-8”;
String request.getParameter(String name);
String[] request.getParameterValues(String name);RequestDispatcher request.getRequestDispatcher(String path);
request.getRequestDispatcher.forward(request,response);Public void setAttribute(string name,object);
Public object getAttribute(string name);
Public void removeAttribute(string name);
② response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端
- response对象也具有作用域,它只在JSP页面内有效
response.setHeader("refresh","2");
response.setHeader("refresh","3;URL=hello.jsp") ;
response.sendRedirect(String location) ;
response.addCookie(Coolie cookie) ;
4. JSP 运行原理
- 客户端发出请求,要求访问jsp文件
- JSP容器首先将JSP文件转换为java源文件(java servlet源程序),在转换过程中如果发现jsp文件中存在任何语法错误则立即中断转换过程,并向服务器端和客户端返回出错信息
- 如果转换成功,则JSP容器将生成的java源文件编译成.class文件,该 class文件就是一个servlet,servlet容器会像处理其他servlet一样来处理它
- 由Servlet容器加载转换后的servlet类(.class文件),创建一个该servlet实例,并执行servlet中的
init()
方法,对该实例进行初始化工作 - 调用servlet中的
service()
方法来处理客户端请求 - 如果jsp文件被修改,则服务器将根据修改内容判断是否需要对文件重新编译,如果需要,则重新编译后的结果取代内存中常驻的servlet,并继续上述过程
- 执行完之后调用servlet中的destory()方法,将上面创建的servlet实例销毁
- 完成请求处理,生成响应对象由jsp容器接收,并以HTML格式发送回客户端
5. JSP Model1 和 JSP Model 的原理及使用过程
Model1模式下的程序流程控制是在JSP页面中实现的,这使得JSP页面中的嵌入大量的Java代码,Model1模式是JSP + JavaBean的结合,在JSP技术发展的初识阶段被广泛使用,Model2模式(MVC)是在JSP+JavaBean的设计模式基础上加入Servlet来实现程序控制层
- Model1应用了JavaWeb开发当中的两种技术,即JSP和JavaBean技术,所以Model1就是JSP+JavaBean模式
- 其中JSP需要独自完成响应用户的请求并将处理结果返回给用户,同时还需要完成流程的控制处理;而JavaBean进行辅助,如保存从数据库中查询出来的数据等。
- Model 2架构模式是一种把JSP与Servlet联合使用来实现动态内容服务的方法,所以Model2就是JSP+Servlet+JavaBean模式
- 它吸取了两种技术各自的突出优点,使用JSP生成表达层的内容,使用Servlet完成深层次的处理任务。
- 在Model 2中,Servlet充当控制者的角色,负责管理对请求的处理,创建JSP页面所需的JavaBean和对象,同时根据用户的动作决定把哪个JSP页面传给用户
- 特别要注意,在JSP页面内没有处理逻辑,它仅负责检索原先由Servlet创建的对象或JavaBean,然后从Servlet中提取动态内容插入到静态模板中进行页面显示
6. 思考
在JSP页面中,下列( )表达式语句可以获取页面请求中名字为title的文本框的内容:
<%=request.getParameter("title")%>
1)JSP页面的page指令主要用于设置该页面的各种属性,page指令的language属性的作用是:指定JSP页面使用的脚本语言,默认为Java
2)Servlet的作用是处理客户端请求并做出响应,Servlet是一个符合特定规范的java程序,是运行在服务器端的一个基于java技术的web组件
3)Servlet的生命周期方法有 init()、service()、destroy()
4)在 <servlet>
元素中增加 <load-on-startup>
元素可以指定在容器启动时 Servlet 的加载次序
5)在JSP中使用JDBC语句访问数据库,正确导入SQL类库的语句是:<%@ page import="java.sql.*" %>
5)JSP应用程序配置文件的根元素为 <web-app>
,JSP中的隐式注释为:<%--注释内容--%>
,在JSP中如果要导入 java.util.*
包要使用 page
指令
6)JSP文件请求需要经过 (翻译阶段 编译阶段 执行阶段) 三个阶段
7)抽象类 GenericServlet
实现了Servlet接口和 ServletConfig接口
8)编写 Servlet
时只需要根据应用的需要,重写 doGet()
或者 doPost()
方法即可
9)向请求作用域中存放数据可以用 ·request
对象的 setAttribute(String,Object)
方法,取数据可以用 getAttribute(String)
方法
10)JSP和Servlet的关系是:JSP会被翻译成Servlet
11)转发不会产生新的request对象,重定向是发送一个新的请求,发送一次请求会产生一个 response
与 request
对象
12)request对象通过哪个方法是根据组件名称获取提交数据的:getParameter()
13)在JSP中,以下哪个方法可以正确获取复选框的值:request.getParameterValues()
14)Servlet中获取请求的参数值用 <font color = red>getParameter()</font>
方法,同名的多个参数使用request.getParameterValues()
方法
15)以下哪个对象提供了访问和放置页面共享数据的方式:session
16)在JSP中,session
技术最适合实现购物车的存储
17)在JSP页面中,下列( )表达式语句可以获取页面请求中名字为title的文本框的内容:<%=request.getParameter("title")%>
六、JDBC
1. 基本概念
⛵️ JDBC的全称是 Java 数据库连接(Java Database Connectivity),它是一套用于执行 SQL 语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等处理
2. JDBC 的主要接口
JDBC API主要功能:通过以下类/接口实现
DriverManager
:管理jdbc驱动Connection
:连接 (通过DriverManager产生)Statement(PreparedStatement)
:增删改查 (通过Connection产生)CallableStatement
:调用数据库中的存储过程/存储函数(通过Connection
产生)Result
:返回的结果集(Statement, PreparedStatement
产生)
3. JDBC 数据库如何访问
基本过程(可能会涉及到如何连接数据库的编程题,最好手搓一下代码试试,详情可以看书 159 页)
1)加载并注册数据库驱动
class.forName("com.mysql.jdbc.Driver");
2)通过 DriverManager
获取数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
// url: 一般是 "jdbc:mysql://localhost:3306/数据库名"
// user: root 一般
// password: 对应数据库名密码
3)通过Connection对象获取Statement对象
Statement stmt = conn.createStatement();
4)使用Statement执行SQL语句
ResultSet rst = stmt.execute(sql); // 比如 String sql = "select * from user"
5)操作ResultSet结果集
string userid = rst.getString(1);
6)关闭连接,释放资源
rst.close();
stmt.close();
conn.close();
4. 连接池
什么是连接池?
- 数据连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是建立连接。
连接池的作用
- 连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。
请思考数据库连接池的工作机制是什么?
- 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,当应用程序访问数据库时并不是直接创建Connection,而是向连接池“申请”一个Connection。
- 如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。
- 使用完毕后,连接池会将该Connection回收,并交付其他的线程使用,以减少创建和断开数据库连接的次数,提高数据库的访问效率。
简述DriverManager和DataSource中的getConnection()方法的区别
1)DriverManager
每次调用 getConnection
方法都会初始化一个新的连接,而DataSource
的 getConnection
只是从池中取出一个已存在的连接
2)DriverManager
的 close()
是释放 Connection
,而 DataSource
的 close()
只会把Connection
归还给连接池。
七、编程
1. HTML + CSS +JavaScript 编程
编写一个 HTML, 页面,包含一个文本输入框和一个按钮,当点击按钮时,使用 JavaScript将输入框中的内容显示在页面上(写出完整代码,包括HTML和JavaScript 部分)
比如:页面上有个按钮,点击按钮,按钮下边显示今天星期几
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>显示今天星期几</title>
</head>
<body><button id="showDayButton">显示今天星期几</button><div id="dayDisplay"></div><script>document.getElementById('showDayButton').addEventListener('click', function() {const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];const now = new Date();const dayName = days[now.getDay()];document.getElementById('dayDisplay').textContent = dayName;});</script>
</body>
</html>
2. Servlet + JDBC
登录界面的实现
1)前端
<!DOCTYPE html> <!-- 声明文档类型为 HTML -->
<html>
<head><title>用户登录界面</title> <!-- 设置网页标题 -->
</head>
<body><form action="/login" method="POST"> <!-- 创建表单,提交到 /login,使用 POST 方法 -->账户:<input type="text" name="username" required> <!-- 用户名输入框,必填 -->密码:<input type="password" name="password" required> <!-- 密码输入框,必填,输入时隐藏字符 --><button type="submit">登录</button> <!-- 提交按钮 --></form>
</body>
</html>
2)JDBC 和 Servlet
import javax.servlet.*; // 导入 Servlet 包
import javax.servlet.http.*; // 导入 HTTP 相关的 Servlet 包
import java.io.*; // 导入输入输出流相关的类
import java.sql.*; // 导入 SQL 相关的类public class LoginServlet extends HttpServlet { // 定义 LoginServlet 类,继承自 HttpServletprivate String driver = "com.mysql.cj.jdbc.Driver"; // JDBC 驱动类private String url = "jdbc:mysql://localhost:3306/javaweb"; // 数据库连接 URLprivate String user = "root"; // 数据库用户名private String password = "123456"; // 数据库密码protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 处理 POST 请求的方法String userName = request.getParameter("username"); // 获取表单提交的用户名String userPassword = request.getParameter("password"); // 获取表单提交的密码response.setContentType("text/html"); // 设置响应内容类型为 HTMLPrintWriter out = response.getWriter(); // 获取输出流,用于向客户端发送响应if (validateUser(userName, userPassword)) { // 验证用户out.println("登录成功"); // 输出登录成功信息response.sendRedirect("successPage.html"); // 重定向到成功页面} else {out.println("登录失败"); // 输出登录失败信息response.sendRedirect("login.html"); // 重定向回登录页面}}private boolean validateUser(String userName, String userPassword) {// 验证用户的用户名和密码Connection conn = null; // 数据库连接PreparedStatement stmt = null; // 预编译的 SQL 语句ResultSet rs = null; // 存储查询结果的结果集try {Class.forName(driver); // 加载 JDBC 驱动conn = DriverManager.getConnection(url, user, password); // 获取数据库连接String sql = "SELECT * FROM user WHERE userName = ? AND password = ?"; // SQL 查询语句stmt = conn.prepareStatement(sql); // 准备 SQL 语句stmt.setString(1, userName); // 设置第一个参数为用户名stmt.setString(2, userPassword); // 设置第二个参数为密码rs = stmt.executeQuery(); // 执行查询return rs.next(); // 如果结果集中有记录,说明用户名和密码匹配} catch (Exception e) {e.printStackTrace();} finally {try { if (rs != null) rs.close(); } catch (SQLException e) {}try { if (stmt != null) stmt.close(); } catch (SQLException e) {}try { if (conn != null) conn.close(); } catch (SQLException e) {}}return false;}
}
3)数据库
CREATE TABLE user ( -- 创建用户表userId INT NOT NULL AUTO_INCREMENT, -- 用户 ID,整数类型,非空,自动递增userName VARCHAR(50) DEFAULT NULL, -- 用户名,字符串类型,最大长度 50,默认值为 NULLpassword VARCHAR(50) DEFAULT NULL, -- 密码,字符串类型,最大长度 50,默认值为 NULLPRIMARY KEY (userId) -- 设置 userId 为主键
);