A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1028362847 初级黑马   /  2018-12-27 14:07  /  496 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

# 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>
```

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马