JavaWeb_18 Servlet 理解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Servlet 是什么?

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:

  • 性能明显更好。
  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
  • Servlet 是独立于平台的,因为它们是用 Java 编写的。
  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

一、Servlet架构?

下图显示了 Servlet 在 Web 应用程序中的位置:

二、生命周期


总结

## servlet宝典

servlet概述

> 就是一个java类,是javweb的规范之一,也是三大组件之一(serlvet,listener,filter)
>
> **作用:**负责接收用户的请求以及做出响应。(之前是由doXxx.jsp)
>
> 快速入门:
>
> 1. 实现servlet接口  不常用
> 2. 继承HttpServlet抽象类    doGet  doPost
>
> 完成servlet文件的编写后必须要实现配置
>
> 2种方式
>
> 注解   @webServlet("/路径")
>
> web.xml中进行配置
>
> ```html
> <servlet>    
>     <servlet-name>xxx</servlet-name>    
>     <servlet-class>com.zking.AServlet</servlet-class></servlet>
> <servlet-mapping>    
>     <servlet-name>xxx</servlet-name>   
>     <url-pattern>/xxx.do</url-pattern>
> </servlet-mapping>
> ```

### JSP中的内置对象对应Servlet中的什么对象

```
JSP					Servlet
request            serivce(request,response)   doPost(request,response)

session   		    request.getSession    HttpSession
applicaiton         this.getServletContext();   ServletContext
out					response.getWriter()      PrintWriter

Cookie				Cookie

```

servlet中2个重要对象

ServletConfig配置对象

ServletContext全局对象

都是获取web.xml中的参数问题。



编码的问题

```java
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
		
```

###### 如何在serlvet中获取到当前项目的绝对路径

###### 这里的绝对路径指的是基于项目的根目录而不是基于磁盘。

```
String path = this.getServletConfig().getServletContext().getContextPath();

/项目名称
path+"/index.jsp"
```













| jsp内置对象 | servlet中java对象   | 获取                    |
| ----------- | ------------------- | ----------------------- |
| request     | HttpServletRequest  | service方法中的req参数  |
| response    | HttpServletResponse | service方法中的resp参数 |
| session     | HttpSession         | req.getSession()        |
| exception   | Throwable           |                         |
| page        | this                | this                    |
| pageContext | PageContext         |                         |
| application | ServletContext      | getServletContext()     |
| config      | ServletConfig       | getServletConfig()      |
| out         | JspWriter           | resp.getWriter()        |

### 1.Servlet概述

#### 1.1 什么是servlet?

##### servlet是JavaEE的规范(接口)

**Server Applet**;servlet是javaweb的**三大组件**之一,它属于动态资源。servlet的作用是处理请求,服务器会把接收到的请求交给servlet来处理,在servlet通常需要:

- 接收请求数据
- 处理请求
- 完成响应

```
例如客户端发出登录请求,或者输出注册请求,这些请求都应该有servlet来完成处理!servlet需要我们自己来编写,每个servlet必须实现javax.servlet.Servlet接口。
```

**servlet执行原理**

```
(1)当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
(2)查找web.xml文件,是否有对应的<url-pattern>标签体内容。
(3)如果有,则在找到对应的<servlet-class>全类名
(4)tomcat会将字节码文件加载进内存,并且创建其对象
(5)调用其方法
```



#### 1.2 实现servlet的方式

实现servlet有三种方式:

- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- **继承javax.servlet.http.HttpServlet类;**

```
通常会继承HttpServlet类来完成我们的Servlet。
```

Servlet接口详解

```java
public interface Servlet{
    public void init(servletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse resp) throws ServletException,IOException;
    public String getServletInfo();
    public void destory();

}
```

#### 1.3 servlet的生命周期

> 问题:当servlet被编写完成后,如何让浏览器访问servlet呢?
>
> - 给servlet指定一个servlet路径!(让servlet与一个路径绑定在一起)
> - 浏览器访问servlet路径

**给servlet配置servlet路径,需要在web.xml中对servlet进行配置。**

```xml
<servlet>
	<servlet-name>xxx</servlet-name>
	<servlet-class>com.zking.AServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>xxx</servlet-name>
	<url-pattern>/xxx.do</url-pattern>
</servlet-mapping>
```

**生命周期方法**

```java
void init(ServletConfig):出生之后(1次)
void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
void destory():临时之前调用(1次)
```

**【总结】servlet由我们编写,但对象由服务器来创建,并且由服务器来调用相应的方法。**

#### 1.4 HttpServlet

