java学习笔记————本质篇5

19.过滤器:Filter.对客户端向服务器发送的请求进行过滤. // 参数:request + response + chain =====》 void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
   Filter是Servlet中最为实用的技术.Filter和Listener都属于Servlet中的高级部分.
核心方法:doFilter(ServletRequest request, ServletResponse response,FilterChain chain)


1.功能:
* 过滤敏感词汇.
* 进行URL级别权限控制.
* 统一网站的字符集编码.
* 进行响应的压缩.


2.FilterChain对象:过滤器链.
过滤器链指的是:一组过滤器对某些WEB资源进行过滤.那么这组过滤器称为是过滤器链.
执行顺序: 按照<filter-mapping>的排序执行


3.Filter的生命周期:——————同Servlet
* 创建:
* 服务器启动的时候创建Filter的对象.
* 销毁:
* 服务器关闭的时候或者是项目移除!
* 服务器启动的时候,服务器创建一个Filter的对象.过滤器中init方法就会执行了.  // init(FilterConfig)
 当过滤器过滤到要进行拦截的资源的路径的时候,doFilter方法就会执行.
 当服务器关闭的时候.销毁过滤器对象.destroy方法就会执行.


4.FilterConfig:过滤器的配置对象.
实现 Filter
API:
getFilterName()
getInitParameter("username")  ——————web.xml中所配置的初始参数
getInitParameterNames()
******* getServletContext()————————————————获得ServletContext对象.


过滤器相关的配置: 在web.xml中配置:
.....
<url-pattern>标签的配置:
三种配置方式:
* 完全路径匹配 :以 / 开始.    如: /aa   /bb   /aa/bb
* 目录匹配    :以 / 开始. 需要以 * 号结束.    如: / * /aa/ *  /aa/bb/*
* 扩展名匹配 :不能以 / 开始. 需要以 * 号开始. 如:*.jsp*.do*.action


* <servlet-name>:过滤名称为某个值的Servlet.如:<servlet-name>ServletDemo1</servlet-name>


* <dispatcher>:默认情况下只会去过滤从客户端向服务器发送的请求.//默认过滤 request<!-- 一般配置在 struts2 核心过滤器中 -->
* REQUEST :默认值.过滤的请求.
* FORWARD :过滤的是转发 如: <dispatcher>FORWARD</dispatcher>   // <jsp:forward>标签想使用,必须配置此项!!!
* INCLUDE :过滤的是包含
* ERROR :过滤的是错误页面跳转.(全局错误页面的跳转)




/** 统一网站的字符集编码的过滤器:
doFilter()方法中:
// 获得初始化参数:字符集:
String encoding  = filterConfig.getInitParameter("encoding");
request.setCharacterEncoding(encoding);  // 设置参数的编码   ——————> 可能内部根据我们 传参encoding ,做了new String("编码",解码)
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
*/




/** 禁用网站的所有动态页面的缓存:// 有些网站不能出现缓存:网银系统.网站中数据是经常变化.(向页面中输出当前的时间).
doFilter()方法中:
// 禁用浏览器的缓存:
HttpServletResponse resp = (HttpServletResponse) response;  //强转为 HttpServletResponse 和...
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
resp.setDateHeader("Expires", -1);
// 放行:
chain.doFilter(request, resp);




response.setDateHeader("Expires", 1000L*60*60*24*30);//设置缓存 --有效期  ---时间-Long类型
response.setDateHeader("Expires",-1);  // -1 --- 会话结束 - 即销毁
*/


分IP统计网站访问次数的过滤器:——————filterConfig.getServletContext()// filterConfig.getServletContext.setAttribute("map",map.put(request.getRemoteAddr(),1));


自动登录的过滤器:
/** * 判断Session中是否已经存在用户的登录信息:
* * 已经存在:
* * 放行.
* * 不存在:
* * 从request中获得所有Cookie的信息.
* * 查找指定名称Cookie:
* * 没有查询到:
* * 直接放行.
* * 查询到:
* * 获得Cookie中的用户名和密码:
* * 根据用户名和密码去数据库进行查询:
* * 查询到用户:
* * 将用户的信息保存到session中
* * 放行.
* * 没有查找到用户:
* * Cookie中用户名和密码有可能被篡改.
* * 放行.
*/




