网站建设就业,建设营销型网站的要素,wordpress转移至typecho,网页设计工资怎么样JavaWeb复习一.概述1.概念2.B/S和C/S 架构二.HTTP通信协议概述1.概念2.HTTP1.0 与 HTTP1.1 版本3.HTTP 协议组成4.常见状态码5.GET 与 POST 请求方式三.Tomcat1.Web服务器介绍2.安装#xff08;Windows#xff09;3.Tomcat目录结构4.server.xml部分配置解释四.Servlet1.概念2…
JavaWeb复习一.概述1.概念2.B/S和C/S 架构二.HTTP通信协议概述1.概念2.HTTP1.0 与 HTTP1.1 版本3.HTTP 协议组成4.常见状态码5.GET 与 POST 请求方式三.Tomcat1.Web服务器介绍2.安装Windows3.Tomcat目录结构4.server.xml部分配置解释四.Servlet1.概念2.工作原理3.Servlet 生命周期4.ServletConfig5.ServletContext6.url-pattern/的配置7.HttpServletRequest8.HttpServletRequest9.请求/响应中乱码的解决10.转发和重定向五.Filter1.概念2.工作原理3.Filter接口中的方法4.Filter的配置5.FilterConfig6.Filter链7.常见Filter的应用六.cookie和session1.cookie概念2.Cookie的创建3.Cookie的读取4.Cookie的常用方法5.Cookie的分类6.Cookie的限制7.Session的概念8.HttpSession对象的获取9.设置Session的有效时间10.session的常用方法11.HttpSession对象的销毁时机12.cookie禁用时session失效的问题七.AJAX1.概念2.工作原理3.XMLHttpRequest 对象4.jQuery ajax5.同步和异步6.jQuery ajax 的常用参数八.JSON1.概念2.JSON的值3.JavaScript中JSON的解析4.fastjson5.使用fastjson解析九.文件的上传和下载1. 文件上传2. 文件下载十.Log4j1.概念2.Log4j的组成3.Appender输出端4.Layout日志格式化器5.Logger记录器一.概述
1.概念
Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。 它可以在各种供应商提供的实现Servlet规范的 Servlet容器中运行。 Web客户端的主要任务是展现信息内容 Web服务器端主要是响应客户的请求
#mermaid-svg-Ef9kzEgSbocxXg5T {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T .error-icon{fill:#552222;}#mermaid-svg-Ef9kzEgSbocxXg5T .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ef9kzEgSbocxXg5T .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Ef9kzEgSbocxXg5T .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ef9kzEgSbocxXg5T .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ef9kzEgSbocxXg5T .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ef9kzEgSbocxXg5T .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ef9kzEgSbocxXg5T .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ef9kzEgSbocxXg5T .marker.cross{stroke:#333333;}#mermaid-svg-Ef9kzEgSbocxXg5T svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ef9kzEgSbocxXg5T .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Ef9kzEgSbocxXg5T text.actortspan{fill:black;stroke:none;}#mermaid-svg-Ef9kzEgSbocxXg5T .actor-line{stroke:grey;}#mermaid-svg-Ef9kzEgSbocxXg5T .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T .sequenceNumber{fill:white;}#mermaid-svg-Ef9kzEgSbocxXg5T #sequencenumber{fill:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T .messageText{fill:#333;stroke:#333;}#mermaid-svg-Ef9kzEgSbocxXg5T .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Ef9kzEgSbocxXg5T .labelText,#mermaid-svg-Ef9kzEgSbocxXg5T .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-Ef9kzEgSbocxXg5T .loopText,#mermaid-svg-Ef9kzEgSbocxXg5T .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-Ef9kzEgSbocxXg5T .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Ef9kzEgSbocxXg5T .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Ef9kzEgSbocxXg5T .noteText,#mermaid-svg-Ef9kzEgSbocxXg5T .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-Ef9kzEgSbocxXg5T .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Ef9kzEgSbocxXg5T .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Ef9kzEgSbocxXg5T .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Ef9kzEgSbocxXg5T .actorPopupMenu{position:absolute;}#mermaid-svg-Ef9kzEgSbocxXg5T .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Ef9kzEgSbocxXg5T .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Ef9kzEgSbocxXg5T .actor-man circle,#mermaid-svg-Ef9kzEgSbocxXg5T line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Ef9kzEgSbocxXg5T :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}浏览器web服务器服务端程序数据库HTTP协议ServletJDBC浏览器web服务器服务端程序数据库2.B/S和C/S 架构
B/SBrowser/Server浏览器/服务器。主要通过浏览器发送请求来和服务器进行数据交互 C/SClient/Server客户端/服务器。客户端需要安装针对某一具体业务专门开发的软件。 B/S模式的优缺点 B/S优势开发成本低管理维护简单产品升级便利用户使用方便 B/S 缺点安全性不足客户端不能随心变化受浏览器的限制 C/S 架构的优缺点 C/S优势界面和操很丰富安全性能高响应速度较快 C/S 缺点 适用面窄用户群固定维护成本高
二.HTTP通信协议概述
1.概念
HTTPHyper Text Transfer Protocol超文本传输协议是一个基于请求与响应模式的、无状态的网络协议是浏览器和服务器间最常用的通讯协议。HTTP 协议是浏览器与服务器间的数据传递格式的一种约定。
2.HTTP1.0 与 HTTP1.1 版本
HTTP1.0 HTTP1.0 协议中的连接属于非持久连接一次 TCP 连接只能进行一次请求与响应。 一次请求与响应对应一个 TCP 连接。HTTP1.0 不支持对虚拟主机的访问。 客户端只有在接收到服务端对上一次请求的响应后客户端才可发出第二次请求。 HTTP1.0 协议中在客户端接收到服务端的响应后马上发送关闭 TCP 连接的请求服务端关闭连接。 HTTP1.1 HTTP1.1 支持持久连接在一个 TCP 连接上可以传送多个请求和响应。 一般情况下一个页面中的请求与响应对应一个 TCP 连接。 HTTP1.1 还允许客户端不用等待上一次请求结果返回就可以发出下一次请求。 HTTP1.1 支持对虚拟主机的访问。 HTTP1.1 协议中在客户端接收到对最后一次请求的响应后马上发送关闭 TCP 连接请求服务端关闭连接。
3.HTTP 协议组成
请求协议 请求行请求提交方式名(大写)请求的URI请求协议及版本号 请求报头存放着各种请求参数及值其格式为“参数名参数值” 空白行用于分离请求报头与请求正文。 请求正文存放请求还携带的参数及值。 响应协议 状态行包含协议及版本号状态码状态描述信息。 响应报头存放着各种响应参数及值其格式为“参数名参数值”。 空白行用于分离响应报头与响应正文。 响应正文响应数据所形成的 HTML 文件内容
4.常见状态码
200 OK 请求已成功请求的响应头或数据体将随此响应返回。 400 Bad Request 由于包含语法错误当前请求无法被服务器理解。 401 Unauthorized 当前请求需要用户验证。 403 Forbidden 服务器已经理解请求但是拒绝执行它。 404 Not Found 请求失败请求的资源在服务器上找不到。 500 Internal Server Error 服务器遇到了一个未曾预料的状况导致了它无法完成对请求的处理。 503 Service Unavailable 由于临时的服务器维护或者过载服务器当前无法处理请求。
5.GET 与 POST 请求方式
GET 请求 由于 GET 请求会将请求所携带的参数作为请求 URL 中的一部分出现所以请求参数会显示在地址栏。 而这就导致了 GET 提交的三点不足 • 参数值只能是字符串而不能是其它类型 • 可以携带的数据量小 • 数据安全性低 POST 请求 POST 请求会将请求所携带的数据以请求正文的形式出现所以与 GET 方式相比POST请求的优点在于 • 数据类型可以是任意类型还可以是声音、视频、图片等文件 • 请求可以携带的数据量大 • 数据安全性高
三.Tomcat
1.Web服务器介绍
Web服务器的作用是接收客户端的请求给客户端作出响应。 对于JavaWeb程序我们不仅需要Web服务器还需要JSP/Servlet容器通常这两者会集于一身。 常见的JavaWeb服务器 ①TomcatApache: 当前应用最广的JavaWeb容器 ②Weblogic(Oracle): 支持JavaEE,适合大型项目不免费 ③Jboss(Redhat红帽): 支持JavaEE应用比较广EJB容器 ④Websphere(IBM): 支持JavaEE,适合大型项目不免费
2.安装Windows
1.需要有Java环境 2.下载zip 官网 http://tomcat.apache.org/3.解压后找到bin目录里面的startup.bat启动Tomcat 4.在浏览器输入http://localhost:8080/ 5.出现欢迎页则成功
3.Tomcat目录结构 4.server.xml部分配置解释
Host namelocalhost appBasewebapps unpackWARstrue autoDeploytrue xmlValidationfalse xmlNamespaceAwarefalse
Context 虚拟目录 docBase 真实访问地址 path访问路径 appBase资源路径 unpackWARstrue自动解压war包Context path/mule docBase/var/www/webapp/MuleworkDir/var/www/webtemp/Mule debug5 reloadablefalsecrossContexttrue /四.Servlet
1.概念
Java Servlet 是运行在 Web 服务器或应用服务器上的java程序Servlet从web客户端接收服务请求并给出响应通常是通过http协议来实现它是作为客户端请求和服务器应用程序之间的中间层。
2.工作原理
#mermaid-svg-xEYlCkxiDLAA437w {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xEYlCkxiDLAA437w .error-icon{fill:#552222;}#mermaid-svg-xEYlCkxiDLAA437w .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xEYlCkxiDLAA437w .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-xEYlCkxiDLAA437w .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xEYlCkxiDLAA437w .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xEYlCkxiDLAA437w .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xEYlCkxiDLAA437w .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xEYlCkxiDLAA437w .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xEYlCkxiDLAA437w .marker.cross{stroke:#333333;}#mermaid-svg-xEYlCkxiDLAA437w svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xEYlCkxiDLAA437w .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xEYlCkxiDLAA437w text.actortspan{fill:black;stroke:none;}#mermaid-svg-xEYlCkxiDLAA437w .actor-line{stroke:grey;}#mermaid-svg-xEYlCkxiDLAA437w .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-xEYlCkxiDLAA437w .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-xEYlCkxiDLAA437w #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-xEYlCkxiDLAA437w .sequenceNumber{fill:white;}#mermaid-svg-xEYlCkxiDLAA437w #sequencenumber{fill:#333;}#mermaid-svg-xEYlCkxiDLAA437w #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-xEYlCkxiDLAA437w .messageText{fill:#333;stroke:#333;}#mermaid-svg-xEYlCkxiDLAA437w .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xEYlCkxiDLAA437w .labelText,#mermaid-svg-xEYlCkxiDLAA437w .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-xEYlCkxiDLAA437w .loopText,#mermaid-svg-xEYlCkxiDLAA437w .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-xEYlCkxiDLAA437w .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-xEYlCkxiDLAA437w .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-xEYlCkxiDLAA437w .noteText,#mermaid-svg-xEYlCkxiDLAA437w .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-xEYlCkxiDLAA437w .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xEYlCkxiDLAA437w .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xEYlCkxiDLAA437w .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xEYlCkxiDLAA437w .actorPopupMenu{position:absolute;}#mermaid-svg-xEYlCkxiDLAA437w .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-xEYlCkxiDLAA437w .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xEYlCkxiDLAA437w .actor-man circle,#mermaid-svg-xEYlCkxiDLAA437w line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-xEYlCkxiDLAA437w :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}客户端(浏览器)web服务器对应的ServletHTTP协议通过资源路径处理业务之后作出响应客户端(浏览器)web服务器对应的Servlet3.Servlet 生命周期
Servlet 通过调用 init () 方法进行初始化。 Servlet 调用 service() 方法来处理客户端的请求。 Servlet 通过调用 destroy() 方法终止结束。 最后Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
4.ServletConfig
ServletConfig是一个接口是用来存放Servlet的配置信息即在 web.xml 中对当前 Servlet 类的配置信息。 获取servletConfig对象 public void init(ServletConfig config) throws ServletException ServletConfig 中的常用方法
方法名称方法名称 功能说明String getInitParameter(String name)获取指定名称的初始化参数值Enumeration getInitParameterNames()获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类型EnumerationString getServletName()获取当前 Servlet 的的 Servlet 名称ServletContext getServletContext()获取到当前 Servlet 的上下文对象 ServletContext。这是个非常重要的对象。
5.ServletContext
ServletContext是javax.servlet包内定义的接口Web容器会为每个Web程序构造一个实现该接口的对象实例通过这个对象Servlet可以和web容器进行交互。 ServletContext 的获取 ServletContext servletContext servletConfig.getServletContext() ServletContext 中的常用方法
方法名称方法名称 功能说明String getInitParameter(String name)获取name名称的初始化参数的值Enumeration getInitParameterNames()获取所有初始化参数的名称返回的结果是一个枚举值void setAttribute(String name,Object object)设置属性值Enumeration getAttributeNames()获取所有属性值名称String getRealPath(String path)返回包含给定的虚拟路径的真实路径的字符串String getContextPath()获取当前应用在web容器中的名称
6.的配置
url-pattern标签用于对请求进行筛选匹配根据请求找到对应的servlet。 精确路径配置 servlet servlet-namesnoop/servlet-name servlet-classSnoopServlet/servlet-class /servlet servlet-mapping servlet-namesnoop/servlet-name url-pattern/test/snoop/url-pattern /servlet-mapping 通配符路径配置 servlet servlet-namesnoop/servlet-name servlet-classSnoopServlet/servlet-class /servlet servlet-mapping servlet-namesnoop/servlet-name url-pattern/*/snoop/url-pattern /servlet-mapping 全路径配置 servlet servlet-namesnoop/servlet-name servlet-classSnoopServlet/servlet-class /servlet servlet-mapping servlet-namesnoop/servlet-name url-pattern/*/url-pattern /servlet-mapping 后缀名配置 servlet servlet-namesnoop/servlet-name servlet-classSnoopServlet/servlet-class /servlet servlet-mapping servlet-namesnoop/servlet-name url-pattern*.jsp/url-pattern /servlet-mapping 注意 1.一个servlet中可以配置多个url-pattern同时生效。 2.带“/”的通配符路径模式和后缀名模式不能同时使用:即不能使用“/xxxx.yy”格式 3.注解配置是在web3.0之后
7.HttpServletRequest
封装了客户端的请求信息 常用方法
方法名称方法名称 功能说明String getRequestURL方法返回客户端发出请求时的完整URLString getRequestURI方法返回请求行中的资源名部分String getHeader(String headerName)获得客户机请求头Enumeration getHeaderNames返回所有请求头中参数名字的字符串对象的枚举变量String getParameter(String paramName)获得请求参数的值Enumeration getParameterNames请求中的参数名字的字符串对象的枚举变量
8.HttpServletRequest
封装了客户端的响应信息 常用方法
方法名称方法名称 功能说明void addCookie(Cookie cookie)增加一个cookie到响应中这个方法可多次调用投置多个cookievoid addHeader(String name, Stringvalue)给定的名字和和数值加到响应的头部void sendRedirect(String location)用指定的重定位URL向客户端发送一个临时重定位响应消息
9.请求/响应中乱码的解决
设置请求信息中字符编码为UTF-8 request.setCharacterEncoding(“utf-8”); 设置响应信息中字符编码为UTF-8 response.setContentType(“text/html;charsetutf-8”); response.setCharacterEncoding(“utf-8”);
10.转发和重定向
转发 把当前的请求转发到另外一个资源在Servlet中使用RequestDispatcher对象的forward方法来转发请求资源
request.getRequestDispatcher(index.html).forward(request, response);RequestDispatcher 是 javax.servlet 包下的一个接口通过 HttpServletRequest 可以获取到RequestDispatcher 的接口对象用于完成请求转发功能。 重定向 把客户的请求跳转到服务器上的另一个资源或者其他服务器上的资源
response.sendRedirect(/index.html);区别 • 重定向将产生两个不同的请求而请求转发则是同一个请求 • 重定向可以定向到任意资源而请求转发则必须转发到同一应用下的其他资源 • 重定向客户的地址栏中显示新的地址而请求转发在转发过程中地址栏不变 • request中数据是否可用转发可用重定向不可用 • 转发在服务器端完成的重定向是在客户端完成的
五.Filter
1.概念
Filter是指过滤器它的基本功能是对 Servlet 容器调用 Servlet (JSP)的过程进行筛选过滤 从而在 Servlet 处理请求前和Servlet 响应请求后实现一些特殊的功能。 Filter 本质是一个实现了特殊接口的 Java 类与 Servlet 类似也是由 Servlet 容器进行调用和执 行的。
2.工作原理
当Web服务器接收到一个请求后将会判断此请求路径是否匹配到一个过滤器配置如果匹配到则服务器会 把请求交给相关联的过滤器处理。在执行Filter的过程中Web服务器会判断是否有另一个关联当前请求的过滤器如果有就交给下个处理通过doFilter调用客户需要访问的Web资源如JSP或Servlet在返回给客户端的过程中首先同样经过关联的过滤器只是顺序与请求到来时相反
#mermaid-svg-4y2M9QHbRRAZJ7n7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .error-icon{fill:#552222;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .marker.cross{stroke:#333333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4y2M9QHbRRAZJ7n7 text.actortspan{fill:black;stroke:none;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .actor-line{stroke:grey;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .sequenceNumber{fill:white;}#mermaid-svg-4y2M9QHbRRAZJ7n7 #sequencenumber{fill:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .messageText{fill:#333;stroke:#333;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .labelText,#mermaid-svg-4y2M9QHbRRAZJ7n7 .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .loopText,#mermaid-svg-4y2M9QHbRRAZJ7n7 .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-4y2M9QHbRRAZJ7n7 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .noteText,#mermaid-svg-4y2M9QHbRRAZJ7n7 .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .actorPopupMenu{position:absolute;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-4y2M9QHbRRAZJ7n7 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4y2M9QHbRRAZJ7n7 .actor-man circle,#mermaid-svg-4y2M9QHbRRAZJ7n7 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-4y2M9QHbRRAZJ7n7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}客户端(浏览器)过滤器对应的Servletrequestrequestresponseresponse客户端(浏览器)过滤器对应的Servlet3.Filter接口中的方法
方法名称方法名称 功能说明init()初始化方法对当前定义的Filter进行初始化。doFilter()Filter的核心方法在这个方法中完成对请求与响应的过滤。destroy()销毁方法Filter被销毁前所调用执行的方法完成对资源的释放。
4.Filter的配置
通过web.xml配置(其顺序按照书写顺序)
filter
filter-nameEncodingFilter/filter-name
filter-classcom.epoint.demo.EncodingFilter/filter-class
/filter
filter-mapping
filter-nameEncodingFilter/filter-name
url-pattern/*/url-pattern
/filter-mapping通过注解配置(其顺序按照字典顺序)
WebFilter(filterName EncodingFilter, urlPatterns
{ /EncodingFilter })5.FilterConfig
FilterConfig 指的是当前 Filter 在 web.xml 中的配置信息 FilterConfig 接口中的方法与 ServletConfig 接口中的类似 常用方法
方法名称方法名称 功能说明String getFilterName()获取当前Filter的名称String getInitParameter(String name)获取当前Filter的初始化参数根据参数名称获取参数值Enumeration getInitParameterNames()获取当前Filter所有初始化参数的名称返回一个枚举类ServletContext getServletContext()获取到当前 Filter的上下文对象 ServletContext。
6.Filter链
若应用中配置了多个 Filter那么这些 Filter 的执行是以“链”的方式执行的. 上一个 Filter.doFilter方法中调用 FilterChain.doFilter 方法将激活下一个 Filter的doFilter 方法最后一个 Filter.doFilter 方法中调用的 FilterChain.doFilter 方法将激活目标 Servlet的service 方法。
7.常见Filter的应用
编码过滤器
// 对请求和响应的过滤Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {request.setCharacterEncoding(UTF-8);response.setContentType(text/html;charsetUTF-8);response.setCharacterEncoding(UTF-8);chain.doFilter(request, response);}权限过滤器
六.cookie和session
1.cookie概念
前置 HTTP 是一种无状态协议这意味着每次客户端检索网页时客户端打开一个单独的连接到 Web 服务器服务器不保留之前客户端请求的任何记录。 Cookie是Web服务器发送到浏览器并且存储在浏览器中的一些文本信息。 Cookie是由服务器生成发送给浏览器浏览器把cookie以键值对的形式保存在浏览器中当下 一次请求同一网站时会把该cookie发送给服务器。
2.Cookie的创建
Java Servlet API包中包含一个类javax.servlet.http.Cookie通过此类可以创建一个Cookie对象。 其构造器为
public Cookie (String name,String value);键值对都必须是String类型 可通过构造器实例化一个新的Cookie对象
Cookie cookienew Cookie(“userName”,”zhangsan”)然后通过HttpServletResponse对象的addCookie方法将Cookie插入到http响应头中
response.addCookie(cookie)3.Cookie的读取
Cookie的获取可以通过调用HttpServletRequest的getCoo kies方法方法返回Cookie对象的数组。 对数组进行循环调用每个cookie的getName方法可以遍历所有的Cookie的值。
public Cookie[] getCookies()
Cookie[] cookies req.getCookies();
for (Cookie c : cookies) {
System.out.println(c.getName() : c.getValue());
}4.Cookie的常用方法
Cookie中提供了以下常用方法用来获取Cookie中的信息
方法名称方法名称 功能说明void setMaxAge(int expiry)设置以秒计的cookie的最大存活时间int getMaxAge()返回cookie的最大存活时间以秒计算在缺省情况下-1表示该cookie将一致持续到浏览器shutdown为止String getName()返回cookie的名称void setValue(String newValue在一个cookie创建之后给其分配一个新的值。String getValue()返回 cookie的取值String getPath()返回服务器上浏览器返回cookie的路径void setPath(String path)设置cookie的访问路径
5.Cookie的分类
会话cookie 如果创建了一个cookie并将他发送到浏览器默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中用户退出浏览器之后被删除。 持久cookie 若希望浏览器将该cookie存储在磁盘上则需要使用maxAge并给出一个以秒为单位的时间。
setMaxAge() 设置值0, 将cookie存储于本地磁盘超过cookie的有效期后将被删除
setMaxAge() 设置值0, 浏览器默认将cookie保存在内存里当浏览器关闭时cookie从内存中释放
这种情况下只要浏览器不关cookie就会一直存在
setMaxAge() 设置值0, 立即删除cookie6.Cookie的限制
• Cookie可以被用户禁止 • Cookie会将状态保存在浏览器端不安全。对于敏感数据需要加密后再使用Cookie来保存 • Cookie只能保存少量的数据大约4Kb左右 • Cookie的个数是有限制的 • Cookie只能保存字符串
7.Session的概念
浏览器对Cookie数量会有限制所以Cookie中无法保存较多信息。 Session是在无状态的HTTP协议下服务端记录用户状态时用于标识具体用户的机制它是在服 务端保存的用来跟踪用户的状态的数据结构。 Session的作用就是在服务器端保存一些用户的数据然后传递给用户一个名字为JSESSIONID 的Cookie这个JESSIONID对应这个服务器中的一个Session对象通过它就可以获取到保存用户信 息的Session。 Session机制也是依赖于Cookie来实现的。
8.HttpSession对象的获取
HttpServletRequest接口中 返回关于该请求的当前会话对象 create为true如果没有当前会话的session对象则创建一个新的session有则返回原来的session create为false如果没有当前会话的session对象则返回null有则返回原来的session
public HttpSession getSession(boolean create)public HttpSession getSession()
//相当于getSession(boolean true)的情况9.设置Session的有效时间
1.tomcat服务器的conf/web.xml文件配置session的超时时间单位为分钟
session-configsession-timeout30session-timeout
/session-config2.在当前的web应用的web.xml文件中配置session的超时时间会覆盖tomcat服务器的web.xml文件中的配置单位为分钟 3.在servlet/jsp代码中配置单位为秒
session.setMaxInactiveInterval(120)10.session的常用方法
方法名称方法名称 功能说明void setAttribute(String name, Objectvalue)用指定的名字将一个对象绑定到一个会话Object getAttribute(String name)返回在本会话中绑定了指定名字的对象当没有所要求的对象时返回一个空值Enumeration getAttributeNames()返回一个包含所有的绑定到会话的 对象名称的字符串对象的集合String getId()返回一个包含分配给会话的唯一的标示符的字符串。int getMaxInactiveInterval()返回servlet容器将在两个客户端访问之间保持会话开放的间隔的最大时间以秒计时void removeAttribute(String name)从会话中删除绑定到指定名字的对象。void setMaxInactiveInterval(int interval)指定在客户端请求消息之间servlet容器将该会话设为无效之前的以秒计的时间
11.HttpSession对象的销毁时机
1、直接调用HttpSession中的invalidate()方法 2、超出了session的最大有效时间 3、服务器卸载了当前的WEB应用
12.cookie禁用时session失效的问题
通过URL重写 使用url重写的形式来跟踪到session对象把session id附加在URL路径的后面。 将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。
public java.lang.String encodeURL(java.lang.String url)七.AJAX
1.概念
AJAX Asynchronous JavaScript And XML是指异步的JavaScript和XML局部刷新页面。
2.工作原理
XMLHttpRequest 对象用于同服务器交换数据
#mermaid-svg-Nc71oB0VZ2GxK5om {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om .error-icon{fill:#552222;}#mermaid-svg-Nc71oB0VZ2GxK5om .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Nc71oB0VZ2GxK5om .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Nc71oB0VZ2GxK5om .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Nc71oB0VZ2GxK5om .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Nc71oB0VZ2GxK5om .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Nc71oB0VZ2GxK5om .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Nc71oB0VZ2GxK5om .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Nc71oB0VZ2GxK5om .marker.cross{stroke:#333333;}#mermaid-svg-Nc71oB0VZ2GxK5om svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Nc71oB0VZ2GxK5om .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Nc71oB0VZ2GxK5om text.actortspan{fill:black;stroke:none;}#mermaid-svg-Nc71oB0VZ2GxK5om .actor-line{stroke:grey;}#mermaid-svg-Nc71oB0VZ2GxK5om .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om .sequenceNumber{fill:white;}#mermaid-svg-Nc71oB0VZ2GxK5om #sequencenumber{fill:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om .messageText{fill:#333;stroke:#333;}#mermaid-svg-Nc71oB0VZ2GxK5om .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Nc71oB0VZ2GxK5om .labelText,#mermaid-svg-Nc71oB0VZ2GxK5om .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-Nc71oB0VZ2GxK5om .loopText,#mermaid-svg-Nc71oB0VZ2GxK5om .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-Nc71oB0VZ2GxK5om .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Nc71oB0VZ2GxK5om .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Nc71oB0VZ2GxK5om .noteText,#mermaid-svg-Nc71oB0VZ2GxK5om .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-Nc71oB0VZ2GxK5om .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Nc71oB0VZ2GxK5om .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Nc71oB0VZ2GxK5om .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Nc71oB0VZ2GxK5om .actorPopupMenu{position:absolute;}#mermaid-svg-Nc71oB0VZ2GxK5om .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Nc71oB0VZ2GxK5om .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Nc71oB0VZ2GxK5om .actor-man circle,#mermaid-svg-Nc71oB0VZ2GxK5om line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Nc71oB0VZ2GxK5om :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}浏览器服务器发生某个事件创建XMLHttpRequest 对象并发送HttpRequest请求处理HttpRequest请求并返回数据 浏览器更新数据浏览器服务器3.XMLHttpRequest 对象
获取 XMLHttpRequest 对象
function getXHR(){
var xhr;
if (window.XMLHttpRequest) {
//检查浏览器的XMLHttpRequest属性如果为真则支持XMLHttpRequest
// IE7, Firefox, Chrome, Opera, Safari 浏览器支持XMLHttpRequest
xhr new XMLHttpRequest();
} else {
// IE6, IE5 浏览器使用ActiveXObject
xhr new ActiveXObject(Microsoft.XMLHTTP);
}
}4.jQuery ajax
通过 jQuery AJAX 方法我们能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、 XML 或 JSON - 同时还能够把这些外部数据直接载入网页的被选元素中。
function onButtonClick(){
var info { username: lisi,age: 25 }; //请求参数
$.ajax({
type: POST, //请求方式
url: /Cookie/TestAjax, //请求地址
data: info, //向服务器提交的数据
success: function (result) { //请求成功
console.log(result);
},
error: function (e) { //请求失败包含具体的错误信息
console.log(e.status);
}
});
}5.同步和异步
同步可以理解为在执行完一个函数或方法之后一直等待系统返回值或消息这时程序是出于阻塞的只有接收到返回的值或消息后才往下执行其他的命令。 异步执行完函数或方法后不必阻塞性地等待返回值或消息只需要向系统委托一个异步过程那么当系统接收到返回值或消息时系统会自动触发委托的异步过程从而完成一个完整的流程。
6.jQuery ajax 的常用参数
参数名称类型、说明typeString 请求方式 (“POST” 或 “GET”) 默认为 “GET”asyncBoolean 默认值: true。默认设置下所有请求均为异步请求。如果需要发送同步请求请将此选项设置为 false。cacheBoolean 默认值: truedataType 为 script 和 jsonp 时默认为 false。设置为 false 将不缓存此页面。contentType String 默认值: “application/x-www-form-urlencoded”。发送信息至服务器时内容编码类型。contextObject 这个对象用于设置 Ajax 相关回调函数的上下文dataString 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在URL 后。dataTypeString 预期服务器返回的数据类型errorFunction 默认值: 自动判断 (xml 或 html)。请求失败时调用此函数successFunction 请求成功后的回调函数。url String 当前页地址。发送请求的地址urlString 当前页地址。发送请求的地址
八.JSON
1.概念
• JSON 指的是 JavaScript 对象表示法JavaScript Object Notation • JSON 是轻量级的文本数据交换格式在服务器浏览器之间传输并用作跨语言的数据格式。
2.JSON的值
对象 数组
{employee:{ name:Bill Gates, age:62, city:Seattle }
}数组
{employees:[ Bill, Steve, David ]
}JSON 的值不可以是以下数据类型之一 函数、日期、undefined
3.JavaScript中JSON的解析
JSON字符串转换为JSON对象
var obj JSON.parse(JSON字符串);JSON对象转JSON字符串
var str JSON.stringify(JSON对象);字符串到JSON对象 JSON 中不允许日期对象如果您需要包含日期需要写为字符串之后再将其转换为日期对象
var student { name:zhangsan,birthday:1995-11-28};
var obj JSON.parse(student);
obj.birthday new Date(obj.birthday);JSON对象到字符串
var student { name:zhangsan,age:18};
var json JSON.stringify(student);
console.log(json);遍历 for[i] 套娃就行。
4.fastjson
Fastjson 是一个 Java 库可以将 Java 对象转换为 JSON 格式当然它也可以将 JSON 字符串转换 为 Java 对象。 依赖 dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.47/version/dependency5.使用fastjson解析
将JSON字符串转换为实体类的对象
String json { \name\:\zhangsan\
, \age\:25, \birthday\:\1995-09-09\};
Student student JSON.parseObject(json,Student.class);将Java实体类对象转换为JSON格式
Student stu new Student(lisi,15,new Date());
String stuJsonString JSON.toJSONStringWithDateFormat(stu,yyyy年MM月dd日);九.文件的上传和下载
1. 文件上传
当表单需要上传文件时需指定表单 enctype 的值为 multipart/form-data。 所需要的jar包
dependency
groupIdcommonsfileupload/groupId
artifactIdcommonsfileupload/artifactId
version1.3.1/version
/dependency
dependency
groupIdcommons-io/groupId
artifactIdcommons-io/artifactId
version2.4/version
/dependency代码
package com.epoint.test;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** Servlet implementation class UploadServlet*/
WebServlet(/uploadservlet)
public class UploadServlet extends HttpServlet {private static final long serialVersionUID 1L;/*** see HttpServlet#HttpServlet()*/public UploadServlet() {super();// TODO Auto-generated constructor stub}/*** see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse* response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}/*** see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse* response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubrequest.setCharacterEncoding(utf-8);response.setContentType(text/html;charset-utf-8);response.setCharacterEncoding(utf-8);// TODO Auto-generated method stub// Create a factory for disk-based file items 创建DiskFileItemFactory 工厂DiskFileItemFactory factory new DiskFileItemFactory();//Set factory constraints 设置factory的约束 // 设置内存中最多可以存放的上传文件的大小, 若超出则把文件写到一个临时文件夹中factory.setSizeThreshold(1024 * 1024 * 10);// 设置临时文件存放位置File file new File(E:/xd);factory.setRepository(file);// 创建一个ServletFileUpload上传工具 ServletFileUpload upload new ServletFileUpload(factory);// 设置上传文件的总大小 单位 bupload.setSizeMax(1024 * 1024 * 5);// 解析requset对象 并把表单中的每一个输入项包装成fileItem对象try {java.util.ListFileItem items upload.parseRequest(request);for (FileItem fileItem : items) {// 判断是form表单域 还是文件file域if (fileItem.isFormField()) {String fieldName fileItem.getFieldName();String string fileItem.getString();System.out.println(fieldName string);} else {
// 文件file域
// 文件名字String fileName fileItem.getName();
// 文件类型String contentType fileItem.getContentType();
// 文件大小long size fileItem.getSize();InputStream in fileItem.getInputStream();byte[] buffer new byte[1024];int len 0;
// 文件存放地址
// 有缺陷 有的浏览器读取的名字式 路径名字需要处理fileName E:/epoint/ fileName;OutputStream out new FileOutputStream(fileName);while ((len in.read(buffer)) ! -1) {out.write(buffer, 0, len);}out.close();in.close();response.getWriter().write(上传成功);}}} catch (FileUploadException e) {// TODO Auto-generated catch blockresponse.getWriter().write(超出指定文件大小);}}}
2. 文件下载
设置ContentType响应头 response.setContentType(“application/x-msdownload;”); 2.设置文档类型这样浏览器就会提示下载而不是打开该文件. 2. 设置Content-disposition响应头 response.setHeader(“Content-disposition” , “attachment; filenameabc.txt”); 3.具体的文件可以调用response.getOutputStream的方式以io流的方式发送给客户端 代码
package com.epoint.test;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class DownloadServlet*/
WebServlet(/DownloadServlet)
public class DownloadServlet extends HttpServlet {private static final long serialVersionUID 1L;/*** see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse* response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stub
// 1.设置ContentType响应头 设置文档类型这样浏览器就会提示下载而不是打开该文件.response.setContentType(application/x-msdownload);String fileName 测试下载.txt;
// 2. 设置Content-disposition响应头 response.setHeader(Content-disposition, attachment; filename URLEncoder.encode(fileName, utf-8));
// 3.具体的文件可以调用response.getOutputStream的方式以io流的方式发送给客户端OutputStream out response.getOutputStream();String downFilePath E:\\xd\\workspace\\File\\src\\main\\webapp\\abc.txt;InputStream in new FileInputStream(downFilePath);byte[] buffer new byte[1024];int len 0;while ((len in.read(buffer)) ! -1) {out.write(buffer, 0, len);}
// 不能多次responsein.close();System.out.println(下载成功);}/*** see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse* response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}
十.Log4j
1.概念
测试时System.out并不方便比如 • 项目完成后可能需要删除这些输出代码 • 输出的信息格式不好控制 • 信息不能写到文件中 Log4J全称log for java是专门用于java语言的日志记录工具。 我们可以控制每一条日志的输出格式通过定义日志的输出级别可以更灵活的控制日志的输出过 程方便项目的调试。 我们可以控制每一条日志的输出格式通过定义日志的输出级别可以更灵活的控制日志的输出过 程方便项目的调试
2.Log4j的组成
Appenders输出端Appenders 指定日志的输出方式输出到控制台、文件等 Layout日志格式化器Layout 控制日志信息的输出格式 Loggers (日志记录器)Loggers 控制日志的输出级别与日志是否输出
3.Appender输出端
Appender 用来指定日志输出到哪个地方可以同时指定日志的输出目的地。 Log4j 常用的输出目的地有以下几种
输出端类型作用ConsoleAppender将日志输出到控制台FileAppender将日志输出到文件中DailyRollingFileAppender将日志输出到一个日志文件并且每天输出到一个新的文件RollingFileAppender将日志信息输出到一个日志文件并且指定文件的尺寸当文件大 小达到指定尺寸时会自动把文件改名同时产生一个新的文件JDBCAppender把日志信息保存到数据库中
4.Layout日志格式化器
Log4j 常用的日志格式化类型包括以下几种
格式化器类型作用HTMLLayout格式化日志输出为HTML表格形式SimpleLayout简单的日志输出格式化打印的日志格式为info - messagePatternLayout最强大的格式化器可以根据自定义格式输出日志如果没有指定转换格式就是用默认的转换格式
格式化日志信息的常用参数
常用参数作用%m输出代码中指定的消息%p输出优先级即DEBUGINFOWARNERRORFATAL%r输出自应用启动到输出该log信息耗费的毫秒数%c输出所属的类目通常就是所在类的全名%t输出产生该日志事件的线程名%n输出一个回车换行符Windows平台为“\r\n”Unix平台为“\n”%d输出日志时间点的日期或时间默认格式为ISO8601也可以在其后指定格式比如%d{yyyMMM dd HH:mm:ss , SSS}输出类似2002年10月18日 22 10 28 921%l输出日志事件的发生位置包括类目名、发生的线程以及在代码中的行数。
5.Logger记录器
level表示日志记录的优先级Log4j建议使用四个级别优先级从高到低分别是ERROR、WARN、 INFO、DEBUG。 一般只使用4个级别优先级从高到低为 ERROR WARN INFO DEBUG OFF 最高日志级别关闭日志 FATAL 将会导致应用程序退出的错误 ERROR 发生错误事件但仍不影响系统的继续运行 WARN 警告即潜在的错误情形