JavaWeb复习

JavaWeb复习

    • 一.概述
      • 1.概念
      • 2.B/S和C/S 架构
    • 二.HTTP通信协议概述
      • 1.概念
      • 2.HTTP1.0 与 HTTP1.1 版本
      • 3.HTTP 协议组成
      • 4.常见状态码
      • 5.GET 与 POST 请求方式
    • 三.Tomcat
      • 1.Web服务器介绍
      • 2.安装(Windows)
      • 3.Tomcat目录结构
      • 4.server.xml部分配置解释
    • 四.Servlet
      • 1.概念
      • 2.工作原理
      • 3.Servlet 生命周期
      • 4.ServletConfig
      • 5.ServletContext
      • 6.的配置
      • 7.HttpServletRequest
      • 8.HttpServletRequest
      • 9.请求/响应中乱码的解决
      • 10.转发和重定向
    • 五.Filter
      • 1.概念
      • 2.工作原理
      • 3.Filter接口中的方法
      • 4.Filter的配置
      • 5.FilterConfig
      • 6.Filter链
      • 7.常见Filter的应用
    • 六.cookie和session
      • 1.cookie概念
      • 2.Cookie的创建
      • 3.Cookie的读取
      • 4.Cookie的常用方法
      • 5.Cookie的分类
      • 6.Cookie的限制
      • 7.Session的概念
      • 8.HttpSession对象的获取
      • 9.设置Session的有效时间
      • 10.session的常用方法
      • 11.HttpSession对象的销毁时机
      • 12.cookie禁用时session失效的问题
    • 七.AJAX
      • 1.概念:
      • 2.工作原理
      • 3.XMLHttpRequest 对象
      • 4.jQuery ajax
      • 5.同步和异步
      • 6.jQuery ajax 的常用参数
    • 八.JSON
      • 1.概念
      • 2.JSON的值
      • 3.JavaScript中JSON的解析
      • 4.fastjson
      • 5.使用fastjson解析
    • 九.文件的上传和下载
      • 1. 文件上传
      • 2. 文件下载
    • 十.Log4j
      • 1.概念
      • 2.Log4j的组成
      • 3.Appender(输出端)
      • 4.Layout(日志格式化器)
      • 5.Logger(记录器)

一.概述

1.概念

Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。
它可以在各种供应商提供的实现Servlet规范的 Servlet容器中运行。
Web客户端的主要任务是展现信息内容
Web服务器端主要是响应客户的请求

浏览器 web服务器 服务端程序 数据库 HTTP协议 Servlet JDBC 浏览器 web服务器 服务端程序 数据库

2.B/S和C/S 架构

B/S,Browser/Server,浏览器/服务器。主要通过浏览器发送请求来和服务器进行数据交互
C/S,Client/Server,客户端/服务器。客户端需要安装针对某一具体业务专门开发的软件。
B/S模式的优缺点:
B/S优势:开发成本低;管理维护简单;产品升级便利;用户使用方便;
B/S 缺点:安全性不足;客户端不能随心变化,受浏览器的限制
C/S 架构的优缺点:
C/S优势:界面和操很丰富;安全性能高;响应速度较快;
C/S 缺点: 适用面窄;用户群固定;维护成本高

二.HTTP通信协议概述

1.概念

HTTP,Hyper 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服务器:
①Tomcat(Apache):
当前应用最广的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目录结构

JavaWeb复习_第1张图片

4.server.xml部分配置解释

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" 	
			     xmlNamespaceAware="false">
Context 虚拟目录 docBase 真实访问地址 path访问路径 appBase资源路径 unpackWARs="true"自动解压war包
	<Context path="/mule" docBase="/var/www/webapp/Mule"
				workDir="/var/www/webtemp/Mule" debug="5" reloadable="false"
				crossContext="true" />

四.Servlet

1.概念

Java Servlet 是运行在 Web 服务器或应用服务器上的java程序,Servlet从web客户端接收服务请求并给出响应,通常是通过http协议来实现,它是作为客户端请求和服务器应用程序之间的中间层。

2.工作原理

客户端(浏览器) web服务器 对应的Servlet HTTP协议 通过资源路径 处理业务之后 作出响应 客户端(浏览器) web服务器 对应的Servlet

3.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-name>snoop</servlet-name>    
      <servlet-class>SnoopServlet</servlet-class>    
   </servlet>    
   <servlet-mapping>    
      <servlet-name>snoop</servlet-name>    
      <url-pattern>/test/snoop</url-pattern>    
   </servlet-mapping>    