URL级别的权限控制的过滤器:// 实际开发中,通常将一些非常重要的资源(Servlet,JSP...)放入到特殊的路径中.必须有特殊身份用户(管理员)才可以访问到.
/** * 获得用户的访问路径:
* * 根据路径去Map中进行查找:
* * 如果路径匹配了:
* * 获得能够访问这个路径的匹配身份.
* * 获得用户的登录的身份信息.
* * 比对匹配的身份与登录的身份是否一致:
* * 如果身份一致:
* * 放行:
* * 如果身份不一致:
* * 权限不足:
 */




网站通用的字符集编码过滤器:
前台页面向后台提交数据: * 无论是GET还是POST提交中文的时候都会出现乱码的问题. ***** 编写的过滤器解决中文乱码的问题:(GET和POST的乱码的解决).
// request.setCharacterEncoding(“UTF-8”);只能影响请求行、头、体中的编码方式,对URL链接编码方式无效!!!——————> 即对GET请求无效!!!


/** 通用的字符集编码过滤器的实现的步骤:
* 发现GET和POST提交的时候都会调用request.getParameter方法:
* 是否增强request中的getParameter方法:
* 增强一个类的某些方法有几种办法:
* 三种办法:
* 继承:
* 条件:能够控制这个类的构造.
* 装饰者模式:
* 条件:
* 增强的类和被增强的类实现相同的接口.
* 增强的类中需要获得到被增强的类引用.
* 动态代理:
HttpServletRequest:接口
  | |
实现类1 自定义增强类
* 获得实现类1的引用.
* 缺点:接口中的方法特别多.
* 动态代理:
* 条件:
* 类需要实现接口.对实现了接口的类产生代理.
*/
/** ***** GET和POST方式如何解决乱码:
* POST:
* 解决办法:
* request.setCharacterEncoding(“UTF-8”);
* GET:
* 解决办法:
* String name = new String(request.getParameter(“name”).getBytes(“ISO-8859-1”),”UTF-8”);
*/






20.文件上传和下载:
1.文件上传: // 将本地文件写到服务器上.
文件上传的三要素:
* 表单的提交的方式必须是POST方式:
* GET方式有大小的限制的.POST方式没有大小的限制.
* 表单中需要有文件上传项:
* 在表单中需要有<input type=”file” name=“”/>.而且文件上传项必须有name的属性.
* 表单的enctype属性:必须设置为multipart/form-data


文件上传的技术:
1.JSPSmartUpload:jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件, // 上传 + 下载
 它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。


2.FileUpload :FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名.


3.Servlet3.0 :提供了文件上传的功能.


4.Struts2 :提供了文件上传和下载的功能.  // 上传 + 下载


2.FileUpload:
  /** 使用FileUpload组件完成文件上传:
* * 创建一个磁盘文件项工厂:
* * 创建一个核心解析类:
* * 使用核心解析类解析request请求.返回一个List集合.封装的一个FileItem的对象.
* * 遍历List集合获得到表单中的每个部分(FileItem).
* * 判断FileItem是否是文件上传项:
* * 文件上传项:完成文件上传.
* * 普通项:获得普通项名称和值.
*/
核心API:
/** ServletFileUpload: // 核心解析类:
ServletFileUpload.isMultipartContent(request)  ———— 判断表单的enctype的属性是否是multipart/form-data.    T/F
new ServletFileUpload(diskFileItemFactory)  ———— 创建核心解析类
servletFileUpload.setHeaderEncoding("UTF-8");  ———— 处理中文文件名的上传的乱码问题:
servletFileUpload.setSizeMax(5 * 1024 * 1024); ————设置所有文件上传的总大小  setFileMax()————单个文件大小
setProgressListener()  ————* 设置监听器:作用监听上传的进度.
List<FileItem> list = servletFileUpload.parseRequest(request);  ——————  解析request请求
*/
/** DiskFileItemFactory:  // 磁盘文件项工厂
DiskFileItemFactory() /DiskFileItemFactory(int sizeThreshold, java.io.File repository)
//* int sizeThreshold:FileUpload组件的缓冲区大小.默认是10kb.* File repository:文件上传过程中产生临时文件存放的路径.
get/setSizeThreshold(5 * 1024 * 1024)  // ../设置FileUpload的组件的文件上传的缓冲区大小.
get/setRepository(new File(temp)) // ../设置临时文件存放的路径.
*/
/** FileItem:  // 文件项
fileItem.isFormField()   // 判断是否是文件上传项:
fileItem.getFieldName();fileItem.getString("UTF-8");  // 普通项 的名称 / 值
fileItem.getName();//  获得文件上传项的文件的名称.
fileItem.getInputStream();————要上传的文件封装到输入流中  //获得文件上传项的文件的内容.
fileItem.delete()// * 删除文件上传中的临时文件.*/


