# Servlet
## 生命周期(面试点)
默认第一次访问的时候创建Servlet对象,执行init方法,每次请求过来之后执行Service方法,在service方法内部根据请求方式的不同调用不同的doXXX方法,Get请求调用doGet方法,Post请求调用doPost方法,当服务器关闭或者项目被移除了就销毁Servlet对象,执行destroy方法,初始化和销毁方法都只执行一次;Servet是单例,也就是说在Servlet整个生命周期中,Servlet对象有且仅有一个
## HTTP协议
超文本传输协议,基于请求和响应模型,请求先有,后有响应,一次请求只会有一次响应
### 请求
#### 请求行
get请求的请求参数在请求行的请求路径后面
#### 请求头
key:value结构的,一般一个key对应一个value,也有一个key对应多个value的情况
user-agent:浏览器的版本信息
referer:当前这次请求从哪里发过来------防止盗取链接,做统计工作
#### 请求体
get请求方式没有请求体
##### GET和POST的区别(面试点)
1,get方式提交的数据显示在地址栏中,准确的说是在请求行中的请求路径后面,没有请求体,而post方式提交的数据不会显示在地址栏中,提交的数据在请求体中
2,get方式url的长度有限制,而post没有限制
3,post方式提交数据相对安全
### 响应
#### 响应行
常见的状态码:
404:资源路径找不到:一般查看:action="" @WebServlet("") 转发的路径,重定向的路径等等
302:集合Location的响应头做重定向使用
304:查找本地缓存
500:代码有误
#### 响应头
key:value结构的,一般一个key对应一个value,也有一个key对应多个value的情况
常见的响应头:
Content-Type:响应体的数据格式及编码格式
Content-disposition:文件下载时使用
#### 响应体
网页代码/网页能够看到的内容
## Request
### 获得客户端相关的信息
获得请求方式:
String method = request.getMethod()
获取虚拟路径(项目名):
String contextPath = request.getContextPath();
获得URI/URL:
String uri = request.getRequestURI();
StringBuffer sb = request.getRequestURL();
获得远程ip地址:
String ip = reqeust.gerRemoteAddr();
### 获取请求提交的参数
获得单个值:
String value = reqeust.getParameter(String name);
获得一组值(复选框):
String[] values = request.getParameterValues(String name);
获得所有的值封装到map集合中:
Map<String,String[]> map = request.getParameterMap();
#### 提交参数乱码问题的解决
get:tomcat8及以上已自主解决
post:
request.setCharacterEncoding("UTF-8"):
注意:这句话一定要写在获取参数之前
### 作为域对象存取数据
作用的范围: 一次请求响应的范围
什么时候创建:服务器收到客户端请求时创建request对象
什么时候销毁:服务器对当前这次请求做出响应后销毁
存取数据的方法:
```java
request.setAttribute(String key,Object value);
Object value = request.getAttribute(String key);
request.removeAttribute(String key)
```
## 转发和重定向
写法:
```java
request.getRequestDispatcher("转发路径").forward(request,response);
```
```java
response.sendRedirect("重定向的路径");//路径一般需要带虚拟路径,而虚拟路径需要动态获取request.getContextPath()
```
区别:
1,转发浏览器地址栏不变,重定向会发生变化
2,转发只能在当前项目内部跳转,重定向可以跳转任意范围
3,转发是一次请求一次响应,重定向是两次请求两次响应
4,路径编写:转发不需要带虚拟路径,重定向需要写虚拟路径
## ServletContext
servet的上下文,servlet和tomcat服务器环境数据交换的桥梁,代表了整个web应用
### 如何获得
```java
request.getServletContext();//要能拿到request对象
this.getServletContext();// 要在继承了HttpServlet的类中才能使用
```
### 作为域对象存取数据
1,作用范围:
整个web应用
2,何时创建:
服务器启动时会为每一个web项目创建单独的ServletContext对象,一个web应用只有一个
3,何时销毁:
服务器关闭,项目被移除时销毁该对象
4,存取数据的方法:
```java
request.setAttribute(String key,Object value);
Object value = request.getAttribute(String key);
request.removeAttribute(String key)
```
### 获取文件路径
```java
String realPath = serveltContext.getRealPath(String path);
InputStream is = servletContext.getResourcesAsStream(String path);
```
## Cookie
数据存储客户端浏览器,能存储的个数和大小有限制
如何创建:
Cookie cookie = new Cookie(String name,String value);
获取cookie的名称:
cookie.getName();
获取cookie的值:
cookie.getValue()
设置cookie的存活时间:默认情况下,关闭浏览器cookie销毁
cookie.setMaxAge(int age);单位是秒
在同一服务器下的不同项目之间共享cookie:
cookie.setPath(String path)
在不同服务器之间共享:
cookie.setDoamin(String domain)
如何向客户端写入cookie:
response.addCookie(Cookie cookie);
客户端携带cookie如何获取:
Cookie[] cookies = request.getCookies();
## Session
基于cookie,每个session空间的唯一表示sessioinId交给cookie保存到了客户端
如何获得Session对象:
HttpSession session = request.getSession();
### 作为域对象存取数据
作用域:一次会话的范围;关闭浏览器session会销毁吗?--------关闭浏览器,存储sessionId的cookie销毁了,以前的Session空间找不到了
什么时候创建:服务器端第一次调用getSession()方法时创建
什么时候销毁:
1,服务器非正常关闭
2,调用了invalidate()方法
3,session过期了:默认的过期时间是30分钟
可以针对自己项目修改session过期时间:WEB-INF/web.xml
```xml
<session-config>
<session-timeout>5</session-timeout><!--单位是分钟-->
</session-config>
```
作为域对象存取数据:
```java
request.setAttribute(String key,Object value);
Object value = request.getAttribute(String key);
request.removeAttribute(String key)
```
## JSP
#### 9大内置对象
```java
pageContext PageContext
request HttpServletRequest
session HttpSession
application ServeltContext
response HttpServletResponse
out JspWriter
page Object
config ServletConfig
exception Throwable
```
## EL
语法:${ }
获取域对象中存储的数据
用什么名字存到域对象中的,就用什么名字取出来,存进去是什么类型,取出来就是什么类型
对象/map .属性/.key
数组/集合 [索引]
## JSTL
```html
<c:if test="${ }">
test属性里的表达式返回true,该标签体内的内容会被输出到页面显示,否则不显示
if标签没有else,想表达else的情况,从条件着手,再写一个if
</c:if>
```
```html
<c:choose>
<c:when test="${ }"> </c:when>
....
<c:otherwise></c:otherwise>
</c:choose>
```
```html
<c:foreach begin="" end="" step="" var="i">
${ i }
</c:foreach>
```
```html
<c:foreach items="${ }" var="" varStatus="s">
items:取出待遍历的集合
var:遍历得到的每一个元素
varStatus:遍历的状态对象
s.index 遍历的下标/索引
s.count:遍历的次数
</c:foreach>
```
|
|