> HttpServlet是[Servlet](https://so.csdn.net/so/search?q=Servlet&spm=1001.2101.3001.7020)接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。

**创建HttpServlet步骤**

- 继承HttpServlet抽象类
- 重写HttpServlet的部分方法,如doGet()或doPost()方法
- 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
- 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果

**HttpServlet的实现由两种方式**

```
实现方式一:.xml配置实现
A.配置xml文件(实现方式同Servlet接口的.xml配置相同,此处不再重复)
B.继承HttpServlet抽象类
C.重写get()、post()方法
实现方式二:注解实现
直接在Package包下新建Servlet
```

#### 1.5 ServletConfig

##### 1.5.1 快速入门

> **概述**
>
> ServletConfig是Servlet的配置参数对象,在Servlet的规范中,允许为每一个Servlet都提供一些初始化的配置,所以**每一个Servlet都有一个ServletConfig。**
>
> **作用**
>
> 当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init()方法传入一个**ServletConfig对象**,即传入一些配置信息给Servlet。
>
> **生命周期**
>
> 应用一加载则创建,应用停止则被销毁;
>
> **创建时间** 
>
> 创建完Servlet对象时,接着创建。Servletconfig对象
>
> **常用方法**
>
> | 返回值             | 方法名                        | 说明                     |
> | ------------------ | ----------------------------- | ------------------------ |
> | String             | getInitParameter(String name) | 根据参数名称获取参数的值 |
> | Enumeratin<String> | getInitParameterNames()       | 根据所有参数名称的枚举   |
> | String             | getSevletName()               | 获取servlet的名称        |
> | ServletContext     | getServletContext()           | 获取servletContext对象   |

##### 1.5.2 ServletConfig的配置方式

> 在<servlet>标签种,通过<init-param>标签来配置。有两个子标签:
> <param-name>:代表初始化参数的key。
> <param-value>: 代表初始化参数的value

#### 1.6 ServletContext

##### 1.6.1 ServletConText介绍 

> 概述:ServletContext对象是一个应用上下文对象,**也是一个域对象**。表示Servlet应用程序,**每个web应用程序都只有一个ServletContext对象。**
>
> **ServletContext对象的作用**
>
> - 有了ServletContext对象,就可以共享从应用程序中的所有资源访问到的数据信息,并且可以动态注册web对象。
> - 可以获得应用域的**全局初始化参数**,以及达到Servlet之间的**数据共享**;
> - 可以作为域对象在整个应用中共享数据;域对象即在一定的作用范围内实现资源共享;
> - 可以用来获取应用中的资源在服务器上的绝对路径;
> - 获取文件的mime类型: 在网络传输中,并不是以扩展名来区分文件的类型,都是以mime类型;如:text/html;表示一个html文件。
>
> **生命周期:** 应用一加载则创建,应用被停止则销毁
>
> **创建时间:** 加载web应用时,创建ServletContext对象。
>
> 域对象 
>
> - 域对象指的是对象有作用域,即有作用范围。域对象可以实现数据的共享,不同作用范围对象,共享数据的范围能力也不同。
> - 在Servlet规范中,一共有4个域对象。其他三个是:**request请求域**,**PageContext页面域**,**session会话域**。ServletContext就是其中的一个。是web应用中最大的作用域,也叫application应用域,可以实现整个应用之间的数据共享!
>
> **常用方法**
>
> | 返回值              | 方法名                                 | 说明                                   |
> | ------------------- | -------------------------------------- | -------------------------------------- |
> | void                | setAttribute(String name,Object value) | 向域对象中存储数据                     |
> | Object              | getAttribute(String name)              | 通过名称获取域对象中的数据             |
> | void                | removeAttribute(String name)           | 通过名称移除域对象中的数据             |
> | Enumeration<String> | getAttributeNames()                    | 获取域对象中所有数据的名称             |
> | String              | getSevletContextName()                 | 获取servletContext的名称               |
> | String              | getContextPath()                       | 获取当前应用的访问虚拟目录             |
> | String              | getServletInfo()                       | 获取服务器名称和版本信息               |
> | String              | getInitParameter(String name)          | 根据名称获取全局配置的值               |
> | Enumeration<String> | getInitParameters()                    | 获取全局配置的所有名称                 |
> | String              | getRealPath(String path)               | 根据虚拟目录获取应用部署额磁盘绝对路径 |

##### 1.6.2 ServletContext配置方式

- ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;
- 在<web-APP>标签中,通过<context-param>标签来配置,有两个子标签:
  <param-name>: 代表全局初始化参数的key。
  <param-value>: 代表全局初始化参数的value。









































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值