/** 通过JS控制多文件的上传:
"<div>文件上传:<input type='file' name='upload'/><input type='button' value='删除' οnclick='del(this)'></div>
$("#div").html() = "";  //一次性将div内容清空,删除所有


问题:
问题一:IE6浏览器兼容的问题:if(fileName.indexOf("\\") != -1){说明浏览器的版本比较低..}
问题二:上传文件的文件名的重名的问题:UUID.randomUUID().toString().replace("-", "")+"_"+fileName;
问题三:一个目录下存放的文件过多的问题.   目录分离
/** 目录分离算法分析:
* 获得文件的唯一文件名:
* 获得到唯一文件名的hashCode().
* 哈希值是一个int类型的值.int类型是4个字节.每个字节8位.(32位).   ————> 0x:十六进制0xf 可直接写 15
* 哈希值&0xf;得到一个值.用这个值作为一级路径.
* 哈希值右移4位&0xf;得到一个值.用这个值作为二级路径.*/




3.文件下载两种形式: // 本质:就是将文件编码成 浏览器不能解析的类型, 就会提示下载!!! Content-Disposition:代表文件需要以下载的形式打开.
//attachment:附件
/** 一种:超链接下载. 对于下载的资料.将资源写到<a href=”资料路径”>下载</a>.
* 前提:如果浏览器支持这个格式的文件.可以在浏览器中打开.如果浏览器不支持这个格式的文件.提示下载.


二种:手动编写代码的方式进行下载.* 无论浏览器是否支持该格式的文件:提示下载.
* 设置两个头和一个流:
* Content-Type:代表的是文件的MIME类型.// Content-Type: application/x-www-form-urlencoded 表单的数据类型,说明会使用url格式编码数据
* Content-Disposition:代表文件需要以下载的形式打开.// attachment;filename=${name}
* InputStream:代表的文件的输入流.
* 因为输出流是固定的: response.getOutputStream();


树形结构的遍历:  创建一个队列:Queue<File> queue = new LinkedList<File>();入队:queue.offer(root);出队:queue.poll();
*/








21.1.AJAX: AJAX = 异步 JavaScript 和 XML(标准通用标记语言的子集)// 现在多使用 JSON 代替了 XML
/** AJAX完成的是页面的局部刷新的效果!!!异步加载
即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面。*/


软件的结构: C/S结构 :Client / ServerB/S结构:Browser /Server


1.核心对象:XMLHttpRequest(JS中的对象)//JS中有一个XMLHttpRequest.逐渐重视JS.    减轻服务器压力.RIA(Rich Internet Application).可以使用户体验得到增强.
属性:
onreadystatechange:用于指定XMLHttpRequest对象状态改变时的事件处理函数// 监听request变化,触发js函数
/** readyState:XMLHttpRequest对象的处理状态//4
0 :XMLHttpRequest对象还没有完成初始化
1 :XMLHttpRequest对象开始发送请求
2 :XMLHttpRequest对象的请求发送完成
3 :XMLHttpRequest对象开始读取服务器的响应
4 :XMLHttpRequest对象读取服务器响应完成
*/
responseText : 用于获取服务器的响应文本----------------  servlet查询到的list结果集 封装到了 此对象中
----------------  在想要显示内容的 任意div块 中调用即可获取到数据
responseXML : 用于获取服务器的响应的XML文档
status : 服务器返回的状态码 // 只有服务器的响应已经完成时,才会有该状态码 200
statusText : 服务器返回的状态文本信息// 只有当服务器的响应已经完成时,才会有该状态文本信息


