黑马程序员技术交流社区

标题: 【石家庄校区】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