JavaWeb重点笔记
JDBC
概念:JDBC就是使用java语言操作关系型数据库的一套API
全称:(Java DataBase Connectivity)Java 数据库连接
本质
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC的好处
- 各数据库厂商使用相同的接口,java代码不需要针对不同的数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
JDBC快速入门
- 创建工程,导入驱动jar包
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
- 获取连接
Connection conn=DriverManager.getConnection(url,username,password);
- 定义SQL语句
String sql = "update ...";
- 获取执行SQL语句
Statement stmt=conn.createment();
- 处理返回结果
- 释放资源
API详解
DriverManager
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
- 查看Driver类源码
static{ try{ DriverManager.registerDriver(new Driver()); } catch(SQLException var1){ throw new RuntimeException("Can't register driver!"); } }
提示:
- Mysql 5 之后的驱动包,可以省略注册驱动的步骤
- 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
2.获取连接
static Connection getConnection(String url,String username,String password);
- 参数
- url:连接路径
- 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
- 实例:jdbc:mysql://127.0.0.1:3306/db1
- 细节:
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置useSSL=false参数,禁用安全连接方式,解决警告提示
- user:用户名
- password:密码
Connection
Connection(数据库连接对象)作用:
1.获取执行SQL的对象
- 普通执行SQL对象
Statement creatStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
- 执行存储过程的对象
CallableStatement prepareCall(sql)
2.管理事务
- MYSQL事务管理
开启事务:BEGIN; / START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MYSQL默认自动提交事务
- JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit)
提交事务:commit()
回滚事务:rollback()
Statement
作用:
1.执行SQL语句
int executeUpdate(Sql):执行DML,DDL语句
返回值:
- DML语句影响行数
- DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(Sql):执行DQL语句
- 返回值:ResultSet 结果集对象
ResultSet
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句(用于执行静态 SQL 语句并返回它所生成结果的对象。
即结果集对象,作用:
1.封装了DDL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet 对象
2.获取查询结果
boolean next():
- 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
返回值:
- true:有效行,当前行有数据
- false:无效行,当前行没有数据
xxx getXxx :获取数据
- xxx:数据类型 如: int getInt(参数);String getString(参数)
- 参数:int: 列的编号,从1开始 String : 列的名称
使用步骤
- 游标向下移动一行,并判断该行是否有数据:next()
- 获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾 while(rs.next()){ //获取数据 rs.getXxx(参数); }
PreparedStatement
作用:
1.预编译SQL语句并执行:预防SQL注入问题
- 获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代 String sql="select * from user where username = ? and password = ? "; //通过Connection对象获取,并传入对应的sql语句 PreparedStatement pstmt=conn.prepareStatement(sql);
- 设置参数值
PreparedStatement对象 :setXxx(参数1,参数2):给?赋值 Xxx:数据类型;如setInt(参数1,参数2) 参数: 参数1:? 的位置编号,从1开始 参数2:? 的值
- 执行SQL
executeUpdate();/executeQuery(); :不需要再传递sql
SQL注入
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
好处:
1.预编译SQL,性能更高
2.防止SQL注入:将敏感字符进行转义
原理:
- PreparedStatement预编译功能开启:useServePrepStmts = true
- 配置MySQL执行日志(重启mysql服务后生效)
log-outpot=FILE general-log=1 general_log_file="D:\mysql.log" slow-query-log=1 slow_query_log_file="D:\mysql_slow.log" long_query_time=2
- 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
- 执行时就不用再进行这些步骤了,速度更快
- 如果sql模板一样,则只需要进行一次检查,编译
数据库连接池
简介
- 数据库连接池是个容器,负责分配,管理数据库连接(Connection);
- 它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
实现
标准接口:DataSource
- 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
- 功能:获取连接
Connection getonnection()
常见的数据库连接池
- DBCP
- C3P0
- Druid
Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
使用步骤
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
alt+insert 快捷键打开
查询所有数据
- 获取Connection
- 定义SQL:select * from tb_brand;
- 获取PreparedStatement对象
- 设置参数:不需要
- 执行SQL
- 处理结果:List
- 释放资源
Maven
Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档
官网:http://maven.apache.org/
作用
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译,测试,打包,发布...)
- 提供了一套依赖管理机制
标准化的项目结构
Maven提供了一套标准的项目结构,所有的IDE使用Maven构建的项目结构完全一样,所有的IDE创建的Maven项目通用
标准化的构建流程
Maven提供了一套简单的命令来完成项目构建
依赖管理机制
- Maven使用标准的坐标配置来管理各种依赖
- 只需要简单的配置就可以完成依赖管理
Maven模型
- 项目对象模型(Project Object Model)
- 依赖管理模型(Dependency)
- 插件(Plugin)
仓库
本地仓库(Local Repository)
自己计算机上的一个目录
中央仓库(Central Repository)
由Maven团队维护的全球唯一的仓库
地址:https://repo1.maven.org/maven2/
远程仓库(私服)(Remote Repository)
一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应jar包:
- 如果有,则在项目中直接引用
- 如果没有,则去中央仓库中下载对应的jar包到本地仓库
安装配置
- 解压apache-maven-3.6.1rar既安装完成
- 配置环境变量 MAVEN_HOME为安装路径的bin目录
- 配置本地仓库:修改conf/setting.xml中的为一个指定目录
- 配置阿里云私服:修改conf/setting.xml中的标签,为其添加如下子标签
<mirror> <id>alimaven</id> <name>aliyun maven </name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
基本使用
常用命令
- compile 编译
- clean 清理
- test 测试
- package 打包
- install 安装
生命周期
- Maven构建项目生命周期描述的是一次构建过程经历了多少个事件
- Maven对项目构建的生命周期划分为3套
- clean 清理工作
- default 核心工作,例如编译,测试,打包,安装等
- site 产生报告,发布站点等
同一生命周期内,执行后面的命令,前面的所有命令会自动执行
IDEA配置Maven环境
1.选择IDEA中 File -->Settings
2.搜索maven
3.设置IDEA使用本地安装的Maven,并修改配置文件路径
Maven坐标详解
坐标定义
- Maven中的坐标是资源的唯一标识
- 使用坐标来定义项目或引入项目中需要的依赖
坐标组成
- groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactld:定义当前Maven项目名称(通常是模块名称,例如order-service,goods-service)
- version:定义当前项目版本号
<groupId>com.itheima</groupId> <artifactId>maven-demo</artifactId> <version>1.0-SNAPSHOT</version>
IDEA创建Maven项目
- 创建模块,选择Maven,点击Next
- 填写模块名称,坐标信息,点击finish,创建完成
- 编写HelloWorld,并运行
IDEA导入Maven项目
- 选择右侧Maven面板,点击+号
- 选中对应项目的pom.xml文件,双击即可
- 如果没有Maven面板,选择View-->Appearance-->Tool Window Bars
配置Maven-Helper插件
- 选择IDEA中File-->settings
- 选择Plugins
- 搜索Maven,选择第一个Maven Helper ,点击Install安装,弹出面板中点击Accept
- 重启IDEA
依赖管理
使用坐标导入jar包
- 在pom.xml中编写标签
- 在标签中,使用引入坐标
- 定义坐标的groupld,artifactld,version
- 点击刷新按钮,使坐标生效
自动导入
- 选择IDEA中File-->Settings
- 在弹出面板中找到Build Tools
- 选择Any changes ,点击ok即可生效
快捷方式
- 在pom.xml中按 alt+insert,选择Dependency
- 在弹出的面板中搜索对应坐标,然后双击选中对应坐标
- 点击刷新按钮,使坐标生效
依赖范围
通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境,测试环境,运行环境
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency>
默认值:compile
MyBatis
简介
- Mybati是一款优秀的持久层框架,用于简化JDBC开发
- MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
- 官网: https://mybatis.org/mybatis-3/zh/index.html
持久层
- 负责将数据保存到数据库的那一层代码
- JavaEE三层架构:表现层,业务层,持久层
框架
- 框架就是一个半成品软件,是一套可重用的,通用的,软件基础代码模型
- 在框架的基础之上构建软件编写更加高效,规范,通用,可扩展
MyBatis简化
1.硬编码 ——>配置文件
- 注册驱动,获取连接
- SQL语句
2.操作繁琐——>自动完成s
- 手动设置参数
- 手动封装结果集
查询user表中的所有数据
- 创建user表,添加数据
- 创建模块,导入坐标
- 编写MyBatis核心配置文件——>替换连接信息 解决硬编码问题
- 编写SQL映射文件——>统一管理sql语句,解决硬编码问题
- 编码
- 定义POJO类
- 加载核心配置文件,获取SqdlSessionFactory对象
- 获取SqlSession对象,执行SQL语句
- 释放资源
Mapper代理开发
使用Mapper代理方式完成入门案例
- 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
- 设置SQL映射文件的namespace属性为Mapper接口全限定名
- 在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
- 编码
- 通过SqlSession的getMapper方法获取 Mapper接口的代理对象
- 调用对应方法完成sql的执行
细节:如果Mapper接口名和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<mappers> //加载sql的映射文件 <package name="com.itheima.mapper"/> </mappers>
MyBatis核心配置文件
类型别名(typeAliases)
<typeAliases> <package name="com.itheima.pojo"/> </typeAliases>
细节:配置各个标签时,需要遵守前后顺序
配置文件完成增删改查
JavaWeb
- Web:全球广域网,也称万维网(www),能够通过浏览器访问的网站
- JavaWeb:是用Java技术来解决相关web互联网领域的技术栈
JavaWeb技术栈
B/S架构:Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都储存在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可
好处:易于维护升级:服务器端升级后,客户端无需任何部署就可以使用到新的版本
HTTP
HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
HTTP 协议特点
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态协议:对于事务处理没有记忆功能-响应都是独立的
- 缺点:多次请求之间不能共享数据,Java中使用会话技术(Cookie,Session)来解决这个问题
- 优点:速度快
请求数据格式
- 请求行:请求数据的第一行,其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本
- 请求头:第二行开始,格式为key:value形式
- 请求体:POST请求的最后一部分,存放请求参数
常见的HTTP请求头:
- Host:表示请求的主机名
- User-Agent:浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0...
Chrome/79,IE浏览器的标识类似Mozilla/5.0(Windows NT ...)like Gecko;
- Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有
- Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页
- Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等
GET和POST请求区别:
- GET请求 请求参数在请求行中,没有请求体。POST请求 请求参数在请求体中。
- GET请求 请求参数大小有限制,POST没有
响应数据格式
- 响应行:响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
- 响应头:第二行开始,格式为key:value形式
- 响应体:最后一部分。存放响应数据
常见的HTTP响应头:
- Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
- Content-Length:表示该响应内容的长度(字节数);
- Content-Encoding:表示该响应压缩算法,例如gzip;
- Cache-Control:指示客户端应如何缓存,例如max-age=300表示最多可以缓存300秒
状态码大全:
状态 | Status - HTTP 中文开发手册 - 开发者手册 - 腾讯云开发者社区-腾讯云
Web服务器
Web服务器是一个应用程序(软件),对HTTP协议进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷,主要功能是"提供网上信息浏览服务"
作用
- 封装HTTP协议操作,简化开发
- 可以将web项目部署到服务器中,对外提供网上浏览服务
Tomcat
概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范,也称为Web容器,Servlet容器
JavaEE
Java Enterprise Edition ,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC,JNDI,EJB,RMI,JSP,Servlet,XML,JMS,JavaMail,JAF
Tomcat也被称为Web容器,Servlet容器,Servlet需要依赖于Tomcat才能运行
官网:https://tomcat.apache.org/
Tomcat基本使用
- 下载:官网下载
- 安装:绿色版,直接解压即可
- 卸载:直接删除目录即可
- 启动:双击:bin\startup.bat
- 关闭:
- 直接x掉运行窗口:强制关闭
- bin\shutdown.bat:正常关闭
- Ctrl+C:正常关闭
配置
1.修改启动端口号:conf/serve.xml
注意:HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号
2.启动时可能出现的问题:
- 端口号冲突:找到对应程序,将其关闭掉
- 启动窗口一闪而过:检查JAVA_HOME环境变量是否正确配置
部署项目
- Tomcat部署项目:将项目放置到webapps目录下,即部署完成
- 一般JavaWeb项目会被打包成war包,然后将war包放到webapps目录下,Tomcat会自动解压缩war文件
创建Maven Web项目
- 编译后的Java字节码文件和resource的资源文件,放到WEB-INF下的classes目录下
- pom.xml中依赖坐标对应的jar包,放入到WEB-INF下的lib目录下
使用骨架
不使用骨架
集成本地Tomcat
Tomcat Maven插件
Servlet
简介
- Servlet是Java提供的一门动态Web资源开发技术
- Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
快速入门
- 创建web项目,导入Servlet依赖坐标
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
- 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
public class ServletDemo1 implements Servlet { public void service(){} }
- 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1") public class ServletDemo1 implements Servlet {
- 访问:启动Tomcat,浏览器输入URL访问该Servlet
执行流程
生命周期
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
- 加载和实例化
默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
- 初始化
在Servlet实例化之后,容器将调用Servlet的int()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作。该方法只调用一次
- 请求处理
每次请求Servlet时,Servlet容器都会调用Servlet()方法对请求进行处理
- 服务终止
当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destory()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
@WebServlet(urlPatterns="/demo",loadOnStartup=1)
- 负整数:第一次被访问时创建Servlet对象
- 0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
方法介绍
- 初始化方法,在Servlet被创建时执行,只执行一次
void init(ServletConfig config)
- 提高服务方法,每次Servlet被访问,都会调用该方法
void service(ServletRequest req,ServletResponse res)
- 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
void destroy()
- 获取ServletConfig对象
ServletConfig getServletConfig()
- 获取Servlet信息
String getServletlnfo()
体系结构
HttpServlet使用步骤
- 继承HttpServlet
- 重写doGet和doPost方法
HttpServlet原理
获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
Servlet urlPattern配置
Servlet要想被访问,必须配置其访问路径(urlPattern)
- 一个Servlet,可以配置多个urlPattern
@WebServlet(urlPatterns={"/demo1","/demo2"})
urlPattern配置规则
- 精确匹配
配置路径:@WebServlet("/user/select")
访问路径:localhost:8080/web-demo/user/select
- 目录匹配
配置路径:@WebServlet("/user/*")
访问路径:
localhost:8080/web-demo/user/aaa
localhost:8080/web-demo/user/bbb
- 扩展名匹配
配置路径:@WebServlet("*.do")
访问路径:
localhost:8080/web-demo/user/aaa.do
localhost:8080/web-demo/user/bbb.do
- 任意匹配
配置路径:
@WebServlet("/")
@WebServlet("/*")
访问路径:
localhost:8080/web-demo/user/hehe
localhost:8080/web-demo/user/haha
- /和/*区别:
当我们的项目中的Servlet配置了"/",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet
当我们的项目中配置了"/",意味着匹配任意访问路径
优先级:精确路径>目录路径>扩展名路径> /* > /
XML配置方式编写Servlet
- Servlet从3.0版本后开始支持使用注解配置,3.0版本前只支持XML配置文件的配置方式
- 步骤:
编写Servlet类
在web.xml中配置该Servlet
<!-- Servlet全类名--> <servlet> <servlet-name>demo13</servlet-name> <servlet-class>com.itheima.web.ServletDemo13</servlet-class> </servlet> <!-- Servlet 访问路径--> <servlet-mapping> <servlet-name>demo13</servlet-name> <url-pattern>/demo13</url-pattern> </servlet-mapping>
Request(请求)和Response(响应)
Request :获取请求数据
Response:设置响应数据
Requset
Requset继承体系
ServletRequest——>Java提供的请求对象根接口
HttpServletRequest——>Java提供的对Http协议封装的请求对象接口
RequestFacade——>Tomcat定义的实现类
- Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
- 使用request对象,查阅JavaEE API文档的HttpServletRequest接口
Requset获取请求数据
- 请求行
GET/request-demo/req1?username=张三 HTTP/1.1
String getMethod():获取请求方式:GET
String getContextPath():获取虚拟目录(项目访问路径):/request-demo
StringBuffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
String getRequestURI():获取URL(统一资源标识符):/request-demo/req1
String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123
- 请求头
User-Agent:Mozilla/5.0 Chrome/91.0.4472.106.
String getHeader(String name):根据请求头名称,获取值
- 请求体
username=superbaby&password=123
ServletInputStream getInputStream():获取字节输入流
BufferedReader getReader():获取字节输入流
通用方式获取请求参数
请求参数获取方式:
GET方式:
String getQueryString()
POST方式:
BUfferedReader getReader()
Request请求参数中文乱码处理
- 请求参数如果存在中午数据,则会乱码
- 解决方案
POST:设置输入流的编码
request.setCharacterEncoding("UTF-8");
通用方式(GET/POST):先编码,再解码
new String(username.getBytes("ISO-8859-1"),"UTF-8");
URL编码
- 编码
URLEncoder.encode(str."utf-8");
- 解码
URLDEcoder.decode(s,"ISO-8859-1");
将字符串按照编码方式转为二进制
每个字节转为2个16进制数并在前面加上%
Request请求转发
一种在服务器内部的资源跳转方式
- 实现方式
req.getRequestDispatcher("资源B路径")forward(req,tesp);
- 请求转发资源间
- void setAttribute(String name,Object o):存储数据到request域中
- object getAttribute(String name):根据key,获取值
- void removeAttribute(String name):根据key,删除该键值对
- 请求转发特点
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
Response
Response设置响应数据功能介绍
- 响应数据分为3部分:
- 响应行:HTTP/1.1 200 OK
void setStatus(int sc):设置响应状态码
- 响应头:Content-Type:text/html
void setHeader(String name,String value):设置响应头键值对
- 响应体:
Response完成重定向
- 重定向:一种资源跳转方式
- 实现方式
resp.setStatus(302); resp.setHeader("loaction","资源B的路径”);
- 重定向特点
- 浏览器地址路径发生变化
- 可以重定向到任意位置的资源(服务器内部,外部均可)
- 两次请求,不能在多个资源使用request共享数据
路径问题
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
动态获取虚拟路径
String contextPath=request.getContextPath(); response.sendRedirect(contextPath+"/resp2");
Response响应字符数据
- 使用
- 通过Response对象获取字符输出流
PrintWriter writer=resp.getWriter()
- 写数据
writer.write("aaa")
注意:
- 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
- 中文数据乱码:原因是通过Response获取的字符输出流默认编码:ISO-8859-1
//设置响应的字符格式,以及字符集,解决字符乱码问题 response.setContentType("text/html;charset=utf-8");
//如果写html标签,让其识别 response.setHeader("content-type","text/html");
Response响应字节数据
- 使用
- 通过Response对象获取字符输出流
ServletOutputStream outputStream =resp.getOutputStream();
- 写数据
outputStream.write(字节数据);
- IOUtils工具类使用
- 导入坐标
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
2.使用
IOUtils.copy(fis,os);
JSP
- 概念:Java Server Pages , Java服务端页面
- 一种动态的网页技术,其中既可以定义HTML,JS,CSS等静态内容,还可以定义Java代码的动态内容
- JSP:HTML+Java
- JSP的作用:简化开发,避免了在Servlet中直接输出HTML标签
JSP快速入门
- 导入JSP坐标
- 创建JSP文件
- 编写HTML标签和Java代码
JSP原理
- 概念:Java Server Pages,Java服务端页面
- JSP=HTML+Java,用于简化开发
- JSP本质上就是一个Servlet
- JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个字节码文件
JSP脚本
- JSP脚本用于在JSP页面内定义Java代码
- JSP脚本分类:
- :内容会直接放到_jspService()方法之中
- :内容会放到out.print()中,作为out.print()的参数
- :内容会放到_jspService()方法之外,被类直接包含
JSP缺点
- 由于JSP页面内,既可以定义HTML标签,又可以定义Java代码,造成了以下问题
- 书写麻烦:特别是复杂的页面
- 阅读麻烦
- 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE...
- 占内存和磁盘:JSP会自动生成 .java和 .class文件占磁盘,运行的是 .class文件占内存
- 调试困难:出错后,需要找到自动生成的 .java文件进行调试
- 不利于团队协作:前端人员不会Java,后端人员不精HTML
EL表达式
Expression Language 表达式语言,用于简化JSP页面内的Java代码
主要功能:获取数据
语法:${expression}
${brands} : 获取域中的key为brands的数据
Java Web中的四大域对象
- page:当前页有效
- request:当前请求有效
- session:当前会话有效
- application:当前应用有效
el表达式获取数据,会依次从这四个域中寻找,直到找到为止
JSTL标签
JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码
<c:if test="${flag==1}"> 男 </c:if test="${flag==2}"> 女 </c:if>
JSTL快速入门
- 导入坐标
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
- 在JSP页面上引入JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用
<c:if test="${status ==1}"> 启用 </c:if> <c:if test="${status ==0}"> 禁用 </c:if>
JSTL标签
:相当于for循环
- items:被遍历的容器
- var:遍历产生的临时变量
- varStatus:遍历状态对象
- begin:开始数
- end:结束数
- step:步长.
MVC模式
- MVC是一种分层开发的模式,其中:
- M:Model,业务模型,处理业务
- V:View,视图,界面展示
- C:Controller,控制器,处理请求,调用模型和视图
- MVC好处
- 职责单一,互不影响
- 有利于分工协作
- 有利于组件重用
三层架构
- 数据访问层:对数据库的CRUD基本操作
- 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能
- 表现层:接收请求,封装数据, 调用业务逻辑层,响应数据
MVC模式和三层架构
会话跟踪技术
- 会话:用户打开浏览器,访问Web服务器资源,会话建立,直到有一方断开连接,会话结束。在一次会议中可以 包含多次请求和响应
- 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
- HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。
- 实现方式:1.客户端会话跟踪技术:Cookie 2.服务端会话跟踪技术:Session
Cookie
- Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
Cookie基本使用
发送Cookie
- 创建Cookie对象,设置数据
Cookie cookie=new Cookie("key",value")
- 发送Cookie到客户端:使用response对象
response.addCookie(cookie);
获取Cookie
- 获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies=request.getCookies();
- 遍历数组,获取每一个Cookie对象:for
- 使用Cookie对象方法获取数据
cookie.getName(); cookie.getValue();s
Cookie原理
Cookie的实现是基于HTTP协议的
响应头:set-cookie
请求头:cookie
Cookie使用细节
Cookie存活时间
- 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
- setMaxAge(int second) :设置Cookie存活时间
- 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储,到时间自动删除
- 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
- 零:删除对应Cookie
Cookie存储中文
- cookie不能直接存储中文
- 如需存储,则需要进行转码:URL编码
//URL编码 value = URLEncoder.encode(value,"UTF-8"); Cookie cookie=new Cookie("username",value); //URL解码 value= URLDecoder.decode(value,"UTF-8");
Session
- 服务端会话跟踪技术:将数据保存到服务端
- JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能
Session的使用
- 获取Session对象
HttpSession session=request.getSession();
- Session对象功能
void setAttribute(String name,Object o):存储数据到session域中 Object getAttribute(String name):根据key,获取值 void remoceAttribute(String name):根据key,删除该键值对
Session原理
Session是基于Cookie实现的
Session使用细节
- Session钝化,活化:
- 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
- 活化:再次启动服务器后,从文件中加载数据到Session
- Session销毁
- 默认情况下,无操作,30分钟自动销毁
<session-config> <session-timeout>30</session-timeout> </session-config>
- 调用Session对象的invalidate()方法
Cookie和Session
共同点
- Cookie和Session都是来完成一次会话内多次请求间数据共享的
区别
- 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
- 安全性:Cookie不安全,Session安全
- 数据大小:Cookie最大3KB,Session无限制
- 存储时间:Cookie可以长期存储,Session默认30分钟
- 服务器性能:Cookie不占服务器资源,Session占有服务器资源
Filter
- 概念:Filter表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listen)之一。
- 过滤器可以把对资源的请求拦截下来,从而实现一些特殊功能
- 过滤器一般完成一些通用的操作,比如:权限控制,统一编码处理,敏感字符处理
Filter快速入门
- 定义类,实现Filter接口,并重写其所有方法
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { }
- 配置Filter拦截资源的路径:在类上定义@WebFilter注解
@WebFilter("/*") public class FilterDemo implements Filter {
- 在doFilter方法中输出一句话,并放行
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("FilterDemo..."); //放行 chain.doFilter(request,response);}
Filter执行流程
- 放行后访问对应资源,资源访问完成后,还会回到Filter中
- 如果回到Filter中,会执行放行后的逻辑
- 执行放行前逻辑——>放行——>访问资源——>执行放行后逻辑
Filter使用细节
Filter拦截路径配置
filter可以根据需求,配置不同的拦截资源路径
@WebFilter("/*")
- 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
- 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
- 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
- 拦截所有:/*:访问所有资源,都会被拦截
过滤器链
一个Web应用,可以配置多个过滤器,这多个过滤器成为过滤器链
注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序
Listener监听器
- 概念:Listener表示监听器,是JavaWeb三大组件(Servlet,Filter,Listener)之一
- 监听器可以监听就是在application,session,request三个对象创建,销毁或者往其中添加修改删除属性时自动执行代码的功能组件
- Listener分类:JavaWeb中提供了8个监听器
ServletContextListener使用
1.定义类,实现ServletContextListener接口
2.在类上添加@WebListener注解
@WebListener public class ServletContextListener implements javax.servlet.ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { //加载资源 System.out.println("ContextLoaderListener..."); } @Override public void contextDestroyed(ServletContextEvent sce) { //释放资源 } }
AJAX
- 概念:AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML
- AJAX的作用:
- 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据:使用了AJAX和服务器进行通信,就可以使用HTML+AJAX替换JSP页面了
- 异步交互:可以在不重新加载整个页面的情况下,与服务器交互数据并更新部分网页技术,如搜索联想,用户名是否可用校验,等等
同步和异步
AJAX快速入门
- 编写AjaxServlet,并使用response输出字符串
- 创建XMLHttpRequest对象:用于和服务器交换数据
var xhttp; if (window.XMLHttpRequest) { xhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
- 向服务器发送请求
xhttp.open("GET", "url"); xhttp.send();
- 获取服务器响应数据
xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("demo").innerHTML = this.responseText; } };
Axios
Axios请求方式别名
发送get请求
axios.get("url").then(function(resp){ alert(resp.data) })
发送post请求
axios.post("url","参数") .then(function(resp){ alert(resp.data) })
JSON
- 概念:JavaScript Object Notation .JavaScript对象表示法
- 由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输
JSON基础语法
定义
var 变量名={ "key1":value1, "key2":value2, ... };
value的数据类型为:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
JSON数据和JAVA对象转换
- Fastjson是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库,是目前Java语言中最快的JSON库,可以实现Java对象和JSON字符串的相互转换
使用
- 导入坐标
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
- Java对象转JSON
Sting jsonStr=JSON.toJSONString(obj);
- JSON字符串转Java对象
User user=JSON.parseObject(jsonStr,User.class);
JavaWeb重点笔记相关推荐
- JavaWeb自学笔记(一)
JavaWeb自学笔记(一) 学习视频:BV12J411M7Sj 文章目录 JavaWeb自学笔记(一) 1.基本概念 1.1 web应用程序 1.2 静态web 1.3 动态web 2.web服务器 ...
- B站狂神说JavaWeb学习笔记
JavaWeb学习笔记(根据b站狂神说java编写) 1.基本概念 1.1 前言 静态Web: 提供给所有人看数据不会发生变化! HTML,CSS 动态Web: 有数据交互,登录账号密码,网站访问人数 ...
- javaWeb学习笔记1—前端三件套 HTML CSS JavaScript
学习视频地址 javaWeb学习笔记-前端三件套 HTML CSS JavaScript 1.字体标签 2. 字符实体 3.标题标签 4.超链接 5.列表标签 6. img标签 路径 7.表格 8.i ...
- Javaweb学习笔记(一)
目录 1.Html 和 Css 1.1.B/S 软件的结构 1.2.网页的组成部分 1.3.HTML简介 1.4.HTML文件的书写规范 1.5.HTML标签 1.6.标签的语法 1.7.常用标签 1 ...
- JavaWeb学习笔记(十)--HttpServletRequest
1. HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中 2. Ht ...
- C++编程思想重点笔记(下)
上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...
- 深入理解计算机系统9个重点笔记
引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容 ...
- C/C++求职宝典21个重点笔记(常考笔试面试点)
C/C++求职宝典21个重点笔记(常考笔试面试点) 这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. ch ...
- javaweb入门笔记(4)-request和response
2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(4)-request和response 标签: javaweb [TOC] API: Interfac ...
- JavaWeb学习笔记-目录(待完成)
JavaWeb学习笔记-目录(待完成) 01-基础加强(注解+反射) 02-mysql基础 03-mysql约束 04-mysql多表事务 05-jdbc 06-jdbc连接池JDBCTemplate ...
最新文章
- 对于神经网络,硕博士不需要弄明白原理,只需要应用,是这样吗?
- 暑期大作战 第五天(第四天待补)
- ajax 页面无刷新,Ajax的页面无刷新实现详解(附代码)
- c语言怎么读取mhx文件内容,C语言重新学习――基础杂类
- Kruskal算法 最小生成树
- JAVA 服务端模拟客户端请求http/https
- 【渝粤教育】广东开放大学 中国文化文学通论 形成性考核 (25)
- matlab 倒位序fft程序,FFT算法设计与实现
- 前端进阶之——CSS背景、字体和文本样式
- 哈夫模型-arcgis
- 静态空间管理和动态空间管理
- HTML如何返回上一页?
- 用Python写炸金花代码,学习python语言精品案例
- RK3568外设资源
- TFLearn初探之Activation与Dropout
- Solar Tracker
- eureka核心知识梳理
- 计算机联锁标准站检测,计算机联锁设备专项测试研究.pdf
- android短彩信相关
- 基于物联网的智慧油田的整体解决方案