Tomcat
!!!虚拟主机的配置
在tomcat的conf/server.xml文件中配置
...
!!!web应用的配置
方式 1:
在tomcat的conf/server.xml文件中配置
1.概述
HTTP是一种通用的应用层协议 定义了客户端和服务器端通信方式
底层时TCP/IP协议
2.基本原则
基于请求响应模型
一次请求对应一次响应
请求只能由客户端发出 服务器端被动等待请求做出响应
3.版本区别
HTTP/1.0 - 一次请求响应后底层的连接关闭 下次访问再重新创建
HTTP/1.1 - 提供了连接保持能力 当短时内多次访问服务器时 复用底层连接 效率高
4.HTTP请求
一个请求行
GET /index.jsp HTTP/1.1
请求方式:一共7种 最常用的GET POST GET请求参数在地址后 POST请求参数请求的实体内容中
请求资源的虚拟路径
当前遵循的协议版本
若干请求头
Accept: text/html,image/*
-- 通知服务器当前浏览器可以接受那些格式的数据
Accept-Charset: ISO-8859-1
-- 浏览器可以接受的字符集编码
Accept-Encoding: gzip,compress
-- 浏览器可以接受的压缩格式
Accept-Language: en-us,zh-cn
-- 浏览器接受的语言环境,和国际化相关的头
Host: www.tedu.cn:80
-- 需要访问的虚拟主机的名称
If-Modified-Since: Fri, 17 Feb 2017 18:23:51 GMT
-- 这是和缓存机制相关的头
Referer: http://www.tedu.cn/index.jsp
-- 这是和防盗链相关的头,对当前资源的访问来自哪个页面的超链接
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
-- 客户端的基本信息
Cookie
-- 和cookie相关的头
Connection: close/Keep-Alive
-- 是否继续保持连接
Date: Fri, 17 Feb 2017 18:23:51 GMT
-- 当前发送请求的时间
空行
实体内容
5.HTTP响应
一个状态行
HTTP/1.1 200 OK
协议版本
状态码:200 302 304 307 404 500
描述信息
若干响应头
Location: http://www.tedu.cn/index.jsp
-- 配合302使用实现请求重定向
Server:apache tomcat
-- 服务器的基本信息
Content-Encoding: gzip
-- 服务器发送的数据使用的压缩格式
Content-Length: 80
-- 服务器发送的数据的大小
Content-Language: zh-cn
--服务器发送的数据使用的语言环境 国际化相关的头
Content-Type: text/html; charset=GB2312
-- 服务器发送的数据是什么格式的,如果是字符格式的数据,则还可以通知服务器发送的数据使用的是什么编码,浏览器会根据这个头指定的编码决定使用哪个编码来打开收到的数据
Last-Modified: Fri, 17 Feb 2017 18:24:11 GMT
-- 和缓存相关的头
Refresh: 1;url=http://www.tedu.cn
-- 定时刷新相关的头,通知浏览器,过几秒后自动刷新访问哪个地址
Content-Disposition: attachment;filename=aaa.zip
-- 通知浏览器以附件的形式打开发送过去的数据,是和文件下载相关的头
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
-- 和Cookie相关的头
Expires: -1
-- 通知浏览器是否缓存
Cache-Control: no-cache
-- 通知浏览器是否缓存
Pragma: no-cache
-- 通知浏览器是否缓存
--之所以一个功能有三个头,是因为历史原因.所以为了网页的兼容性考虑,通常这三个头要一起使用
Connection: close/Keep-Alive
-- 是否保持连接
Date: Fri, 17 Feb 2017 18:24:11 GMT
-- 响应时的时间
一个空行
实体内容
1.概述
Servlet是sun公司提供的一门用于开发动态web资源的技术。
按照这套规范写出来的Servlet可以放置到web应用中在Servlet容器中运行。
2.开发步骤
写一个类实现Servlet接口
在web.xml中配置Servelt的访问路径
起一个名字
Servlet类的全路径名称
起一个名字
对外访问虚拟路径
对外访问路径的配置:
/xxx
/xxx/*
*.xx
哪个最像找哪个
*.后缀优先级最低
3.继承结构
Servelt
|-GenericServlet
|-HttpServlet
4.Servlet的生命周期
第一次被访问时创建 调用init方法执行初始化
创建出来后驻留在内存中为后续对该Servelt的请求服务
每次访问都触发service方法执行处理逻辑
直到web应用被销毁之前 Servlet销毁 销毁之前调用destory方法执行善后工作
5.Servlet访问流程
参看图
1.Request概述
在服务器内部代表http请求的对象
2.Request继承结构
ServletRequest
|-HttpServletRequest
3.Request主要功能
获取请求相关信息
getRequestURL方法 -- 返回客户端发出请求完整URL
如: http://localhost/day09/servlet/SecondServlet
getRequestURI方法 -- 返回请求行中的资源名部分
如: /day09/servlet/SecondServlet
getQueryString方法 -- 返回请求行中的参数部分
如: username=zhangfei&password=123
getRemoteAddr方法 -- 返回发出请求的客户机的IP地址
如: 127.0.0.1 //可能会出现0:0:0:0:0:0:0:1形式,是ipv6的表现形式。
getMethod -- 得到客户机请求方式
如: GET或POST
!!getContextPath -- 获得当前web应用虚拟目录名称
如: /day09
获取请求头
getHeader(name)
getHeaderNames()
getIntHeader(name)方法 --- int
getDateHeader(name)方法 --- long(日期对应毫秒)
获取请求参数
getParameter(String name) --- String 通过name获得值
getParameterValues(String name) --- String[] 通过name获得多值 checkbox
getParameterMap() --- Map key :name value: 多值
getParameterNames() --- Enumeration 获得所有name
乱码:
request.setCharacterEncoding(encode) -- post乱码
new String(param.getBytes("iso8859-1"),encode) -- get乱码
实现转发包含
request.getRequestDispatcher("xxx").forward(request,response); -- 服务器内部跳转 只能看到被转发的资源内容 转发前的内容会被抛弃
request.getRequestDispatcher("xxx").include(request,response); -- 服务器内部包含 两边的内容都有
作为域来使用
生命周期
请求开始时创建request对象 生命周期开始 请求结束request对象销毁 生命周期结束
作用范围
整个请求链
主要功能
在整个请求过程中共享数据
4.Response概述
代表http响应的对象
5.Response继承结构
ServletResponse
|-HttpServletResponse
6.主要功能
设置状态码
setStatus(int sc)
setStatus(int sc, String sm)
设置响应头
setHeader(String name, String value)
setIntHeader(String name, int value)
setDateHeader(String name, long date)
获取输出流输出数据到实体内容
PrintWriter getWriter()
ServletOutputStream getOutputStream();
乱码:
response.setCharacterEncoding(encode) -- 服务器将字符解析为字节时的编码
response.setContentType("text/html;charset="+encode) -- 通知浏览器解析响应时使用的编码
实现重定向
302+Location
response.sendRedirect("xxx");
实现定时刷新
response.setHeader("refresh","3;url=xxx");
实现禁止缓存
response.setDateHeader("Expires",-1);
response.setHeader("Cache-contrl","no-cache");
response.setHeader("Pragma","no-cache");
1.ServletConfig概述
代表当前Servlet的配置的对象
2.ServletConfig获取
this.getServletConfig();
3.ServletConfig功能
获取Servlet的初始化参数 - 在web.xml的标签下配置的标签里指定的参数 可以将不像写在servlet的提取到web.xml中管理
getInitParameter()
getInitparameterNames()
4.ServeltContext对象
代表当前web应用
5.ServletContext对象的生命周期
web应用创建时跟着创建 一直驻留在内存中 唯一的代表当前web应用 直到web应用销毁时 跟着web应用的销毁被销毁
6.ServleltContext对象获取
servletConfig.getServletContext()
this.getServletContext();
7.ServletContext对象功能 - 获取web应用的初始化参数
可以在web应用的web.xml中标签为当前web应用配置初始化参数
可以通过ServletContext获取该web应用初始化参数
getInitParameter
getInitparameterNames
8.ServletContext对象作为域对象使用
生命周期
和web应用的命一样长
作用范围
整个web应用
主要功能
在web应用范围内共享数据
9.ServletContext解决路径难题
web应用中获取资源时路径怎么写都不对
如果写 相对路径 -- tomcat/bin
如果写 绝对路径 -- tomcat所在磁盘的根目录下
如果写 盘符开始的路径 -- 可以找到资源 一旦换一个发布环境 路径就错了
servletContext.getRealPath("xxx") -- 会在传入的路径前拼接当前web应用的盘符开始的路径 得到资源的盘符开始的路径 从而访问到资源 由于是动态获取的 所以即使换了发布环境也没问题
**类加载器加载资源
如果没有ServletContext可以通过类加载器加载资源
classLoader.getResource().getPath("xxx") -- 需要传入相对于类加载器加载类的路径
1.会话技术概述
浏览器为了实现某一个功能 开发访问服务器 从开始访问 到结束功能 之间多次 请求响应加在一起 称之为发生了一次会话
会话最主要的问题时会话数据的保存
2.cookie
cookie的原理 - set-cookie响应头 和 cookie请求头
cookie的api
Cookie c = new Cookie(name,value);
c.setMaxAge() -- 设定cookie的保存时长 如果不设置 默认保存在浏览器的内存中 浏览器关闭则消失 如果配置过则在浏览器的临时文件夹下保存 到指定的时间
c.setPath() -- 设定浏览器在访问哪些路径时 带回这个cookie 如果不设置 默认值时 发送cookie的Servlet的父目录及其子孙目录
response.addCookie(c)
request.getCookies();
删除cookie
发送同名 同path 但是maxage为0的cookie
3.session
session的原理 - 在服务器内部创建浏览器对应的空间保存数据 专门为指定浏览器服务 这样每个浏览器都有对应空间 保存会话数据
- 通过一个特殊的Cookie - JSESSIONID 来识别浏览器
域对象:
生命周期
第一次调用request.getSession()方法时创建
自杀
超时
意外身亡
作用范围
整个会话范围
主要功能
在会话范围内共享数据
AJAX - 异步请求 局部刷新 - 背着浏览器通过js访问服务器 获取 数据后 通过js改变页面
URL编码 - HTTP协议只支持ISO8859-1 如果 想要在请求携带非iso8859-1的字符 需要进行URL编码
三种资源跳转方式
转发
重定向
定时刷新
1.jsp概述
看起来像html 但是其中可以写java代码 便于开发页面
在第一次被访问时被翻译成了Servlet执行 本质上仍然是一种动态web资源开发技术
2.jsp语法
模版元素
脚本表达式<%= %>
脚本片段<% %>
jsp声明<%! %>
jsp注释<%-- --%>
jsp指令<%@ %>
page指令
<%@ page %>
include指令
<%@ include file=""%>
taglib指令
<%@ taglib uri="" prefx="" %>
!!!jsp的九大隐式对象
page
request
response
config
application
session
out
exception
pageContext
PageContext
作为入口获取其他八大隐式对象
作为入口操作四大作用域
域对象
生命周期
jsp页面访问开始时创建 访问结束时销毁
作用范围
整个jsp页面
主要功能
在当前jsp页面中共享数据
便捷的转发包含
jsp标签
用来替代request.getRequestDispatcher().include()
用来替代request.getRequestDispatcher().forward()
配合前两个标签使用,可以在包含或转发时,带一些参数过去
!!el表达式
获取数据
常量数据
变量数据
集合 数组中的数据
map中的数据
javabean的属性
执行运算
算术运算
比较运算
逻辑运算
empty运算符
三元表达式
使用内置常用对象 - 11内置对象
pageContext
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
Cookie
initParam
调用java方法
jstl中fn函数库
jstl标签库
c库
fn库
fmt库
sql库
xml库
!
!
!!
!!
1.javaee开发模式的发展
Servelt
JSP
JSP + JavaBean
Servlet + JavaBean +Jsp
!!!JAVAEE的经典三层架构 - web service dao - Servlet JSP Service Dao Javabean
!!!!!**MVC设计模式
!!!!!**耦合 解耦 - 高内聚低耦合 - 接口+配置文件+工厂 - 依赖注入
1.filter概述
三大组件之一
拦截对资源的请求 控制是否允许通过 或在通过之前或之后做一些额外操作
2.filter开发步骤
写一个类实现Filtler接口
在web.xml中进行配置
3.filter的声明周期
应用启动创建 执行init 驻留在内存中工作 每次拦截执行 dofilter方法 应用销毁前销毁 调用destory方法善后
4.filter的相关对象
filterConfig
getInitParameter
getInitparameterNames
getServletContext
filterChain
dofilter
5.filter的应用
全站乱码解决过滤器
!!!改造已有对象身上的不喜欢的方法:
继承
装饰
动态代理
Proxy.newProxyInstance
自动登录过滤器
!!!MD5加密算法 - 数据摘要算法 数据指纹算法
任意二进制算出128位二进制
原文相同密文相同
原文不同密文不同
只能由原文算成密文 密文算不回原文
数据中密码保存 文件校验 数字签名
1.概述
三大组件之一
监听相关事件进行处理
2.八大监听器
监听三大作用域创建和销毁的监听器
监听三大作用域中属性变化的监听器
使javabean自己敢做自己在session域中属性变化的监听器
十五、文件上传
1.文件上传表单
上传项必须有name属性
必须post提交
设置enctype为multipart/form-data
2.服务器中的处理
自己写代码处理 - 麻烦
通过commons-fileupload - 方便
ie的bug
文件存放位置
文件重名覆盖
文件夹下文件过多 - hash分目录存储
1.mysql数据库的安装配置
2.sql语言
增
删
改
查
普通查询
条件查询 where
分组查询 group by
聚合查询 count sum avg min max
排序查询 order by
分页查询 limit
子查询
连接查询(多表查询)
3.多表设计
数据之间的关系 要用表之间的关系保存
1 - 1 在任意一方设计外键保存另一方的主键
1 - * 在多的一方设计外键保存另一方的主键
* - * 建立第三方关系表来保存两张表主键的对应关系
4.多表查询
笛卡尔积查询 - 两张表相乘的结果
内连接查询 - 两边都有的数据才查询
外连接查询
左外连接查询 - 在内连接的基础上增加左边有右边没有的数据
右外连接查询 - 在内连接的基础上增加右边有左边没有的数据
全外连接查询 - 在内连接的基础上增加左边有右边没有的数据 和 右边有左边没有的数据
1.jdbc概述
jdbc:sun提供的操作数据库的接口
数据库驱动:不同数据库厂商对jdbc接口的实现
2.开发jdbc步骤
导入驱动包
注册数据库驱动
获取数据库连接
获取传输器对象
传输sql执行得到结果集
遍历结果集获取数据
关闭资源
3.sql注入攻击
将用户提交的数据拼接为sql的一部分造成 当用户提交恶意参数 造成意外的sql的执行
PreparedStatement
4.批处理
5.连接池
频繁的开关数据库连接 效率低下 通过数据库连接池 来管理复用连接
1.事务的概念
逻辑上的一组操作 要么同时完成 要么同时不完成
2.控制事务
mysql默认一条语句一个事务
sql控制事务:
start transaction;
commit;
rollback;
jdbc控制事务:
conn.setAutoCommit(false)
conn.commit()
conn.rollback()
SavePoint sp = conn.setSavePoint();
conn.rollback(sp);
3.事务四大特性 - ACID
原子性
一致性
隔离性
持久性
4.隔离性
加锁 - 效率低 - 并不是所有场景都要严格的隔离性 - 提供了选项
5.四大隔离级别
Read Uncommitted - 脏读 不可重复读 虚读(幻读)
Read committed - 不可重复读 虚读(幻读)
Repeatable read - 虚读(幻读)
Serilizable - 没有任何问题 但是效率低
脏读:一个事务读取到另一个事务未提交的数据
不可重复读:一个事务读取到另一个事务已经提交的数据
虚读(幻读):一个事务读取全表数据 读取到另一个并发事务的新增删除记录已提交的结果
根据需求 选择能够防止想要防止的问题的基础上 性能尽可能高的隔离级别
6.锁机制
两个并发读取 - 不隔离
两个并发修改 - 必须隔离
一个修改一个读取 - Serializable下隔离 其他情况下不隔离
共享锁
共享锁和共享锁共存 共享锁和排他锁不能共存
非Serializable隔离级别下查询不加所 Serializable隔离级别下查询加共享锁
排他锁
排他锁和任意锁都不能共存
任意隔离级别下增删改加排他锁
**死锁
7.更新丢失
两个并发的事务基于同一个查询结果进行修改 后提交的事务忽略了先提交的事务对数据库的影响 造成的问题
案例:
重复充值
秒杀抢购
解决方案:
数据库隔离级别设置为Serializable - 效率低
悲观锁
for update
乐观锁
修改时拼接额外检查查询条件的语句 之后 判断是否修改成功 以此检测是否更新丢失 如果丢失重来
更新多查询少 悲观锁
查询多更新少 乐观锁
Thread内部有map 但是外界无法直接操作
通过ThreadLocal可以操作
利用线程内部的map携带数据 由程序执行的上游向下游传递数据 又由于每个Thread有各自的map可以保存各自的对象 可以防止线程安全问题的产生
set(obj) - 向当前线程map中存 tl->obj
get() - 从当前线程map中获取 tl对应的值
remove() - 从当前线程map中移除 tl键值对