通配符路径配置

   <servlet>    
      <servlet-name>snoop</servlet-name>    
      <servlet-class>SnoopServlet</servlet-class>    
   </servlet>    
   <servlet-mapping>    
      <servlet-name>snoop</servlet-name>    
      <url-pattern>/*/snoop    
       

全路径配置

   <servlet>    
      <servlet-name>snoop</servlet-name>    
      <servlet-class>SnoopServlet</servlet-class>    
   </servlet>    
   <servlet-mapping>    
      <servlet-name>snoop</servlet-name>    
      <url-pattern>/*    
       

后缀名配置

   <servlet>    
      <servlet-name>snoop</servlet-name>    
      <servlet-class>SnoopServlet</servlet-class>    
   </servlet>    
   <servlet-mapping>    
      <servlet-name>snoop</servlet-name>    
      <url-pattern>*.jsp</url-pattern>    
   </servlet-mapping>    

注意
1.一个servlet中可以配置多个url-pattern,同时生效。
2.带“/”的通配符路径模式和后缀名模式不能同时使用:即不能使用“/xxxx.yy”格式
3.注解配置是在web3.0之后

7.HttpServletRequest

封装了客户端的请求信息
常用方法:

方法名称 方法名称 功能说明
String getRequestURL 方法返回客户端发出请求时的完整URL
String getRequestURI 方法返回请求行中的资源名部分
String getHeader(String headerName) 获得客户机请求头
Enumeration getHeaderNames 返回所有请求头中参数名字的字符串对象的枚举变量
String getParameter(String paramName) 获得请求参数的值
Enumeration getParameterNames 请求中的参数名字的字符串对象的枚举变量

8.HttpServletRequest

封装了客户端的响应信息
常用方法:

方法名称 方法名称 功能说明
void addCookie(Cookie cookie) 增加一个cookie到响应中,这个方法可多次调用,投置多个cookie
void addHeader(String name, Stringvalue) 给定的名字和和数值加到响应的头部
void sendRedirect(String location) 用指定的重定位URL向客户端发送一个临时重定位响应消息

9.请求/响应中乱码的解决

设置请求信息中字符编码为UTF-8:
request.setCharacterEncoding(“utf-8”);
设置响应信息中字符编码为UTF-8:
response.setContentType(“text/html;charset=utf-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.工作原理

  1. 当Web服务器接收到一个请求后,将会判断此请求路径是否匹配到一个过滤器配置,如果匹配到,则服务器会
    把请求交给相关联的过滤器处理。
  2. 在执行Filter的过程中,Web服务器会判断是否有另一个关联当前请求的过滤器,如果有就交给下个处理
  3. 通过doFilter,调用客户需要访问的Web资源,如JSP或Servlet
  4. 在返回给客户端的过程中,首先同样经过关联的过滤器,只是顺序与请求到来时相反
客户端(浏览器) 过滤器 对应的Servlet request request response response 客户端(浏览器) 过滤器 对应的Servlet

3.Filter接口中的方法

方法名称 方法名称 功能说明
init() 初始化方法,对当前定义的Filter进行初始化。
doFilter() Filter的核心方法,在这个方法中完成对请求与响应的过滤。
destroy() 销毁方法,Filter被销毁前所调用执行的方法,完成对资源的释放。

4.Filter的配置

通过web.xml配置(其顺序按照书写顺序)

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.epoint.demo.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*

通过注解配置(其顺序按照字典顺序)

@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的应用

编码过滤器

// 对请求和响应的过滤
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-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 cookie=new 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, 立即删除cookie

6.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-config>
	<session-timeout>30<session-timeout>
</session-config>

2.在当前的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 对象用于同服务器交换数据

浏览器 服务器 发生某个事件创建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 的常用参数

参数名称 类型、说明
type String 请求方式 (“POST” 或 “GET”), 默认为 “GET”
async Boolean 默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。
cache Boolean 默认值: true,dataType 为 script 和 jsonp 时默认为 false。设置为 false 将不缓存此页面。
content Type String 默认值: “application/x-www-form-urlencoded”。发送信息至服务器时内容编码类型。
context Object 这个对象用于设置 Ajax 相关回调函数的上下文
data String 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在URL 后。
dataType String 预期服务器返回的数据类型
error Function 默认值: 自动判断 (xml 或 html)。请求失败时调用此函数
success Function 请求成功后的回调函数。url String 当前页地址。发送请求的地址
url String 当前页地址。发送请求的地址

八.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 对象。
依赖

	<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.47</version>
		</dependency>

5.使用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>
<groupId>commonsfileupload</groupId>
<artifactId>commonsfileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.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 stub
		request.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);

		// 设置上传文件的总大小 单位 b
		upload.setSizeMax(1024 * 1024 * 5);

		// 解析requset对象 并把表单中的每一个输入项包装成fileItem对象
		try {
			java.util.List<FileItem> 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 block
			response.getWriter().write("超出指定文件大小");
		}

	}

}


2. 文件下载

  1. 设置ContentType响应头
    response.setContentType(“application/x-msdownload;”);
    2.设置文档类型,这样浏览器就会提示下载,而不是打开该文件. 2. 设置Content-disposition响应头
    response.setHeader(“Content-disposition”
    ,
    “attachment; filename=abc.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);
		}
//		不能多次response
		in.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 - message)
PatternLayout 最强大的格式化器,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式

格式化日志信息的常用参数:

常用参数 作用
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%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 警告,即潜在的错误情形

你可能感兴趣的:(JavaWeb,servlet,服务器,java)