JavaWeb

HTTP协议

HTTP协议是超文本协议的缩写,是TCP/I平协议的一个应用层协议,用于定义Web浏览器交换数据的过程

HTTP请求

最常用请求方法

POST、GET、HEAD、DELETE

  • 请求行:请求行: 第一行是METHOD URL protocal,如GET http://abc.com HTTP/1.1。
  • 请求头:关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。
    User-Accept:产生请求的浏览器类型
    Accept-Charset(设置UTF-8字符集)、
    Content-Type(Json等配置)等等
  • 请求体: 请求头和请求体中间隔着一行空行作为分界,请求体包含着本次请求携带的内容

状态码

1XX:指示信息
2XX : 成功 表示请求已经被成功接受,理解,接受
3XX : 重定向 – 要完成请求必须进异步操作
4XX : 客户端错误 – 请求有语法错误或请求无法实现
5XX :服务器错误 – 服务器为能实现合法请求

常见状态码
  • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
响应头
  • Content-Type

POST和GET的区别

  • GET用来从服务器上获取资源,而POST用来向服务器提交数据
  • GET将表单中的数据提交到action所指向的URL后面。两者用“?”链接,而各个变量之间使用“&”链接;POST是将表单中的数据放在HTTP协议的请求头或者消息体中,传递到action所指向的URL。
  • GET要收URL长度限制(1024字节);而POST可以传输大量的数据,上传文件通常使用POST方式。

上传文件

前端:设置Content-Typemultipart/form-data,其请求体中每部分内容都会有Content-DispositionContent-Type来指明这部分内容的类型和信息

后端:
使用Spring MVC,则可以在接收请求的方法中接收CommonsMultipartFile,并使用transferTo方法保存到磁盘中

会话跟踪技术

什么是Cookie

当一个与用户相关的数据被频繁访问,就可以针对这个数据做缓存,这样可以大大提高数据的访问性能。Cookie的作用就是这样。

cookie有两种,一种是基于窗口的,浏览器窗口关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置存在的时间。当用户通过浏览器和服务器建立第一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别用户身份。

Cookie可以让服务端程序跟踪每个客户端的访问,但是每次客户端都必须传回这些Cookie,这样来来往往,无形增加了客户端与服务端的数据传输量,

因此有了Seession。Cookie传给服务端一个唯一的ID用来,这个ID的NAME为JESSIONID的一个cookie。

Session的工作流程

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个SessionID,如果已包含则说明以前已经为此客户端创建过session(下面有四种技术),服务器就按照SessionID把这个session检索出来使用(散列表)

如果客户端请求不包含SessionId,则为此客户端创建一个session并且生成一个与此session相关联的SessionId,SessionId的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个SessionId的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把SessionID发送给服务器。

一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

  • URL重写:当服务器程序调用request.getSession();代码时,其会先看request.getCookies()方法中有没有名为JSESSIONID的cookie带过来,如果没有,就看URL有没有被重写(即附带JSESSIONID),如果有,则从服务器中找key为JSESSIONID的session对象,如果都没有,则创建一个新的session。
request.getSession();  //创建session  
        //调用response的encodeURL方法,将自动将JSESSION追加到url后面,如:url;jsessionid=BD111FFC653497E81B702A29B3AC6FE4  
        String buyurl = response.encodeURL("/CookieAndSession/servlet/buy");  
        String payurl = response.encodeURL("/CookieAndSession/servlet/pay");  
  • 隐藏的表单域
<input type="hidden" name="session" value="a1234">

这个隐藏域可以用来存储有关会话的信息,但它的主要缺点是:仅当每个页面都是由表单提交而动态生成时,才能使用这种方法。

这两种方式很难处理跨越多个页面的信息传递,因为如果每次都要修改URL或在页面中添加隐式表单域来存储用户会话相关信息,事情将变得非常麻烦。

  • Cookie
    cookie有两种,一种是基于窗口的,浏览器窗口关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置存在的时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别用户身份。

  • Servlet中的会话跟踪
    HttpSession API,当一个用户第一次访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。

    • 可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,
    • 通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。

与上面三种方式不同的是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存将满时将HttpSession中的对象移到其他存储设备中,但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializable接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。

servlet

什么是Web Service(Web服务)

从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API

什么是Servlet

Servlet是一个Java编写的程序,基于Http协议的在服务端运行,是按照Servlet规范编写的一个Java类

servlet的生命周期

  • init
  • service
  • destory

servlet API的两个主要的包

  • javax.servlet
  • javax.servlet.http

doGet与doPost方法

  • 覆写了参数是Servlet类型的方法
  • 参数是HttpServlet和HttpServletResponse

