JavaWeb
事务
事务的基本操作
START TRANSACTION ----开始事物
COMMIT --手动提交
ROLLBACK --返回
保存临时数据,方式报错导致数据错误
如果不开启事物的话,Mysql回自动提交
查看事务的提交方式
SELECT @@autocommit //1->自动 0->手动 MySQL是自动提交 orcal是手动
修改事务的默认提交方式
set @@autocommit
事务的四大特征
1、原子性:要么同时成功,要么同时失败
2、持久性:当事物提交或回滚之后,数据库会持久保存数据
3、隔离性:多个事物之间,相互独立
4、一致性:事务操作前后,事务总量不变
事务的隔离级别
概念:多个数据相互独立,但是多个事务同时处理的话,会引发问题
存在问题:
- 脏读:一个事务,读取到另一个事务中没有提交的数据
- 虚读:同一个事务中,两次读取到的数据不一样
- 幻读:一个事务操作表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离界别:
- read uncommitted:读未提交
- 产生的问题:脏读、虚读、幻读
- read committe:读已提交
- 产生的问题:虚读、幻读
- repeatable read:可重复度(默认)
- 产生:幻读
- serializable:串行化
- 可以解决所有问题
查询隔离界别
- select @@tx_isolation
设置隔离级别
- set global transaction isolation level
SQL分类
- DDL:操作数据库和表
- DML:增删表中数据
- DQL:查询表中数据
- DCL:管理用户、授权
DCL操作
管理用户、授权
-
管理用户
-
增加用户
CREATE USER ‘用户名’@‘主机名’ IDENTFIED BY ‘密码’
-
删除用户
DROP USER ‘用户名’@‘主机名’
-
修改用户密码
UPDAE USER SET PASSWORD = PASSWORD(‘新密码’) WHERE USER =‘用户名’
-
查询用户:
–1.切换到mysql数据库
USE myql
–2.查询user表
SELECT * FROM USER
*通配符:%表示可以在任意主机使用用户登录数据库
-
-
权限管理:
-
查询权限
SHOW GRANTS FOR ‘用户名’@‘主机名’
-
0授予权限
grant 权限列表(逗号隔开) on 数据库名.表名 TO ‘用户名’@‘主机名’
-
撤销权限
-
JDBC
Java database connecttivity —>Java数据库连接
定义了操作所有关系型数据库的规则,及接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正的代码时驱动jar包中的实现类
入门
-
导入驱动jar包
- jar包到bin下
- 右键—>add mid
-
注册驱动
Class.forName(“com.sql.jdbc.Driver”)
-
获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection(url""…)
-
定义sql
String sql = “updata account set balance = 500 where id =1”
-
获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement()
-
执行sql,接受返回结果
int count = stmt.executeUpdata(sql);
-
处理结果
-
释放自愿
stmt.close()
conn.close()
详解各个对象
-
DriverManager:驱动管理
- 注册驱动 -->告诉程序需要使用哪一个接口注册jar包
- 获取数据库对象
- url 连接的路径(jdbc:mysql://ip:端口/数据库名称)
- user 用户名
- password 密码
-
Connection:数据库连接
获取执行sql的对象
管理事务
开启事务 setAutoCommit
提交事务commit
回滚事务rollback
-
Statement:执行sql的对象
- boolean execute(String sql):可以执行任意的sql
- int executeUpdata(String sql):执行DML
- ResultSet executeQuery(String sql):执行DQL
-
ResultSet:结果集对象,封装查询结果
-
boolean next() -->游标移动到下一行 (如果是最后一行返回false)
-
getXxx(参数):获取数据
参数:
- int : 编号 从1开始
- String : 列名
-
使用步骤
- 游标向下移动一行
- 判断是否有数据
- 获取数据
-
-
PreoaredStatement:执行sql的对象
- SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的对接。会造成安全性问题
- 解决sql注入问题:实用PreparedStatement对象来解决
- 预编译的SQL:参数实用?作为占位符
抽取JDBC工具类:JDBCUtils
- 目的:简化书写
- 分析
- 注册驱动也抽取
- 抽取一个方法获取连接对象
- 抽取一个方法释放资源
JDBC控制事务:
- 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
- 操作
- 开启事务
- 提交事务
- 回滚 事务
- 实用Connection对象来管理事务
- 开启事务 setAutoCommit
- 提交事务commit
- 回滚事务rollback
数据库连接池
概念
其实就是一个容器(集合),存放数据库连接的容器
好处
- 节约资源
- 用户访问高效
实现
-
标准接口:DataSource javax.sqwl包下
-
方法:
获取连接:getConnection()
归还连接:如果连接对象Connection是从连接池获取的,那么调用Connection.close()方法,则不会关闭连接,而是归还连接
-
-
一般我们不去实现,由数据库厂商实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供
C3P0:数据库连接池技术
步骤:
- 导入jar包
- 定义配置文件:
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接:getConnection
Druid:数据库连接池实现技术
步骤:
-
导入jar包
-
定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
-
加载配置文件 properties
Properties pro = new Properties()
InputStream is == DruidDemo.class.getClassLoader().getResourceAsStream(name:"druid properties)
pro.load(is)
-
获取连接池对象 DruidDataSourceFactory
-
获取连接 getConnection
Druid:工具类
Spring JDBC
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
-
导入jar包
-
创建JdbcTemplate对象。依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
-
调用JdbcTemplate的方法来完成CRUD的操作
- updata():执行DML语句,增删改语句
- queryFormap():查询结果 封装为map集合
- queryForList():查询结果将结果封装为list集合
- query():查询结果,封装为JavaBean对象
- queryForObject:查询结果,将结果封装为对象
软件架构
JavaWeb:
- 实用java语言开发基于互联网的项目
软件架构:
- B/S架构:Browser/Server 浏览器/服务器端
- 只需要一个浏览器,用户需要通过不同的网址(URL),客户访问不同的服务器端程序
- 优点
- 开发、安装、部署、维护 简单
- 缺点
- 如果应用过大,用户的体验可能会收到影响
- C/S架构:Client/Server 客户端/服务端
- 在用户本地有一个客户端程序,在远程有一个服务器程序
- 如:QQ、迅雷…
- 优点:
- 用户体验好
- 缺点
- 开发、安装、部署、维护麻烦
B/S架构
-
资源分类
-
静态资源
实用静态网页开发技术法补的资源
特点:
- 所有用户访问,得到的结果是一样的
- 如:文本,图片,音频,视频,HTML,CSS,JavaScript
- 如果用户请求的是静态资源,那么服务器会直接将静态资源发送到浏览器,浏览器中内置了静态资源的解析引擎,可以展示静态资源
-
动态资源
- 使用动态网页及时发布的资源
- 特点:
- 所有用户访问,得到的结果可能不一样
- 如:jsp/servlet,php,asp…
- 如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,再发送给浏览器(浏览器只能解析静态资源)
-
-
静态资源:
- HTML:用于搭建网页,展示界面内容
- CSS:用于美化界面,布局界面
- JavaScript:用于实现动态效果
-
网络通信三要素
- IP:电子设备在网络中的唯一标识
- 端口:应用程序在计算机中的唯一标识
- 传输协议:规定了数据传输的规则
- 基础协议:
- tcp:安全协议,三次握手,速度较慢
- udp:不安全协议,速度快
- 基础协议:
Bootstrap
-
概念:一个前端开发的框架
- 框架:一个半成品的软件,开发人员可以在框架基础上,再进行开发,简化代码
- 好处:
- 定义了很多css样式和js插件。开发人员可以直接使用这些样式和插件得到丰富的页面效果
- 响应式布局
- 同一套界面可以兼容不同分辨率的设备
-
栅格系统
步骤:
- 定义容器。相当于table
- container:两边有留白
- container-fluid:100%宽度
- 定义行。相当于之前的tr 样式:row
- 定义元素。指定该元素再不同设备上,所占的格子数目。样式:col-设备代号-格子数目
- 设备代号:
- xs:超小屏幕 手机
- sm:小屏幕 平板
- md:中等屏幕 桌面显示器
- lg:大屏幕 大桌面显示器
- 注意:一行如果格子数目大于12个,超出部分会自动换行
- 栅格类属性可以向上兼容,栅格类适用于屏幕宽度大于或等于分界点大小的设备
- 如果真实设备宽度小于设置栅格类样式的设备代码的最小值,会占满一整行
- 设备代号:
- 定义容器。相当于table
事件
概念:某些组件被执行了某些操作之后,出发某些代码的执行
- 事件:某些操作 如:单击,双击,键盘按下了,鼠标移动了
- 事件源:组件。如:按钮 文本输入框
- 监听器:代码
- 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码
常见的事件:
-
点击事件:
- onclick:单击事件
- ondblclick:双击事件
-
焦点事件
onblur:失去焦点
onfocus:获得焦点
-
加载事件
onload:一张页面或一副图像完成加载
-
鼠标事件:
- onmousedown 鼠标按键被按下
- onmouseup 鼠标按键被松开
- onmousemove 鼠标被移动
- onmouseover 鼠标移到某元素上
- onmouseout 鼠标从某元素移开
-
键盘事件
- onkeydown 某个按键被按下
- onkeyup 某个按键被松开
- onkeypress 某个按键被按下后松开
-
选择和改变
- onchange 域的内容被改变
- onselect 文本被选中
-
表单事件
- onsubmit 确认按钮被点击
- onreset 重置按钮被点击
XML
概念
Extensible Markup Language 可扩展标记语言
- 可扩展:标签都是自定义的
- 功能
- 存储数据
- 配置文件
- 在网络中传输
- 存储数据
- xml与html的区别
- xml标签都是自定义的,html标签是预定义的
- xml语法严格,html语法松散
- xml存储数据,html展示数据
语法
- 文件名后缀.xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- xml标签名称区别大小写
组成部分
-
文档声明
-
格式<?xml 属性列表 ?>
-
属性列表:
-
version:版本号 1.1
-
encoding:编号方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
-
standalone:是否独立
取值:
- yes:不依赖其他文件
- no:依赖其他文件
-
-
-
指令(了解)
<?xml-stylesheet type="text/css" href="a.css" ?> -
标签
规则:
- 名称可以包含字母、数字以及其他字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml (XML Xml等)开始
- 名称不能含空格
-
属性
id属性值唯一
-
文本
CDATA区:在该区域中的数据会被原样展示
- <![CDATA[ 数据 ]]>
约束:规定xml文档的书写规则
- 最为框架的使用者:
- 能够在xml中引入约束文档
- 能够简单的读懂约束文档
- 分类:
- DTD:一种简单的约束技术
- 内部:引入dtd文档到xml文档中
- 外部:将约束的规则定义在外部的dtd文件中
- 本地:
- 网络:
- Schema:一种复杂的约束技术
- 后缀名xsd
- 可以约束具体格式
- DTD:一种简单的约束技术
解析
操作xml文档,将文档中的数据读取到内存中
操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
解析xml的方法:
-
DOM:将标记语言加载进内存,在内存中形成一颗DOM树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
-
SAX:逐行读取,基于事件驱动
- 优点:不占内存
- 缺点:只能读取,不能增删改
-
xml常见的解析器:
- JAXP:sun公司提供的解析器,比较烂
- DOM4J:一款优秀的解析器
- Jsoup
- PULL:Android系统内置的解析器,sax方式
-
Jsoup的使用方式:
-
导入jar包
-
获取Document对象
对象的使用:
-
Jsoup:工具类,可以解析html或xml文档,返回Document
parse:可以解析html或xml文档,返回Document
-
Document:文档对象。代表内存中的dom树
获取Element对象
- getElementByid
- getElementByTag
- getElementByAttribute
- getElementByAttributeValue
-
Elements:元素Element对象的集合,可以当作Array
-
Element:元素对象
-
获取子元素对象
- getElementByid
- getElementByTag
- getElementByAttribute
- getElementByAttributeValue
-
获取属性值
attr(key) 根据属性名称获取属性值
-
获取文本内容
text() 获取文本内容
html() 所有内容
-
-
Node:节点对象
-
-
快捷查询方式:
-
selector:选择器
使用的方法:Elements select(String cssQuery)
- 语法:参考selector类中定义的语法
-
Xpath:XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言
- 使用Jsoup的Xpath需要额外导入jar包
-
-
Web服务器软件
- 服务器:安装了服务器软件的计算机,一般这种电脑配置高
- 服务器软件:接受用户的请求,处理请求,做出响应
- Web服务器软件
- 在Web服务器软件中,可以部署Web项目,让用户通过浏览器来访问这些项目
- web容器
- java相关的常见的web服务器软件
- webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费
- webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费
- JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费
- Tomcat:Apache基金组织,中小型的JavaEE服务器,仅支持少量的JavaEE规范servlet/jsp,免费
- JavaEE:Java语言在企业级开发中使用的技术规范的综合,一共规定了13项大的规范
Tomcat:web服务器软件
-
注意安装目录不要有中文和空格
-
文件目录
-
bin:可执行文件
-
conf:配置文件
-
lib:jar包
-
logs:日志文件
-
temp:临时文件
-
webapps:存放web项目
-
work:存放运行时梳理
-
-
启动
bin/startup.bat 双击运行
访问:http://localhost:8080
- 可能遇到的问题:
- 黑窗口一闪而过
- 原因:没有正确配置Java_HOME
- 启动报错
- 暴力:找到占用8080端口号,找到对应的进程,杀死
- 温柔:修改自身的端口号
- 黑窗口一闪而过
- 可能遇到的问题:
-
关闭
-
正常关闭
bin/shutdown.bat
ctrl+c
-
强制关闭:点击窗口的关闭
-
-
配置
-
部署项目的方式:
-
直接将项目放到webapps目录下即可
- 访问路径----->虚拟目录
- 简化部署:将项目打成war包,将war包放置到apps目录下,会自动解压缩
-
配置conf/server.xml文件(不安全)
在标签体中配置
-
在conf/Catalina/localhost创建任意名称xml,虚拟路径就是文件的名称
-
-
-
静态项目和动态项目:
- 动态目录结构
- java动态项目的目录结构
- 项目的根目录
- WEB-INF目录
- web.xml:web项目的核心配置文件
- classes目录:放置字节码文件的目录
- lib目录:放置依赖的jar包
- WEB-INF目录
- 项目的根目录
- java动态项目的目录结构
- 动态目录结构
Servlet
概念
server applet 运行在服务器端的小程序
- Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则
- 将来自定义一个接口,实现Servlet接口,复写方法
快速入门(最基础的原理,后续不用这么麻烦)
-
创建Java EE项目
-
定义一个类,实现Servlet接口
- public class ServletDemo1 implements Servlet
-
实现接口中的抽象方法
-
配置Servlet
在web.xml配置
demo1
cn.itcast.web.servlet.ServletDemo1
demo1
/demo1
执行原理
- 当服务器收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否由对应的标签体内容
- 如果有,则在找到对应的全类名
- tomcat会将字节码文件加载进内0存,并创建对象
- 调用其方法
Servlet生命周期方法
-
被创建:执行init方法,只执行一次
-
Servlet什么时候被创建
- 默认情况下,第一次被访问时,Servlet被创建
- 可以配置执行Servlet的创建实际
- 在标签下配置
- 第一次被访问时,创建
- 为负数
- 在服务器启动时,创建
- 的值为0或正整数
- 第一次被访问时,创建
- 在标签下配置
-
Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能存在线程安全问题
- 因此尽量不要定义成员变量,即使定义了变量,也不要修改变量的值
-
-
提供服务:执行service方法,执行多次
每次访问Servlet时,都会被调用一次
-
被销毁,执行destory方法,只执行一次
- Servlet被销毁时候执行。服务器关闭的时候,Servlet被销毁
- 如果异常关闭不会执行
- 在Servlet销毁之前执行,用于释放资源
Servlet3.0(基础入门优化版)
-
优势:
支持注解配置,可以不需要web.xml
-
步骤
- 创建JavaEE项目
- 定义一个类,实现Servlet接口
- 复写方法
- 在类上使用@WebServlet注解,进行配置
- @WebServlet(“资源路径”)
IDEA和tomcat部署配置
- IDEA会为每一个tomcat部署的项目独立建立一份配置文件
- 工作空间项目和tomcat部署的web项目
- tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源
- web-inf目录下的项目不能被浏览器直接访问
- 断点调试:受用debug启动
Servlet的体系结构
Servlet – 接口
|
GenericServlet – 抽象类
|
HttpServlet – 抽象类
- GenericServlet:将Servlet接口中其他的方法默认空实现,将service()方法作为抽象
- 定义Servlet类时,可以继承GennericServlet,实现service()方法即可
- HttpSerlvet:对http协议的一种封装,简化操作(Servlet继承这个最简单)
- 定义类继承HttpServlet
- 复写doGet/doPost
相关配置
- urlpartten:Servlet访问路径
- 路径定义规则:
- /XXX
- /XXX/XXX
- *.XXX
HTTP
概念:Hyper Text Transfer Protocol超文本传输协议
- 传输协议:定义了客户端和服务器端通信发送数据的格式
- 特点:
- 基于TCP/IP的高级协议
- 默认端口号:80
- 基于请求响应模型,一次请求对应一次响应
- 无状态的:每次请求之间互相独立,不能交互数据
- 1.0:每次请求响应都会建立新的连接
- 1.1:复用连接
请求消息的数据格式
-
请求行
请求方式 请求url 请求协议/版本
Get /login.html HTTP/1.1
-
请求头
请求头名称:请求头值
Host:localhost
- 常见的请求头:
- User-Agent:浏览器告诉服务器,使用的浏览器版本信息
- Referer:告诉服务器请求从什么地方来
- 防盗链
- 统计工作
- Connnection
- 常见的请求头:
-
请求空行
空行,用于分割请求头和请求体
-
请求体
封装POST请求参数。一个字符串,放请求的数据
请求方式
-
GET
请求参数在请求行中,url后
url长度有限制
不安全 -
POST
请求参数在请求体中 请求的url长度没有限制
相对安全
-
HEAD
和Get请求相一致,只不过不会返回响应体,这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。(用于获取报头)
-
OPTIONS
返回服务器对特定资源所支持的http的请求,可以用来向Web服务器发送请求来测试服务器的功能性
-
PUT
向指定资源位置上传最新的内容
-
DELETE
请求服务器删除
-
Request-URI
所标识的资源
-
TRACE
回显服务器收到的请求,主要用于测试或诊断
-
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
响应消息
服务端发送给客户端的数据
- 相应行
- 组成:协议/版本 响应状态码 状态码描述
- 响应状态码:服务器告诉客户端浏览器本次请求和响应的状态。
- 状态码都是3位数字
- 分类:
- 1xx:服务器接收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
- 2xx:成功
- 3xx:重定向,类似于转发。302重定向,304访问缓存
- 4xx:客户端错误。404请求路径没有对应的资源。405请求方式没有对应的doXXX方法
- 5xx:服务器端错误。500服务器内部出现异常
- 响应头
- 格式:头名称:值
- 常见的响应头:
- Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- 默认值:inline在当前页面打开
- attachment以附件形式打开响应体。文件下载
- 响应空行
- 响应体:传输的数据
后端回应请求流程
- tomcat服务器根据请求url中的资源路径,创建对应的Servlet的对象
- tomcat服务器,会创建request和response对象,request对象中封装请求消息数据
- tomcat将request和response两个对象传递给service方法,并且调用service方法
- 通过request对象获取请求消息数据,通过response对象设置响应消息数据
- 服务器给浏览器做出响应之前,会从response对象中拿程序员设置的响应消息数据
Request
-
request对象和response对象的原理
- request和response对象是由服务器创建的。我们只是使用
- request对象是来获取请求消息,response对象是设置响应消息
-
request
-
获取请求消息数据
-
获取请求行数据
-
GET url HTTP/1.1
-
方法:
- 获取请求方式:GET String getMethod()
- 获取虚拟目录:String getContextPath()
- 获取servlet路径 String getServletPath()
- 获取get方式的请求参数 String getQueryString()
- 获取请求URI(虚拟目录+路径)
- String getRequestURI()
- String getRequestURL() 带上http
- 获取协议和版本号:String getProtocol()
- 获取IP地址:String getRemoteAddr()
-
-
获取请求头数据
- String getHeader(String name):通过请求头的名称获取请求头的名
- Enumeration getHeaderNames():获取所有的请求头名称
-
获取请求体数据
只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数
- 获取流对象
- BufferedReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 再从流对象中得到数据
- 获取流对象
-
-
其他功能:
-
获取请求参数通用方法
- String getParameter(String name)根据参数名获取参数值
- String[] getParameterValues(String name)根据参数名获取参数值的数组
- Enumeration gerParameterName():获取所有请求的参数名称
- Map<String,String[]> getparameterMap():获取所有参数的map集合
- 中文乱码问题:
- get方式:tomcat 8以上不会乱码
- post方式:会乱码
- 在获取参数前设置获取参数的编码request.setCharacterEncoding(“utf-8”)
-
请求转发(forward):在服务器内部的资源跳转方式
- 步骤
- 通过request对象获取请求转发器对象:
- 使用RequestDispatcher对象进行转发
- 特点
- 浏览器地址栏路径不变
- 只能转发到当前服务器内部资源中
- 转发是一次请求(多个资源使用同一次请求)
- 步骤
-
共享数据
- 域对象:一个可以在作用范围内共享数据的对象
- request域对象:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- setAttribute(String name,Object obj):存储数据
- Object getAtritude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
-
获取ServletContext
- ServletContext getServletContext()
-
-
BeanUtils
- 获取所有请求参数
Map<String,String[]> mao = req.getParameterMap() - 创建User对象
User loginUser = new User() - 使用BeanUtils封装
try{
BeanUtils.populate(loginUser,map);
} catch (IllegalAccessException e){
e.printStackTrace()
} catch{
e.printStackTrace()
}
-
用于封装JavaBean
JavaBean:标准的Java类- 要求
- 类必须被public修饰
- 必须提供空参的构造器
- 成员函数必须使用private修饰
- 提供公共setter和gatter方法
- 功能:封装数据
概念:
- 成员变量:
- 属性:setter和getter方法截取后的产物
方法:
- setProperty()
- getProperty()
- polutate():封装数据
- 要求
Response
-
功能:设置响应消息
- 设置相应行
- 格式:HTTP/1,1 200 ok
- 设置状态码:setStatus
- 设置响应头:setHeader(String name,String value)
- 设置响应体:
使用步骤:- 获取输出流
- 获取字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
- 使用输出流,将数据传输到客户端浏览器
- 获取输出流
- 设置相应行
-
重定向(redirect):资源跳转的方式
代码实现:
-
设置状态码为302
response.setStatus(302)
-
设置响应头location
response.setHeader(“location”,“地址”)
- 特点
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求
-
-
路径规则:判断定义的路径是给谁用的?判断请求将来从哪里发出
- 从客户端浏览器使用:需要加虚拟目录(项目的访问路径)
- 虚拟目录动态获取:request.getContextPath()
- ,重定向…
- 给服务器使用:不需要加虚拟目录
- 转发路径
- 从客户端浏览器使用:需要加虚拟目录(项目的访问路径)
-
服务器输出字符数据到浏览器
- response.setContentType(text/html;charset=utf-8")
- PrintWriter pw = response.getWriter(); //获取流对象
- pw.write(内容) //输出数据
-
服务器输出字节数据到浏览器
-
response.setContentType(text/html;charset=utf-8")
-
ServletOutputStream so = response.getOutputStream(); //获取流对象
-
so.write("".getBytes(“uft-8”)) //输出数据
-
-
验证码
-
本质:图片
-
目的:防止恶意表单注册
-
生成方式:
-
创建一对象,在内存中图片(验证码图片对象)
BufferedImage image = new BufferedImage(width,height,BufferedImage.Type_INT_RGB)
-
美化图片
- 填充背景色Graphics g =image.getGraphsics();
- 设置画笔颜色setColor(color)
- 画背景色 g.filReact(x,y,width,height)
- 画边框 g.setcolor(color) g.drawRect(x,y,width-1,heigth-1)
- 画干扰线
- 画干扰点
- 写验证码 g.drawString(“ABC”,x,y)
-
将图片输出到页面展示
ImageIO.write.(image,"jpg”,response.getOutputStream())
-
-
ServletContext
-
概念:代表整个web应用,可以和程序的容器来通信
-
获取:
-
通过request对象获取
request.getServletContext();
-
通过HttpServlet获取
this.getServletContext();
-
-
功能:
-
获取MIME类型
- 在互联网通信过程中定义的一种文件数据类型
- 格式:大类型/小类型 text/html image/jpeg
- 获取:String getMimeType(String file)
- 在互联网通信过程中定义的一种文件数据类型
-
域对象:共享数据
- SetAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
-
获取文件的真实(服务器)路径
- 方法:String getRealPath(String path)
-
图片下载案例
-
获取请求参数,文件名称
String filename = request.getParameter("filename")
-
使用字节输入流加载文件进内存
-
找到文件服务器路径
ServletContext servletContext = this.getServletContext() Sring realPath = servletContext.getRealPath("/img/"+filename)
-
用字节流关联
FileInputStream fis = new FileInputSream(realPath);
-
-
设置response响应头
-
设置响应头类型 content-type
String mimeType = servletContext.getMimeType(filename); response.setHeader("content-type",mimeType)
-
设置响应头打开方式 Content-disposition
response.setHeader("content-disposition","attachment;filename=" + filename)
-
-
将输入流的数据写到输出流
ServletOutputStream sos = response.getOuputStream(); byte[] buff = new byte[1024*8] int len = 0; while((len = fis.read(buff)) != -1){ sos.write(buff,0,len); }