Servlet
Servlet是一种用于扩展服务器功能的服务器端组件技术。
要求直接或者间接的实现Servlet接口
运行在服务器端,执行结果是一个html文档
1、 Servlet的特征
一般采用单实例多线程的方式对外提供服务,一个客户请求对应一个线程
如果在Servlet类中定义属性,则需要考虑线程安全问题
2、Servlet的优点
Servlet有什么优点?
可移植性好
Servlet是用Java语言编写的,因此它可以移植到不同的操作系统和服务器上。
安全性好
Servlet也具有类型检查特征,并利用Java的垃圾收集和没有指针的设计,使得Servlet避免了内存管理等问题。
高效性
Servlet加载执行后会常驻服务器内存中,当再次受到客户端的请求时,服务器会产生新的线程而不是进程为客户端服务,这样就提高了响应速度。
3.Servlet的生命周期
当客户端第一次请求Servlet时,Servlet被加载到内存中,容器会创建Servlet实例,并调用其init()方法进行初始化工作。
容器创建请求对象和响应对象,然后调用Servlet的service()方法为客户端提供服务。
当Servlet不再被需要时,容器调用Servlet的destory()方法将Servlet实例销毁。
注: 当客户端请求的Servlet已经存在于服务器内存时,容器会创建新的线程调用service()方法响应客户端请求。在Servlet的整个生命周期中,init()方法和destory()方法只会被调用一次
request&response
-
request: 请求:获取资源。
在BS架构中,就是客户端浏览器向服务器发出的一次请求response: 响应: 回馈结果。
在BS架构中,就是服务器给客户端浏览器反馈结果 -
请求对象 ServletRequest
httpServletRequest -
执行流程
服务器创建Servlet对象后、创建request请求和response响应对象;
request对象用于封装HTTP在当次请求中的数据;
response对象用于封装响应给客户端浏览器的数据;
服务器会调用Servlet对象的service()方法。将request对象和response对象作为参数传递给service()方法;
我们再使用请求和响应对象对数据进行操作;
服务器在进行响应之前会将response对象中的数据编译成HTTP响应的格式,响应给浏览器。 -
response常见的响应码:
200 成功
404 路径不对
405 请求方式不对
500 服务器端代码错误
5 .请求转发与重定向
//请求转发:request的方法
// request.getRequestDispatcher("/login.jsp").forward(request,response);
//重定向
response.sendRedirect("https://www.baidu.com/");
面试题:
\1. forward和redirect的区别?
地址栏显示不同,forward地址栏显示的是原来的地址,因为其是由服务器请求资源,直接访问目标地址的URL,并读取响应内容,然后将内容发送至浏览器,浏览器并不知道目标地址。redirect显示的是新的URL,因为其是个是服务器根据逻辑发送状态码至浏览器,让浏览器重新请求目标地址,所以浏览器是知道目标地址的。
数据共享方式不同,forward转发页面和目标页面均可共享request的数据。redirect则是不可以共享数据。
通常应用的场景不同,forward一般用于用户登陆的时候,根据角色转发到相应的模块。redirect一般用于用户注销登陆时返回主页面和跳转到其它的网站等
效率不同,通常认为forward的效率要更高
\2. get和post有何区别?
get参数传递通过url,post放在resquest body中
get请求参数有长度限制,post没有
get不安全,因为参数暴露在url中。post安全,参数是隐藏的
get请求只能进行url编码。post支持多种编码
get请求参数会被完整保留在浏览历史记录,而post不会被保留。
get产生一个tcp数据包;post产生两个tcp数据包。
get和post本质就是tcp链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
Cookie&session
cookie&session为会话技术
1.会话: 一次会话包含浏览器与服务器之间的多次请求和响应
一次会话,从浏览器第一次发送请求开始,会话建立,直到其中一方主动断开连接为止,会话结束
会话技术解决的问题:解决多次请求和响应之间共享数据
2.\2. session和cookie有什么区别?
cookie可以被客户端禁用,但是客户端无法禁用服务端的session。
存储的对象不同,session能够存储任意的Java对象,cookie只能存储String类型的对象。
数据存储的地址不同,cookie数据保存在客户端,session数据保存在服务器端
Filter&Listener
-
Filter过滤器 三大组件之一
- web开发中的过滤器,当浏览器访问服务器的某个或某些资源时,过滤器会拦截对该资源的请求,做一些特殊的操作
- 入门
- 创建一个类 实现 Filter接口
- 在doFilter方法中作对资源请求拦截之后的编码
- 放行 filterChain.doFilter(servletRequest,servletResponse);
- 设置对哪些资源进行拦截
- 作用,对多个资源的请求作一些通用操作,登录访问,编码转换,敏感字符过滤
- 生命周期
- Filter对象在服务器启动时由web服务器创建,这时调用Filter.init()生命周期方法
- 服务器运行中,该对象一直存在,一个过滤器只会有一个实例对象(单例的)
- Filter对象在服务器正常关闭时由web服务器销毁,这时回调用Filter.destroy()生命周期方法
- 2种配置方式
- @WebFilter(“urlPattern”) 注解在我们自定义的Filter类上
- 配置web.xml filterDemo2 com.hqyj.zjc.filter.FilterDemo2 filterDemo2 /hello.jsp
- 过滤器的url pattern的写法
- /user/* 拦截具有/user/的所有url
- *.do 拦截后缀名为.do的所有url
- /* 拦截项目中任何的url
- 过滤器的代码执行过程
- 先访问过滤器
- 再访问被拦截的资源
- 执行过滤器中放行后的代码
*案例: 登录访问控制,未登录的用户访问主页、用户列表这种敏感资源时,跳转到登陆页面,已经登录过的用户不受限制
-
Listener 监听器
-
监听机制
- 事件 一件事
- 事件源 发生事件的地点
- 监听器 前端代码中,是回调方法,java web中,就是一个对象
- 注册监听 将事件、事件源和监听器三者经行绑定,当该事件源发生该事件时,执行监听器中定义的代码
- 三大java web开发的组件之一,SUN定义了6个大类的监听器,我们学习一个
- ServletContextListener ServletContext监听器
- 监听应用域对象的创建和销毁
- 入门:
- 定义一个类,实现ServletContextLisener接口
- 复写方法
- 配置
- 2种配置方式
- @WebListener 注解到自定义的Listener类定义上
- web.xml中配置 类的全类名 com.hqyj.zjc.listener.ContextListenerDemo2
- ServletContextListener中的两个方法
- contextInitialized(): 该方法回调时间点:ServletContext对象被创建出来之后
- contextDestroyed(): 该方法回调时间点:ServletContext对象销毁之后
- 作用:能在web应用启动时,加载一些资源(配置文件)
JSON格式与ajax请求
- JSON JavaScript Object Notation js对象表示法
- Person person = new Person()
- person.setName(“zhangsan”)
- person.setAge(18)
- person.setMarried(false)
- var person = {“name”:“zhangsan”,“age”:18, “married”:false}
- js对象的语法 {名1:值1,名2:值2,…}
- 名的类型: 字符串 js代码中,名可以使用单引号或双引号包裹,如果名符合变量的命名方式,引号可以省略
- 值的类型:
- 1、 数字型 不需要引号
- 2、 字符串 需要引号
- 3、 关键字 true、false、 null
- 4、 js对象 {“provice”:“四川省”,“city”:“成都市”}
- 5、 js数组 [元素1,元素2, …]
- js数组的语法: [元素1,元素2,…]
- 元素的类型:
- 1、 数字型 不需要引号
- 2、 字符串 需要引号
- 3、 关键字 true、false、 null
- 4、 js对象 {“provice”:“四川省”,“city”:“成都市”}
- 5、 js数组 [元素1,元素2, …]
- 元素的类型:
- js代码中可以使用JSON.stringify()将一个js对象转成一个JSON格式的字符串
- JSON格式的字符串,{“name”:“zhangsan”,“age”:18, “married”:false},名和字符串类型的值只能是双引号包裹
- json格式用途:常用于互联网交换信息,和xml对比,具有优点:冗余较小,语法简单,解析较快
- 获取js对象中的值:
- 语法: js对象.键名 js对象[“键名”]
- 获取js数组中的元素:
- 语法:js数组[索引值]
- 遍历js数组
- for(var i=0;i<js数组.length;i++)
- for(var 索引变量 in 数组名)
- for in语句可以遍历js对象
for(var item in person){
alert(person[item]) //此处的item不能引号包裹,而且不能使用person.item方式访问js对象中的值
} - json格式的字符串和java对象的相互转换
- json格式解析工具: gson、fastJson、jackson
- 使用jackson:
- 创建jacksonJar包中提供的ObjectMapper对象
- ObjectMapper objectMapper = new ObjectMapper();
- ObjectMapper提供多个write()方法,可以将java对象转成JSON格式字符串
- String writeValueAsString(Object obj)
- void writeValue(Writer writer, Object obj) 转成JSON格式字符串并将内容写入到字符输出流中
- jackson支持将List、数组对象转换成JSON格式的数组
- jackson支持将Map<String, Object>型对象直接转成JSON格式字符串(该字符串表示一个js对象)
- 2个注解:
- @JsonIgnore 注解到自定义类的成员变量中,转换成JSON格式时,忽略该对象的属性
- @JsonFormat(pattern=“日期时间格式”) 注解到Date类型的对象属性上。转换JSON格式时,该Date对象会转换成对应的日期时间格式字符串
- Json格式的字符串转java对象
- Class ObjectMapper.readValue(String jsonString, Class class); 第一个参数:json格式的字符串,第二个参数,要转成的java对象的类型
- AJAX请求 (浏览器侧的技术)
-
Asynchronous Javascript And Xml 异步的JS和XMl
-
异步和同步
- 指浏览器和服务器之间的步调一致(同步)或不一致(异步)
- 同步:浏览器给服务器发出请求之后,必须要等待服务器的响应之后,才能做其他事,在等待的过程中浏览器不能响应用户的操作
- 异步:浏览器给服务器发出请求之后,无需等待服务器的响应,就可以继续响应用户的操作。 用户体验更高
-
AJAX
- 就是浏览器发送请求并对服务器响应数据做出处理的浏览器侧的一项技术;这项技术只需要和服务器交互一小段数据,来实现页面的局部更新。
- 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
-
浏览器发送请求的方式:
- 浏览器地址栏敲一个url 整个页面跳转
- 点击a标签 整个页面跳转
- form表单方式发送请求 整个页面跳转
- ajax请求 页面的局部更新
-
- Jquery AJAX 三种用法
- $.ajax() 重点掌握这种
- $.get(url[,data][,function(){}][,dataType]) //发送get请求方式的请求
- $.post(url[,data][,function(){}][,dataType]) //发送post请求方式的请求