API:
open :打开链接.//  open(请求方式,请求路径,true);
send :发送数据//  send(数据);
setRequestHeader:设置请求的头信息.//  setRequestHeader(“头”,”值”);


/** XMLHttpRequest的对象的创建:
IE浏览器创建XMLHttpRequest的时候:
* 将对象封装到浏览器的ActiveXObject组件中.
Firefox浏览器创建XMLHttpRequest的时候:
* 直接创建. */


/** * AJAX的代码的编写:GET请求    // GET方式需要向后台传递参数:* 需要在路径的后面拼接这些参数.不要将参数写到send方法中.
* 1.创建异步的XMLHttpRequest对象.// createXMLHttpRequest();
* 2.设置监听:监听对象的状态的变化,触发一个函数.// xhr.onreadystatechange = function(){}
* 3.打开链接:
xhr.open("GET","${pageContext.request.contextPath}/AjaxServletDemo1?id=2&name=张三&time="+new Date().getTime(),true );
//  每次URL路径都不同   ----  处理浏览器缓存问题  ---- 及时更新页面数据
* 4.发送数据:    //  xhr.send(null); */
POST请求     // xhr.send("id=3&name=李四"); * POST请求传递参数:需要将参数写到send方法中.
// xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //设置进行URL编码


Servlet端:  响应文本 ——————response.getWriter().println(xxx);


/** 应用: AJAX异步校验用户名是否存在: date = 1 / 2  ====占用/可以使用
使用AJAX完成二级联动的效果:
1.将XML文档中的<province name=””>标签中的name属性的值获得到,添加到第一个下拉列表中:
2.判断选中哪个<province>节点,遍历其子节点获得<city>标签中的值,写入到第二个下拉列表中.
*/


21.2.XStream:将对象,集合转成XML格式. //  xpp3_min-1.1.4c.jar* xstream-1.4.4.jar
API:
XStream xStream = new XStream();
xStream.alias();
xStream.useAttributeFor();
xStream.addImplicitCollection();
String xml = xStream.toXML();


/** 集合————>xml:
XStream xStream = new XStream();————————————// new Province(1, "河北省", cities1); Province对象中封装了 ID、name、list<city>
// 不使用类的全路径作为标签名称:—————————————— 添加标签


xStream.alias("province", Province.class);
xStream.alias("city", City.class);


// 使用类的属性作为标签的属性而不是子标签形式:   —————————————— 给标签添加属性 id、name
xStream.useAttributeFor(Province.class, "id");
xStream.useAttributeFor(Province.class, "name");


xStream.useAttributeFor(City.class, "id");
xStream.useAttributeFor(City.class, "name");


// 使用去掉属性中集合的属性作为其子标签:—————————————— 将<province> 作为子标签 (需要去掉 Province类中包含的list<city>属性 )
xStream.addImplicitCollection(Province.class, "cities");


String xml = xStream.toXML(provinces);
System.out.println(xml);*/


/** 对象————>xml:
// 不使用类的全路径作为标签名称:使用类作为标签名称:——————>不能带包名 :xxx.class=原始对象=不含包名带包名:province1 = cn.it.Xstream. Province
xStream.alias("province", Province.class);
xStream.alias("city", City.class);


// 使用类的属性作为标签的属性而不是子标签形式:
xStream.useAttributeFor(Province.class, "id");
xStream.useAttributeFor(Province.class, "name");


xStream.useAttributeFor(City.class, "id");
xStream.useAttributeFor(City.class, "name");


// 使用去掉属性中集合的属性作为其子标签:
xStream.addImplicitCollection(Province.class, "cities");
String xml = xStream.toXML(province1);
System.out.println(xml);、、*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值