在servlet中如何获得Session对象,如何获得Cookie对象

  • getSession
  • getCookie

过滤器有哪些用法

  • 对用户请求进行统一认证
  • 对用户的范文请求进行记录和审核
  • 对用户发送的数据过滤或替换
  • 转换图像格式
  • 压缩传输量
  • 揭秘加密

和过滤器相关的接口主要有:Filter、FilterConfig和FilterChain

设计模式:责任链模式

监听器的应用

监听器就是对特定的时间进行监听,当产生这些时间的时候,会执行监听器的代码。
可以对应用的加载、卸载;对Session的初始化,销毁等进行监听

配置加载Spring配置文件并创建IOC容器

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/spring-context*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>com.iwc.shop.modules.sys.listener.WebContextListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>  
    </listener>

servlet里面的异步处理值得是什么?

线程饥饿——因为我们的Servlet线程被阻塞,直到所有的处理完成。如果服务器的请求得到了很多过程,它将达到最大Servlet线程限制和进一步的请求会拒绝连接错误。

我们在处理异步的servlet的时候,自己维护了一个线程池,基本上增加的线程都是来自这个线程池,因为使用了异步的servlet,servlet请求会立即返回servlet池,所以,需要servlet容器分配的sevlet线程的数量基本上没有增加多少,系统消耗的线程的数量下降了,对资源的消耗也会下降

容器特定解决方案的问题在于,在不改变应用程序代码时不能移动到其他Servlet容器。这就是为什么在Servlet3.0提供标准的方式异步处理Servlet的同时增加异步Servlet支持

编解码

首先明确字符集,编解码的标准

URL的编解码

http://localhost:8080/examples/servlet/servlet/君山?author=君山
  • schema:http
  • domain :/localhost
  • port : 8080

URI
- ContextPath : /examples
- ServletPath : /servlet/servlet : url-pattern
- PathInfo : 君山 : 具体的servlet

  • QueryString : author=君山 : 传递的参数

以GET为请求的表单参数都是在request.getParameter方法第一次被调用时候进行的,则个方法会调用parseParameter方法对GET和POST传递的参数进行解码。

QueryString因为是通过HTTP的Header传到服务端的,并且也在URL中,因此与Content-Type定义的charset编码一样。

而PathInfo 与 QueryString的 编码是不同的

对URI以及参数的编码设置:

<Connector URIEncoding="UTF-8" useBodyEncodingFORURI = "true"/>

Header编解码

HTTP Header编解码
这里设计Cookie,redirectPath等存放在Header中的参数的编解码

调用reques.getHeader。这个方法从byte转化成为char使用的默认编码ISO-8859-1,而我们也不能设置Header的其他解码格式
因此,不要在Header中传递非ASCII字符。

POST表单的编解码

通过Http的body传递到服务端。首先将根据Content-Type的charset编码格式对在表单中填入的参数进行编码,然后服务端同样根据Content-Type的charset编码格式解码

我们也可以通过request.setCharacterEncoding()来设置。

针对multipart/form-data类型的参数,也就是上传的文件编码,同样也是Content-Type的charset。值得注意的是,上传文件是用字节流的方式传输到服务器的本地临时目录,这个过程没有参加字符编码,而真正编码是在文件内容添加到parameters是。

HTTP BODY

  1. Content-Type
  2. <meta HTTP-equiv="Content-Type" content="text/html; charset=GBK">
  3. 默认ISO-8859-1

JDBC编码

JDBC URL:useUnicode=true&&characterEncoding=GBK

JSP

什么是JSP

为了解耦,将业务逻辑与页面分离开来。

Servlet的9个内置对象与四个域对象

常用的JSTL标签

  • 迭代输出:<c:forEach>
  • 移除变量:<c:remove>
  • 条件控制标签 :<c:if><c:choose> <c:when> <c:otherwise> 用法同if()else{}

<c:foreach> 标签

<c:forEach> 的用法:

<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
String atts[] = new String [5];
atts[0]="hello"; 
atts[1]="this"; 
atts[2]="is"; 
atts[3]="a"; 
atts[4]="pen"; 
request.setAttribute("atts", atts);
%>
<c:forEach items="$ { atts }" var="item" >
  $ { item }</br>
</c:forEach>

<c:forEach> varStatus 的四种属性

<% 
String atts[] = new String [5]; 
atts[0]="hello"; 
atts[1]="this"; 
atts[2]="is"; 
atts[3]="a";
atts[4]="pen"; 
request.setAttribute("atts", atts);
%>
<c:forEach items="$ { atts }" var="item" varStatus="s">
<h2><c:out value="$ { item }"/>的四种属性:</h2>
index:$ {s.index}</br>
count:$ {s.count}</br>
first:$ {s.first}</br>
last:$ {s.last}</br>
</c:forEach>

