黑马程序员技术交流社区
标题:
【石家庄校区】JavaWeb知识宝典
[打印本页]
作者:
chenlong43210
时间:
2018-6-16 11:37
标题:
【石家庄校区】JavaWeb知识宝典
本帖最后由 小石姐姐 于 2018-6-21 16:01 编辑
JavaWeb知识宝典——
【石家庄校区】
Filter过滤器
过滤器
:过滤请求和响应
作用:IP过滤,脏话过滤,自动登录,响应压缩
过滤器使用步骤:
1.编写类:实现Filter接口,重写方法
2.编写web.xml配置文件:注册Fileter,绑定路径指定要过滤的资源
javax.servlet.Filter 接口
init(FilterConfig config) //执行初始化操作
doFilter(ServletRequest request,ServletResponse response,FilterChain chain) //处理的业务逻辑
destroy() //销毁操作
FilterChain 过滤器链
doFilter(request,response) //放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源
注:多个过滤器请求执行顺序是按照web.xml中的<filter-mapping>的顺序执行。响应执行顺序相反
FilterConfig
String getFilterName() //获取web.xml中filter配置名称
String getInitParameter(String name) //根据键获取web.xml中配置参数
Enumeration getInitParameterNames() //获取所有web.xml中配置参数
ServletContext getServletContext() //获取ServletContext对象
应用:框架会向ServletContext存数据。用于获取数据
Filter生命周期
创建:服务器启动时,服务器创建Filter,调用init(),实现初始化操作。
销毁:当Filter被移除或服务器关闭时,调用destory(),执行销毁操作
<dispatcher>的配置:
REQUEST:默认值.
FORWARD:转发.
INCLUDE:包含.
ERROR:错误页面跳转.(全局错误页面)
文件上传
文件上传的要素
:
method="post"
enctype="multipart/form-data"
<input type="file" name="upload" >
文件重名问题:使用"UUID_文件名"
目录分离: 按时间分、按数量分、按用户分、按算法分
文件上传技术:
Servlet3.0:注解开发,文件上传,异步请求.
JSPSmartUpload:嵌入到JSP中完成文件上传.主要用于Model1年代的.
FileUpload:Apache的文件上传组件.
Struts2:底层是FileUpload.
FileUpload文件上传
ServletFileUpload 核心解析类
(DiskFileItemFactory)
setHeaderEncoding("UTF-8");// 解决中文文件名上传乱码.
//setFileSizeMax(fileSizeMax); // 设置单个文件大小
//setSizeMax(sizeMax); // 设置表单中的所有文件项的文件总大小
List<FileItem> parseRequest(request) //解析request,放回List集合
FileItem
isFormField() //是否是普通项
//普通项
getFieldName() //获取字段name名
getString("UTF-8") //获取值,并解决普通项中文乱码
//文件上传项
getName() //获得文件名
getInputStream() //获得文件输入流
DiskFileItemFactory 文件项工厂
() //创建磁盘文件项工厂
//setSizeThreshold(3 * 1024 * 1024) //(3M)设置缓冲区大小,如果文件的大小超过了缓冲区的大小,就会产生临时文件
//setRepository(repository) //设置临时文件存放的路径
Servlet3.0
【注解开发】
@WebServlet //配置Servlet访问路径和其他配置
@WebListener //配置监听器
@WebFilter //配置过滤器
【文件上传】
1. Servlet上加注解 @MultipartConfig
2. 获取部分对象
Part part=request.getPart("upload");
3. 获取文件名称
String header=part.getHeader("Content-Disposition");
String filename=header.substring(header.lastIndexOf("filename=\"")+10, header.length()-1);
4. 获取读取流
InputStream in=part.getInputStream();
5. 创建写入流
String path=this.getServletContext().getRealPath("/upload");
OutputStream out=new FileOutputStream(path+"/"+filename);
【异步请求】
1. @WebServlet(urlPatterns="/AsyncServlet",asyncSupported=true)
2. AsyncContext context = request.startAsync(request, response);
//开启一个线程执行异步请求
context.start(new MyRunnable(context));
//在线程中操作context即可
AsyncContext.getResponse() //获得响应对象
网上商城环境搭建
使用动态代理完成字符集编码过滤器的编写
需求:使用get或post提交,到servlet中只需要调用request.getParameter方法,中文乱码就已经处理好
【request中的方法的增强】
继承:能够控制这个类的构造
装饰者:增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用
缺点:接口中方法过多,只增强其中的某个方法, 其他的方法也需要重写
动态代理:被增强的类实现了接口
【代理的概述】
JDK中的动态代理 :Proxy对象
Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler handler);
代理的企业应用
Spring 的 AOP
AOP的底层使用的就是代理机制
AOP:面向切面编程,新的思想用来解决OOP中遇到的问题
类加载器
类的加载器: 将class文件加载到 JVM中执行这个文件
JAVA 中将类加载器分成了三类:
引导类加载器:JAVA_HOME/jre/lib/rt.jar
扩展类加载器:JAVA_HOME/jre/lib/ext/*.jar
应用类加载器:加载类路径下的所有class
类加载器的全盘委托机制
有应用类加载器得到A.class String, class, 委托给扩展类加载器,扩展类加载器又委托给引导类加载器,引导类加载器加载String.class 将其他的类的class向下的扩展类加载器,扩展类加载器没有找到,会向下给应用类加载器,将A.class加载
在线支付
在线支付方式
方式一:网站直接与网银接口对接
优点:免费,不影响资金链
缺点:开发人员需了解各个对接银行的网银接口;网银系统升级,可能导致代码需要修改
方式二:网站与第三方支付公司对接,第三方公司再与网银对接。营业额再百万以下使用
优先:只需要与第三方支付公司修改;网银升级不需要修改代码
缺点:收费,会影响到资金链
Linux
特点
:开源、免费、自由使用;多用户、多线程、多任务、Linux可安装在各种计算机硬件设备中,比如手机手机、平板电脑、路由器、台式计算机。
创始人:林纳斯·托瓦兹
【Linux目录结构】
/bin (binaries) 存放二进制可执行文件
/sbin (super user binaries)存放二进制可执行文件,只有root才可访问
/etc (etcetera)存放系统配置文件,网络配置文件信息等都在这个目录下。
/usr (unix shared resources)存放共享的系统资源
/boot 存放用于系统引导时的各种文件,系统启动程序
【Linux常用命令】
man xxx :查看一个命令里面,都有那些别的命令【-xxx】
q退出
切换目录命令
cd app 切换到app目录
cd ..切换到上一层目录
cd /切换到系统根目录
cd ~切换到用户主目录
cd -切换到上一个所在目录
新建目录和移除目录
新建:mkdir xxx:创建子目录
删除:rmdir:删除空的子目录
查看文件内容
cat xxx:显示xxx文件下的内容(全部显示出来)
more xxx:分页显示xxx文件下内容,按空格显示下一页,回车显示下一行
less xxx:分页显示xxx文件下内容,PgUp上一页,PgDn下一页
tail -x xxx:显示后面 xxx 文件,后面 x 行 内容
查找内容
grep xxx a.txt:查找 a.txt 文件内容为 xxx 的
grep yyy b.txt --color :高亮显示,
grep zzz c.txt --color -A5 -B5 :查找 c.txt里面内容为zzz,前面五行和后五行
复制:
cp a.txt b.txt:把 a.txt 的内容,复制到 b.txt
cp a.txt a/x.txt:把 a.txt 复制到 目录为 a 下 x.txt 文件下
移动、重命名:
mv a.txt aaa/ :把 a.txt 剪切到 目录为 aaa 下
mv a.txt b.txt:把 a.txt 重命名为 b.txt
删除文件
rm x.txt:删除 x.txt 文件
rm -f x.txt:不询问直接删除 x.txt【没有询问】
rm -r x:递归删除
rm -rf x:递归删除 【没有询问】【记住这个就好】
rm -rf *:删除所有文件
rm -rf /*:自杀
压缩文件
tar 命令位于/bin 目录下,它能够将用户知道的文件或目录打包成一个文件,但不做压缩
.tar:没有压缩,只有打包
.gz:压缩过的
tar -cvf xxx.tar ./* :把当前路径下的文件,打包成 xxx.tar 【没有压缩】
tar -czvf yyy.tar.gz ./*:把当前路径下的文件,全部压缩成 yyy.tar.gz
解压文件
tar -xvf xxx.tar:在当前目录下解压 xxx.tar
tar -xvf yyy.tar.gz -C /user:指定 user 目录下,解压 yyy.tar.gz
下载
wget
http://nginx.org/...../nginx-1.9.tar.gz
重定向输出
ifconfig > a.txt :把内容输出到 a.txt【覆盖】
ifconfig >> a.txt :原有内容后追加
管道
其作用是将一个命令输出用作另一个命令的输入【 | 】
ps -ef :查看所有进程 【任务管理器】
ls --help | more :分页查询帮助信息
ps -ef | grep java :查询名称中包含Java的进程
命令执行控制
命令之间使用&&连接,实现逻辑与的功能 【 && 】
只要在&&左边的命令返回真,&&右边的命令才会执行,反之不行
mkdir test && cd test :创建test,并进入 test
网络通讯命令
ifconfig :显示或设置网络设备
ifconfig eth0 up:启用 eth0 网卡
ifconfig eth0 down: 停用 eth0 网卡
ping:探测网络是否通畅
ping 196.168.178.128 【Ctrl + c 停止探测】
netstat:查看网络端口
切换登陆:
ssh -l test -p 22
su - root :切换到 root 用户
su - test :切换到 test 用户
userdel :删除一个用户【删除用户必须在 root 用户下 操作】
userdel test :删除 test 用户 【不会删除 home 目录】
userdel -r test :删除用户以及 home 目录 【推荐】
exit :退出
w :显示所有的用户账户
组管理
groupadd:创建组
groupdel:删除组,如果该组有用户成员,必须先删除用户才能删除组
groupdel public:删除名为 public 的组
权限管理
id:查看一个用户的UID 和 GID
su:切换用户
/etc/passwd:用户文件
/etc/shadow:密码文件
/etc/group:组信息文件
Nginx
概述
:高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
正向代理(Forward Proxy):访问外网时,如果被路由器限制,可以通过代理服务器访问到外网
反向代理(reverse proxy):对于客户端而言代理服务器就像是原始服务器
反向代理作用;保护和隐藏原始资源服务器
负载均衡(Load Balance):其意思就是分摊到多个操作单元上进行执行
tomcat集群session共享问题:
方式一:一个用户访问后只在一台tomcat上进行操作
方式二:session的共享
一种使用tomcat广播机制完成session的共享(不推荐,集群越大,效率越低)
一种使用Redis框架方式完成session共享(推荐)
Oracle
【表空间/用户】
创建表空间
create tablespace 表空间名
datafile 'c:\a.dbf' --设置物理文件名称
size 100m --设置表空间初始大小
autoextend on --开启可自动扩展
next 10m --每次扩展时增加10m
创建用户
create user 用户名
identified by 密码
default tablespace 表空间名
用户赋权
grant dba to 用户名 --赋予用户DBA权限,可登陆
【数据类型】
字符型
CHAR 固定长度字符类型,最多2000字节
VARCHAR2 可变长度字符类型,最多4000字节
LONG 大文本类型,最大2G
数值型,如:
NUMBER(5) 最大可存99999,默认长度18
NUMBER(5,2) 最大可存999.99
日期型
DATA 日期时间型,精确到秒
TIMESTAMP 精确到秒的小数点后9位
二进制型(大数据类型)
CLOB 存储字符,最大4G
BLOB 存储图像、声音、视频等二进制数据,最多4G
【表操作】
修改表
增加字段
ALTER TABLE 表名 ADD(列名 1 类型 [DEFAULT 默认值],..)
修改字段
ALTER TABLE 表名称 MODIFY(列名 1 类型 [DEFAULT 默认值],..)
修改字段名
ALTER TABLE 表名称 RENAME COLUMN 原列名 TO 新列名
删除字段名
ALTER TABLE 表名称 DROP COLUMN 列名 --删除一个
删除表
DROP TABLE 表名
truncate table 表名 --不可回滚
【数据查询】
基于伪列的查询
ROWID:该记录存储在数据文件中的物理地址
ROWNUM:为扫描到的匹配条件到的记录添加一个从1开始的序号
连接查询
左外连接:在右表的关联条件上后加(+)
右外连接:在左表的关联条件上后加(+)
分页查询
select * from (select rownum r,x.* from (查询语句) x) where r between 10 and 20
【单行函数】
伪表:dual
字符函数
length('') 字符串的长度
substr('',num,len) num从1开始,截取len个
concat('','') 拼接字符串
''||'' 拼接字符串
数值函数
round(小数[,2]) --四舍五入,[保留两位小数]
trunc(小数[,2]) --舍去所有小数点,[保留2位]
mod(10,4) --10%4=2,取模
日期函数
sysdate --当前时间,格式:yyyy/mm/dd hh:mi:ss
sysdate-3 --代表当前日期减3天
add_months(sysdate,3) --加月函数,加三个月
last_day(sysdate) --日期为所在月最后一天
trunc(sysdate) --日期截取,保留天之前,yyyy/mm/dd
如:trunc(sysdate,'yyyy') --保留年,yyyy/1/1
转换函数
to_char(1024) --数字转字符串
to_number('1024') --字符串转数字
to_char(sysdate,'yyyy-mm-dd hh:mi:ss') --日期转字符串
to_date('2013-10-03','yyyy-mm-dd') --字符串转日期
其他函数
nvl(被检测值,如果为null值2) --如果被检测的值为null,则返回值2,否则返回本身
nvl2(被检测值,如果不为null值,如果为null值)
【分析函数】
跟在select相当于一个字段
相同值,排名相同,排名跳跃
rank (order by 字段 [desc])
相同值,排名相同,排名连续
dense_rank (order by 字段 [desc])
无论值是否相等,返回连续的排名
row_number (order by 字段 [desc])
实现分页查询
select * from
(select row_number() over(order by 字段 desc) rownumber,字段 from 表名)
where rownumber>10 and rownumber<=20
【集合运算】
就是将两个或多个结果集组合成一个结果集
union all --并集,返回多个结果集的所有记录,包括重复记录
uinon --并集,不包括重复记录
intersect --交集,返回结果集中共有的记录
minus --差集,第一个结果集减去第二个结果集
ORACLE对象
【视图】
概述:一个虚拟表,视图存储的并不是数据,只是一条SQL语句
创建/修改视图
create [or replace] [force] view view_name
as subquery
[with check option] [with read only]
选项解释:
[or replace] 若创建的视图存在,则自动重建该视图
[force] 不管基表是否存在都会自动创建该视图
subquery 一条完整的select语句,可以在该语句中定义别名
[with check option] 插入或修改的数据行不能使用select语句的条件字段
[with read only] 该视图上不能进行任何 DML 操作
删除视图
drop view view_name
【物化视图】
概述:询结果存储到一个物化视图(实体化视图)
创建物化视图
create materialized view mv_name
[build immediate | build deferred ] --视图生成数据时机
[refresh [force|fast|complete]] --基表更新时视图更新方式
[on [demand|commit] | start with (start_time) next (next_time)] --基表更新时视图更新时机
as subquery
选项解释
[build immediate] 默认,创建物化视图时生成数据
[build deferred] 根据需要再生成数据
refresh [force|fast|complete] 刷新方式
on [demand|commit] 刷新时机
增量:只更新基表更新的部分
全量:重新完全查询基表数据
【序列】
概述:是ORACLE提供的用于产生一系列唯一数字的数据库对象
创建序列
create sequence seq_name
[increment by n] --递增序列值,n正数为递增,负数为递减,默认1
[start with n] --初始值,默认递增minvalue,递减maxvalue
[maxvalue n | nomaxvalue] --最大值
[minvalue n | nominvalue] --最小值
[cycle | nocycle] --循环|不循环
一次缓存的值不能超过一次循环的值0
公式:ceil((maxvlaue-minvlaue)/increment by)>=cache
[cache n | nocache] --分配并存入到内存数n
修改序列
如:alter sequence 序列名称 maxvalue 5000 cycle;
删除序列
drop sequence 序列名称
通过序列的伪列访问序列的值
seq_name.nextval 返回序列下一个值
seq_name.currval 返回序列当前值
【同义词】
概述:就是一个别名,可以给表、视图、同义词等创建同义词
创建同义词
create [public] synonym 名称 for object --私有同义词,只有当前用户可访问
选项解释
[public] 公有同义词,另外的用户也可使用公有同义词
object 表示表,视图,序列等我们要创建同义词的对象的名称
【索引】
概述:索引需占据存储空间,是一种特殊的数据。
作用:提高数据查询效率
创建索引
create [unique|bitmap] index 索引名称 on 表名(列名[,列2]) [reverse];
选项解释
unique:唯一索引,不重复的列可以创建唯一索引
reverse:反向键索引。适合字段值为连续增长的值的字段
bitmap:位图索引。适合创建在低基数列上
ORACLE编程
【PL/SQL】
概述:(Procedure Language/SQL)过程化SQL语言,指在 SQL 命令语言中增加处理能力
基本语法结构
[declare
v_name 类型(长度); --声明变量
]
begin
--逻辑代码
--给变量直接赋值
v_name:=value;
--通过查询语句给变量|记录型变量赋值,该查询语句只能返回一条记录
select 列1,列2... into v_name1,v_name2... from ...;
--给记录型变量赋值
select * into v_name from ...;
--输出到output
dbms_output.put_line(内容);
[exception
--异常处理(例外)
when 异常类型 then
--异常处理逻辑
...
]
end;
变量类型:
基本类型
引用型(表名.列名%TYPE),应用于不知道变量类型时但确定是一个表中的字段
记录型(表名%rowtype)
异常:
预定义异常:当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
O_DATA_FOUND :使用 select into 未返回行
TOO_MANY_ROWS :执行 select into 时,结果集超过一行
用户定义异常:用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发
条件判断
if 条件 then
业务逻辑
elsif 条件 then
业务逻辑
else
业务逻辑
end if;
循环
1.无条件循环
loop
exit when 条件; --符合条件则退出
循环语句
end loop;
2.条件循环
while 条件 --符合条件则执行循环
loop ... end loop;
3.for循环
for 变量名 in 起始值 .. 终止值
loop ... end loop;
游标:可以理解为 PL/SQL 中的结果集
声明游标,参数在SQL总直接使用即可(写在declare中)
cursor 游标名称(参数名 类型) is SQL查询语句;
使用游标(写在begin中)
方式一:
open 游标名称(参数)
loop
fetch 游标名称 into 变量名; --需先定义一个%rowtype类型变量
exit when 游标名称%notfound;
--业务逻辑
end loop;
close 游标名称;
方式二:for循环提取游标值,隐式开启关闭游标
for 变量名 in 游标名称(参数)
loop
--业务逻辑,直接使用变量名操作即可
end loop;
【存储函数】
概述:又称自定义函数,接收一个或多个参数,返回一个结果
创建/修改存储函数:
create [or replace] function fn_name
(参数名称1 类型,参数名称2 类型,...)
return 结果变量数据类型
is
--变量声明
begin
--逻辑
return 结果变量;
[exception]
end;
【存储过程】
概述:存储过程是被命名的PL/SQL块
应用:对大量数据的读写操作
创建/修改存储过程
create [or replace] procedure pro_name
(参数名 [参数模式] 类型,参数名 类型,...) --参数类型不用指定长度
is|as
--声明变量
begin 逻辑 [exception] end;
过程参数模式:
in 传入参数(默认缺省)
out 传出参数,用于返回参数结果
in out 传入传出参数
调用存储过程:
方式一:
call pro_name(参数);
方式二:
begin pro_name(参数); end;
【触发器】
概述:触发器依赖于表,存储PL/SQL程序
应用:数据确认;数据备份和同步;复杂安全性检查;做审计,根据表上所做的数据操作
数据的容灾备份:主从服务器
主:insert、update、delete
从:select
触发器分类
前置触发器 BEFORE :可以对未更新插入的值修改
后置触发器 AFTER
创建/修改触发器
create [or replace] trigger tri_name
before|after
[delete|insert|update [of 列名]] --多个用or分隔,不写of针对所有字段
on [表名]
[for each row] [when(条件)]
declare ... begin ... end; --PLSQL块自动commit
选项解释:
[for each row] 标注此触发器是行级触发器、(不写)语句级触发器
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2