当前位置: 首页 > news >正文

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.<url-pattern/>的配置
      • 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协议ServletJDBC浏览器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目录结构

在这里插入图片描述

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服务器对应的ServletHTTP协议通过资源路径处理业务之后作出响应客户端(浏览器)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</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>/*</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>*.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. 在返回给客户端的过程中,首先同样经过关联的过滤器,只是顺序与请求到来时相反
客户端(浏览器)过滤器对应的Servletrequestrequestresponseresponse客户端(浏览器)过滤器对应的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>/*</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;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 的常用参数

参数名称类型、说明
typeString 请求方式 (“POST” 或 “GET”), 默认为 “GET”
asyncBoolean 默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。
cacheBoolean 默认值: true,dataType 为 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 对象。
依赖

	<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 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.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 blockresponse.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);}
//		不能多次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 - 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复习

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…...

P14 PyTorch AutoGrad

前言&#xff1a;激活函数与loss的梯度PyTorch 提供了Auto Grad 功能&#xff0c;这里系统讲解一下torch.autograd.grad系统的工作原理&#xff0c;了解graph 结构目录&#xff1a;1: require_grad False2: require_grad True3&#xff1a; 多层bakcward 原理4&#xff1a; in…...

前端报表如何实现无预览打印解决方案或静默打印

在前端开发中&#xff0c;除了将数据呈现后&#xff0c;我们往往需要为用户提供&#xff0c;打印&#xff0c;导出等能力&#xff0c;导出是为了存档或是二次分析&#xff0c;而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑&#xff0c; 而前端打印可…...

Operating System Course 2 - My OS

Computer Startup process上一篇&#xff1a;http://t.csdn.cn/XfUKt 讲到这个启动设备的第一个扇区&#xff1a;引导扇区。那么引导扇区的代码长什么样子&#xff1f;这里得看引导扇区代码源文件bootsect.s&#xff08;.s后缀文件为用汇编语言编写的源代码文件&#xff09;。另…...

离散数学 课时一 命题逻辑的基本概念

1 命题 1、命题&#xff1a;可以判断其真值的陈述句 2、真值&#xff1a;真或者假(1或者0) 3、真命题&#xff1a;真值为真的命题 4、假命题&#xff1a;真值为假的命题 5、原子命题&#xff1a;不可以再被分解成更简单的命题 6、复合命题&#xff1a;由原子命题通过联结词联结…...

Word文档带有权限密码怎么办?

Word文档的权限密码指的是什么&#xff1f;其实这是Word文档的保护方法之一&#xff0c;具体指Word文档的编辑、修改受到了限制&#xff0c;需要输入密码才能进行。 设置了权限密码的Word文档还是可以直接打开&#xff0c;只有当需要编辑或者修改内容的时候&#xff0c;才会发…...

C++多态

1. 多态的概念1.1 概念多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b…...

访问学者如何申请美国J1签证?

一、申请美国J1签证的步骤&#xff1a; 第一步&#xff1a;填写I901表。 填写I901表会收取SERVIS费用180美元&#xff0c;可以用VISA/Master卡直接网上支付。填完后打印收据单或者存成PDF后续再打印&#xff0c;记下I901收据编号。 第二步&#xff1a;DS-160表填写。 填写DS-…...

使用gitlab ci/cd来发布一个.net 项目

gitlab runner的安装和基本使用:https://bear-coding.blog.csdn.net/article/details/120591711安装并给项目配置完gitlab runner后再操作后面步骤。实现目标&#xff1a;master分支代码有变更的时候自动构建build。当开发人员在gitlab上给项目打一个tag标签分支的时候自动触发…...

笔试题-2023-蔚来-数字芯片设计【纯净题目版】

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.24应聘岗位:校招-芯片逻辑综合工程师-智能硬件笔试时长:90min笔试平台:nowcoder牛客网题目类型:不定项选择题(15道)、填空题…...

ThreadLocal 详解

ThreadLocal简介JDK源码对ThreadLocal类的注释如下&#xff1a;ThreadLocal提供线程局部变量&#xff0c;使得每个线程都有自己的、独立初始化的变量副本ThreadLocal实例通常是类中的private static字段&#xff0c;用于将状态与线程相关联&#xff0c;如用户ID、事务ID只要线程…...

【Java 面试合集】重写以及重载有什么区别能简单说说嘛

重写以及重载有什么区别能简单说说嘛 前述 这是一道非常基础的面试题&#xff0c;我们在回答的过程中一定要逐一横向比较。 从方法的 修饰符&#xff0c;返回值&#xff0c;方法名&#xff0c;含义&#xff0c;参数等方面进行逐一分析来比较不同。 话不多话&#xff0c;看下…...

到底什么是股票委托接口?

在量化股票市场上&#xff0c;常见的股票委托接口其实有着不一样的交集&#xff0c;就拿股票交易接口&#xff0c;在量化股票跟程序化交易中&#xff0c;有共同之处就是在于直接委托执行下单&#xff0c;并且能很快的就能够将策略输出在账户持仓数据中&#xff0c;继续缓存下来…...

Linux驱动:VPU

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 概述 VPU 是用来进行图像、视频数据进行硬件编、解码的硬件模块。内部集成了 Encoder、Decoder 功能部件进行图像、视频数据进行硬件编、解码&a…...

简介Servlet

目录 一、maven中心库 二、简介Servlet 三、实现Servlet动态页面 1、创建一个maven项目 2、引入依赖 3、创建目录结构 4、编写Servlet代码 5、打包 6、部署 7、验证程序 四、Servlet的运行原理 五、Tomcat伪代码 1、Tomcat初始化 a、让Tomcat先从指定的目录…...

Learning C++ No.7

引言&#xff1a; 北京时间&#xff1a;20223/2/9/22:20&#xff0c;距离大一下学期开学还有2天&#xff0c;昨天收到好消息&#xff0c;开学不要考试了&#xff0c;我并不是害怕考试&#xff0c;考试在我心里&#xff0c;地位不高&#xff0c;可能只有当我挂了&#xff0c;才能…...

【MyBatis】第八篇:一级,二级缓存

其实缓存字面的意思就是将一些内容缓存下来&#xff0c;等下次使用的时候可以直接调用&#xff0c;通过数据库得到数据&#xff0c;有时候会使用相同的数据&#xff0c;所以mybatis自然也支持缓存。 而mybatis按照缓存的效果可以分两大类&#xff1a;一级缓存和二级缓存。 一…...

【大唐杯备考】——5G基站开通与调测(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G基站开通与调测。 目录&#x1f552; 1. 概述&#x1f552; 2. 5G基站开通与调测基础&#x1f558; 2.1 3.5GHz单模100MHz配置&#xff08;S111&#xff09;&#x1f558; 2.2 3.5GHz单模100MHz配置&#xff08;S111111&#xff09;&a…...

redhat7 忘记root密码,重置办法

来自https://www.tracymc.cn/archives/802 亲测可用&#xff0c;太感谢了&#xff0c;在此记录一下&#xff0c;原文有图 1.启动的时候,在有启动项界面,相应启动项内核名称上按“e”; 2.进入后,找到linux16开头的地方,按“end”键或者controle到最后,输入rd.break,再按ctrlx进…...

QML- 对象属性

QML- 对象属性一、概述二、id 属性三、Property 属性1. 定义属性1. 自定义属性定义中的有效类型2. 为属性属性赋值1. 初始化时的值赋值2. 命令式赋值3. 静态值和绑定表达式值4. 类型安全5. 特殊属性类型1. 对象列表属性2. 分组属性6. 属性别名1. 属性别名的注意事项2. 属性别名…...

将.js文件转成vue标签结构的样式

例如&#xff1a;下图所示&#xff1a; 依次识别获取.js文件中的tag和props&#xff0c;可以理解为字符串拼接&#xff0c;将整个vue的标签结构看作是一个字符串。 话不多说&#xff0c;先放上完整代码&#xff0c;思路看代码备注。&#xff08;自己实现的时候&#xff0c;可以…...

前端知识点复盘

组件和jsx <body><div id"root"></div><script type"text/babel">const root ReactDOM.createRoot(document.getElementById("root"))class App extends React.Component {render() {return (<div> <h1>s…...

前端JavaScript获取图片文件的真实格式

常见方式判断图片格式 当我们进行前端开发&#xff0c;需要处理图片上传功能&#xff0c;针对图片格式做判断时&#xff0c;常规的方法都是使用文件后缀名来判断&#xff0c;如下代码所示&#xff1a; input.addEventListener(change, (e) > {const file e.target.files[…...

今天面了一个来华为要求月薪25K,明显感觉他背了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

11 Advanced CNN

文章目录GoogLeNetInception Module1x1 Conv计算效果代码实现总结ResNet (残差网络)问题引入梯度消失与传统神经网络的比较代码实现课程来源&#xff1a; 链接对于前篇中所提到问题&#xff0c;设计出的是一种类似于LeNet5的线性结构&#xff0c;而对于大多数问题&#xff0c;简…...

亿级高并发电商项目---万达商城项目搭建(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

UML术语标准和分类

一、UML术语标准 1&#xff0e;中文UML术语标准 中国软件行业协会&#xff08;CSIA&#xff09;与日本UML建模推进协会&#xff08;UMTP&#xff09;共同在中国推动的UML专家认证&#xff0c;两个协会共同颁发认证证书、两国互认&#xff0c;CSIA与UMTP共同推出了UML中文术语…...

LeetCode 刷题系列 -- 151. 反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格或…...

二十二、Gtk4-ListView

GTK 4添加了新的列表对象GtkListView、GtkGridView和GtkColumnView。这个新特性在Gtk API参考—列表小构件概述中有描述。 GTK 4还有其他实现列表的方法。它们是GtkListBox和GtkTreeView&#xff0c;它们是从GTK 3接管的。在Gtk开发博客中有一篇关于Matthias Clasen所写的列表…...

ASP.NET Core3.1实战教程---基于Jquery单文件上传

这个必须记录一下费劲啊&#xff01;废了我2天的时间&#xff0c;昔日的net快速已经没落....就文件上传都这么费劲。 先说下要求&#xff08;在线apk文件上传实现手机端整包更新&#xff09;&#xff1a; 1、为了简化需求文件上传和数据提交分开执行 2、选完文件后按钮变成上…...

单页网站做淘宝客/什么是指数基金

Android studio开发工具&#xff1a; File -> Invalidate caches / Restart&#xff1b;选择Invalidate and Restart关闭 Android Studio删除 “/home/{username}/.gradle” 文件夹重启android studio...

wordpress点餐主题/百度seo关键词排名优化工具

今天上午&#xff0c;微信出现重大Bug&#xff01; 从其他App分享内容给个人或微信群&#xff0c;均无法正常分享。 此外&#xff0c;图片、文档的发送以及网页版微信登陆也短暂地出现了故障。 持续时间约30分钟&#xff0c;目前各项功能已全部恢复&#xff0c;相关帐号信息…...

普通网站建设是什么/惠州疫情最新情况

/* 输入一堆数&#xff0c;如果是两个数并且个数相同就输出yes和这两个数 否则输出no */ #include <bits/stdc.h> using namespace std; const int maxn 1010; int num[maxn] {0}; int a[maxn] {0}; const int inf 0x3f3f3f3f; int main() {int n;int sum 0;int flag…...

做任务领游戏的网站/正规seo多少钱

C:\Users\Administrator 找到.gitconfig 删掉这个...

网络服务商能删除网站/seo兼职接单平台

服务器电源管理系统SPM(Server Power Management)随着信息设备的进一步集中&#xff0c;更多的数据中心被建立。新一代数据中心对供电系统的可靠性及可管理性要求越来越高。IT用户需要对信息设备的供电系统进行更可靠与更灵活的配电、更精细化的管理、更准确的成本消耗等。艾默…...

政府网站建设专题的目的/免费发外链

上一期我对BBR进行修改的目标很简单&#xff0c;就是提高算法的RTT公平性&#xff0c;主要修改点有3个&#xff1a; 固定增益系数改为了RTT的减函数。RTT相关的steady phase改为了固定时间。探测到带宽腾出时&#xff0c;马上进行up probe。 详情参见&#xff1a; https://zh…...