目录
jsp javaweb 面试题:
JSP和Servlet的区别:
JSP和Servlet的主要作用的相同的,都是充当JavaWeb工程的中间层,接受HTTP客户端的请求,调用Model层后返回响应。
JSP全称是Java Servlet Page,JSP中可以写html, css, js代码,并且可以在<%%>中嵌入Java代码,当JSP第一次被请求时,会由Tomcat把JSP翻译为Java源代码文件,再编译为Class字节码文件,最终向HTTP客户端输出HTML格式的响应结果。因此JSP是运行在服务器端的。
由Tomcat把JSP翻译的Java源代码文件就是一个Servlet,因此JSP本质是就是Servlet
JSP可以充当MVC三层中的Controller控制器层和View视图表示层,但是这不是一种好的编程体验,也违反了程序设计的单一职责原则,因此我们将控制器和视图表示层分层,控制器层交给Servlet,视图层交给JSP。由控制器层Servlet接受HTTP客户端的请求,调用Model层拿到数据后再把数据转发给视图层JSP,JSP中通过jstl标签和el表达式把数据取出后生成动态的HTML,最终输出给HTTP客户端。
另一种说法:
- 一种服务器端的Java应用程序
- 由 Web 容器加载和管理
- 用于生成动态 Web 内容
- 负责处理客户端请求
Jsp
- 是 Servlet 的扩展,本质上还是 Servlet
- 每个 Jsp 页面就是一个 Servlet 实例
- Jsp 页面会被 Web 容器编译成 Servlet,Servlet 再负责响应用户请求
区别
- Servlet 适合动态输出 Web 数据和业务逻辑处理,对于 html 页面内容的修改非常不方便;Jsp 是在 Html 代码中嵌入 Java 代码,适合页面的显示
- 内置对象不同,获取内置对象的方式不同
JSP的九大内置对象:
九大内置对象:
request请求对象 封装了来自客户端、浏览器的各种信息。
response响应对象 封装了服务器的响应信息。
page对象 指向了当前jsp程序本身。
session会话对象 用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数据
application对象 代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
pageContext对象 提供了对jsp页面所有对象以及命名空间的访问。
out对象 用于向客户端、浏览器输出数据。
exception对象 封装了jsp程序执行过程中发生的异常和错误信息。
config对象 封装了应用程序的配置信息。
JSP四大作用域:(只讲红色背景的)
四大作用域分别对应了4个内置对象
每个对象都有setAttibute()方法和getAttibute()方法
page作用域:在当前jsp共享
数据只在当前JSP能够取到
一个页面对应一个page
request作用域:在当前请求中共享
数据在本次请求未结束前都能取到
一次请求对应一个request对象
session作用域:在当前客户端共享
数据在session对象未失效前(默认是30分钟失效)都能取到
一个客户端对应一个session会话
application作用域:所有的客户端共享
数据 在应用程序未退出前都能取到
所有的客户端共享
作用域大小:
page<request<session<application
用el表达式取数据的时候需要指定在哪个作用域中取:
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
如果不指定作用域也可以,el表达式默认会从最低作用域开始依次找,直到找到
HTTP协议:
请求报文和响应报文的结构:
一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据
HTTP响应报文也由三部分组成:响应行、响应头、响应体
http请求方法有哪些?(只讲红色加粗的)
1、GET方法-查
2、POST方法-增
3、HEAD方法;
4、PUT方法-改
5、DELETE方法-删
6、CONNECT方法;
7、OPTIONS方法;
8、TRACE方法。
GET和POST的区别:
1.携带数据的位置和大小不同
get请求直接把参数用?拼接在url后面,大小上限是2KB-4KB
post请求把数据放在请求体里面,大小上限是15MB
GET和POST请求方式的区别:
第一层 GET和POST的行为区别(只讲第一层红色加粗的)
- GET参数通过URL传递,POST放在Request body中。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET请求会被浏览器主动cache缓存,而POST不会,除非手动设置。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
Servlet生命周期:
1.初始化阶段:当Servlet第一次被请求,会初始化Servlet实例,重写init方法可以参与这个阶段
2.判断请求方式阶段,当请求进来后,会调用service方法来判断当前请求方式,从而决定调用哪个处理请求的方法,如果是get请求就会调用doGet方法,如果是post请求就会调用doPost方法,其他几种请求也有响应的doXxx()方法
3.销毁阶段,当Tomcat退出运行的时候,会销毁Servlet实例,重写destory()方法可以参与这个阶段
转发与重定向的区别:
1.发生的位置不同
转发请求:发生在服务端
定向请求:发生在客户端
2.请求次数不同
转发请求:请求在后端转发多次,仍然属于同一次定向请求
重定向请求:是两次定向请求
3.地址栏不同
转发请求不会改变浏览器的地址栏
重定向请求会改变浏览器的地址栏
4.是否共享request作用域
转发请求可以共享作用域中携带的数据
重定向请求不可以共享request作用域中的数据
5.跳转限制
转发只能发生在当前站点
重定向可以发生在当前站点内,也可以到外部的站点
Cookie与Session的区别:
Cookie和Session都是会话跟踪技术
1.存储位置不同:
Cookie存储在客户端浏览器中
Session存储在服务端
Session依赖名为JSESSIONID的COOKie
2.大小不同:
单个Cookie保存的数据最大为4KB,一个站点最多可以存在20个Cookie
Session的大小没有上限
3.隐私策略不同
Cookie是存储在客户端浏览器的,会遭受XSS攻击导致数据泄露,隐因此Cookie是不安全的,不适合存储敏感数据
Session是存储在服务端的,安全性比较高,但会消耗服务端性能,不适合存储太多数据
4.存储类型不同
Cookie中只能存储ASCll字符串
Session中可以存储任意对象
拦截器技术:
前后端交互方式
使用Form表单
action属性指定请求url地址
method属性指定请求方式,默认是get请求
表单元素的name和value是数据名和数据值,后端可以根据name取value
提交按钮是submit类型的按钮
<form action="请求url" method="请求方式">
<input name="" value=""/>
<button type="submit"></button>
</form>
使用超链接
href属性指定请求url地址,使用?在后面拼接请求参数,格式是name=value,用&分隔
使用ajax(阿甲克思)&json
无刷技术
用ajax技术发出的http请求,后端返回的是数据,而不是页面,当前页面不会刷新
异步http请求
局部刷新
在ajax的回调函数中,根据后端返回的数据,更新页面的局部区域,不会影响到其他区域
ajax的请求方式get和post
@ResponseBody注解的作用:控制器不做转发,而是直接把数据给ajax
MVC三层架构:
是一种代码分层架构思想
- M:Model,业务模型,处理业务
- V:View,视图,界面展示
- C:Controller,控制器,处理请求,调用模型和视图
控制器(serlvet)用来接收浏览器发送过来的请求,控制器调用模型(javaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后在交由视图(JSP)进行数据展示。
设计模式:
单例模式:只有一个实例
懒汉式:当调用getInstance的时候,才会初始化这个单例。
饿汉式:一旦加载好类,就把单例初始化完成。
双检锁式:先判断对象是否已经被初始化,再决定要不要加锁。
枚举:可被列举的集合,具有不可变性。
工厂模式:
最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。
代理模式:为真实对象提供代理,供其他对象通过代理访问真实对象
静态代理:程序运行前就已经存在代理类的字节码文件。
动态代理:在Java运行时生成代理类的技术
Java代理:客户端不直接和服务端打交道, 而是通过一个中间层来访问, 这个中间层就是Java代理。
cglib代理:在内存中构件一个子类对象,从而实现对目标对象的功能拓展。