EL表达式

EL隐式对象包括:

  • pageContext
  • initParam(访问上下文参数)
  • param(访问请求参数)
  • paramValues
  • header(访问请求头)
  • headerValues,cookie(访问cookie)

四个域
- applicationScope(访问application作用域)
同一个Web
- sessionScope(访问session作用域)
同一个session
- requestScope(访问request作用域)
同一个请求中数据(使用转发)
- pageScope(访问page作用域)
同一个jsp页面

EL语法

EL表达式也可以很轻松获取JavaBean的属性
${user.address.city}
${user.list[0]}:访问有序集合某个位置的元素
${map.key} : 获得map集合中指定key的值

描述JSP中引入另外页面的两种办法,并比较两种方法的特点

<%@ include file=” “%>在编译期间把另一个页面完全嵌入这个页面
<jsp:include page = " "> 动态的再运行期间把另一个页面加入这个页面,可以说是两个页面,不可以共享变量

MVC

描述MVC各部分的功能?MVC的优点?MVC的缺点?

  1. Model : 设计接口与业务逻辑
    • 封装应用状态
    • 响应状态查询
    • 暴露应用的功能
  2. Controller : 控制业务与页面交互
    • 验证HTTP请求的数据
    • 将用户数据与模型的更新映射
    • 选择用于响应的视图
  3. View
    • 产生HTML相应
    • 请求模型的更新
    • 提供HTML form用于用户请求

spring MVC

Spring MVC如何接受并处理一个请求的?

  • 首先在web.xml 注册一个 dispatcherServlet ,并令这个sevlet接受所有的请求,项目启动后Spring会扫描配置文件并加载、实例化类。Spring MVC里扫描所有和请求映射有关的注解,如@RequestMapping
    、@ResponseBody、@RequestParam等,当接受到一个请求是,他会根据请求的url映射到对应的controler,并根据返回值判断是渲染jsp页面还是返回普通文本,亦或是返回json。

Spring MVC的工作流程

  1. DispatcherServlet继承了HttpServlet,负责接受并响应HTTP请求,接受到一个用户请求后向HandlerMapping请求查找Handler,返回一个执行链条
  2. 请求处理是适配其HandlerAdaptor执行Handler,这里我们要自己写Controller的代码处理Handler
  3. 返回ModelAndView给DispatcherServlet,DispatcherServlet请求view solver对视图进行解析
  4. 最后返回View,将View添加到Request域中

什么是Dao模式

为数据库或其他持久化机制提供了抽象接口的对象,将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。

  • 数据访问的抽象
  • 数据对象的抽象

AJAX

什么是AJAX?

AJAX就是一种创建交互式网页应用的网页开发技术
- 使用DOM进行动态显示及交互
- 使用XML和XSTL进行数据交换及操作
- 使用XMLHttpRequest进行异步数据、检索
- 使用JS将所哟逇东西都绑定在一起

AJAX应用程序的优势

  • 异步
  • 优化传输
  • AJAX在客户端运行,减少了服务器负载
  • 可以实现拒不刷新,在不更新整个页面的前提下维护数据

介绍一下XMLHttpRequest对象

XMLHttpRequest可以使用JS向服务器提出请求并处理相应,而不足赛用户。通过XMLHttpReques对象,开发人员可以在页面加载以后进行页面的局部更新。

AJAX应用和传统Web应用有什么不同?

在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。

因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。

使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。

AJAX请求总共有多少种CALLBACK

onSuccess

onFailure

onUninitialized

onLoading

onLoaded

onInteractive

onComplete

onException

介绍一下XMLHttpRequest对象的常用方法和属性

  1. open(“method”,”URL”)建立对服务器的调用,第一个参数是HTTP请求,第二个是请求页面的URL
  2. send()方法
  3. abort()方法
  4. readyState属性
    5.respronseText属性
  5. responseXML属性
  6. status

AJAX的优点和缺点

优点

  • 无刷新
  • 数据与呈现分离
  • 异步通信,响应快,降低网络上的数据流量

缺点
- 干掉了back和history
- 违背URL和资源定位的初衷
- 客户端过肥,太多客户端代码造成开发上的成本

AJAX实现原理

Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

解释一下RESTful,平时是怎么用的

restful就是采用URL+HTTP请求方法来描述资源和行为。
后丢按一般会提供RESTful接口给前端,其请求方法一般为
1.get
2.put
3.post
4.delete

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值