什么是Servlet?
Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
Servlet是java web的基本规范,它是可以处理用户请求和响应的一种机制,基于 web 容器部署。所以
Servlet是由web 容器负责加载、运行、管理的,整个的生命周期都是由容器负责的。
我们只需要开发好Servlet, 并把这个Servlet交给web 容器,这样一来,web 容器就可以去管理这个Servlet,负责加载、创建、调用相关的方法直到整个生命周期的结束。
JavaEE规范中,定义了Servlet接口,我们只需要开发类型去实现这个接口即可。
servlet包
相关的API:
javax.servlet 包
Servlet[接口] -> (init, service, destroy, getServletConfig, getServletInfo)
- GenericServlet[抽象类] 独立于协议的
- HttpServlet [基于应用层的http协议实现的Servlet]
定义了:
doGet -> 处理 get 请求
doPost -> 处理 post请求
doDelete
doPut
doXXX
servlet开发方式
方式一: 直接实现 Servlet 接口 【不推荐】
public class 你的Servlet implements Servlet {
// 重写 5个方法
}
方式二: 继承 GenericServlet 【不推荐】
public class 你的Servlet extends GenericServlet {
//重写 service
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// …
}
}
方式三:继承 HttpServlet 【推荐的做法】
public class 你的Servlet extends HttpServlet {
//重写 doGet和doPost 方法
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// …
}
}
javax.servlet.http 包
\- 这里的类或接口都是与 HTTP 协议有关的
\- HttpServletRequest
\- HttpServletResponse
...
开发和部署一个Servlet基本流程:
- 开发一个类,继承 HttpServlet, 重写 doGet 方法
- 在 web.xml中,去配置这个 Servlet
- 部署到Tomcat容器中
- 启动Tomcat
- 打开浏览器,发送请求,查看响应
Servlet的生命周期
也就是指Servlet从创建到销毁的全过程。
-
- 当请求来到时,容器会根据请求的 url 来判断由哪个Servlet来响应
-
- 容器会判断当前应用中的Servlet是否使用了 load-on-startup选项,如果有加了此选项的
Servlet,则根据load-on-startup的值来先后创建这些Servlet,并调用它们的init方法。
- 容器会判断当前应用中的Servlet是否使用了 load-on-startup选项,如果有加了此选项的
当然,对于没有加 load-on-startup选项的servlet,则
判断此Servet实例是否已经存在?
如果不存在,容器就会创建这个Servlet的实例【只创建一次】,并执行它的init方法,[只执行1次]
这个实例并交由容器管理。
如果存在,则执行此Servlet的 service 方法【每次请求都会执行1次】
-
-
当容器把某个应用给undeploy时,容器会调用此应用中的所有Servlet的destroy方法
init()
service()
destroy()
-
Java Web开发,所涉及到的三个层次概念
①容器层次 [可以部署多个 应用]
Tomcat - web container [帮助我们创建、管理相关的对象]
②应用层次 [可以部署多个 Servlet]
ServletContext - 应用上下文[理解成代表整个应用环境]
注:一个应用只有一个 ServletContext.
③Servlet层次 [coding, 开发的Servlet]
Servlet - 对用户的请求做出处理的代码
每一个Servlet都有一个与之对应的 ServletConfig.
ServletConfig就是维护对应的Servlet的一些配置信息。
ServletContext 相关的API说明
Servlet
HttpServlet
service(HttpServletRequest req, HttpServletResponse resp)
doGet(HttpServletRequest req, HttpServletResponse resp)
doPost(HttpServletRequest req, HttpServletResponse resp)
HttpServletRequest
getServletContext => ServletContext
HttpServletResponse
ServletContext
ServletConfig
getInitParameter();
初始化参数
1. 针对 Servlet配置的初始化参数,支持xml和注解两种配置
3. 针对应用层面配置的初始化参数,支持xml 配置
有关Servlet的url-pattern的匹配模式
注: 一个 Servlet 可以映射成多个 url-pattern
支持三种匹配模式:
①. 精确匹配
如: /show, /life, /hello, /init/param, /user/add, /user/update, ....
注:此情况下,getPathInfo的返回值一定是 null
②. 模糊匹配, 是一种通配方式
如: /*, /user/* , /user/manager/*, ...
将来这个*号对应的路径,可以通过 getPathInfo 来获取,从而判断具本的请求操作。
③. 扩展名匹配, 也是一种通配方式
如: *.do, *.haha, *.action
将来这个 * 号对应的路径,可以通过 getServletPath 来获取,从而判断具体的请求操作
注:此情况下,getPathInfo的返回值一定是 null
实现 User 的 CRUD 操作
Servlet 的请求参数处理:
方法:
getParameter(String name) => 通过参数名来获取参数值。
getParameterValues(String name) => 通过参数名来获取多个值,比如:checkbox, select,..
getParameterNames(); => Enumeration<String> 只返回请求参数名字
getParameterMap(); => Map<String, String[]> 返回所有请求参数名及它的值
在 web 开发中,我们的服务端资源可以分成两大类:
一、动态资源,如:
Servlet, JSP, ....
这些资源需要JVM去编译和运行
二、静态资源,如:
图片、css、js、视频、pdf、excel、word、txt、....
这些资源不需要JVM的参与.
这些资源如果是放在项目的 webapp 目录下,我们通过浏览器是可以直接访问的。
如果这些资源是放在项目的 webapp/WEB-INF 目录下,则这些资源就被容器给保护起来了,通过
浏览器是不能直接访问,必需要通过 Servlet 跳转。
获取请求参数时需要注意的事项:
不同的表单类型,在后台需要使用不同的方法来获取表单数据
其中,如果<form> 的enctype属性是:
enctype="multipart/form-data" 时,method必需是 post, 则后台需要通过
request.getPart() 或 request.getParts() 来获取表单数据。
enctype="application/x-www-form-urlencoded" 这个值是默认值,这种情况下,method
可以是 get或post, 后台则通过
request.getParameter() 或 request.getParameterValues() 来获取表单数据。
注:只要不做文件上传,则enctype就使用默认值。
请求和响应都分为两部份进行传输数据,分别是:
请求头和请求体部
响应头和响应体部
- 当请求是以 GET 方式提交时,则数据是放在请求头部传输给服务端。
- 当请求是以 POST 方式提时,则数据是放在请求体部传输给服务端。
- 备注:通过 request和response 的 setCharacterEncoding 方法只能设置 请求体和响应体 的编码,它不会影响头部的编码。
请求跳转:
- 把请求从一个Servlet转发到另一个Servlet过程,就叫请求的跳转。
它的API:
RequestDispatcher
.forward(request, response) --> 转发请求【请求没有变化】
.include(request, response) --> 包含另一个资源
-
如何才能获取 RequestDispatcher对象呢?
通过 request.getRequestDispather(url) 方法 还可以通过 ServletContext 的方法 getServletContext().getRequestDispatcher(url); getServletContext().getNamedDispatcher(servletName);
如何在不同的资源之间传递数据?
比如:请求从 AServlet 转发到 BServlet/JSP/HTML 时,如何把 AServlet中的数据“传递”给BServlet?
在AServlet中,把对象绑定到 request 范围: request.setAttribute("key", obj)
请求转发到BServlet,然后在BServlet中,就可以:request.getAttribute("key")
来获取 绑定的 Obj
请求重定向【redirect】
它是指服务端会重新产生新的请求,并且我们在浏览器端会看到新的地址。
重定向有什么作用?
重定向的目的是当Web应用升级后,如果请求路径发生了变化,可以将原来的路径重定向到新路径,从而避免浏
览器请求原路径找不到资源。
操作:response.sendRedirect();
转发和重定向的区别?
-
请求转发时,地址栏中的地址是不变化的,因为请求是同一个;
重定向时,地址栏中的地址是变化的,因为请求是新的请求。 -
请求转发时,可以从 request 中取出之前绑定的 key 值;
重定向时,不能从 request 中取出之前绑定的 key 值。
请描述一下四种不同的范围各自的边界?
application 可以跨多个 会话[session],
session 可以跨多个请求[request]
request 可以跨多个页面/资源 [page]
page
注:不同范围是不可以交叉取值的。
-
application范围 => ServletContext
setAttribute(String key, Object value);
getAttribute(String key);
removeAttribute(String key); -
session范围 => HttpSession
setAttribute(String key, Object value);
getAttribute(String key);
removeAttribute(String key); -
request范围 => HttpServletRequest
setAttribute(String key, Object value);
getAttribute(String key);
removeAttribute(String key); -
page 范围 => PageContext
请求头和响应头
首先了解一下 HTTP 协议
HTTP1.0 -> HTTP1.1 -> HTTP2.0
HTTP 是整个互联网的“基础协议”,也是互联网的支撑。【应用层协议】;它的特点:
1.简洁
2.无状态 【*****】
意味着服务端不关心每一次的请求的状态。 【高效】
它是一种基于 请求和响应 的协议,基于 TCP/IP 协议。
HTTP 请求和 HTTP 响应消息的格式是类似的,结构如下:
初始状态行 + 回车换行符(回车+换行)
零个或多个标题行+回车换行符
一个空白行,即回车换行符
一个可选的消息主体,比如文件、查询数据或查询输出
当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的。如下图是来自于浏览器端的重要头信息:
当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。从 Web 服务器端返回到浏览器的最有用的 HTTP 1.1 响应报头如下图:
现在我们分别来看一下 ServletRequest 和 ServletResponse 中有哪些方法是来查看或设置头部信息的:
1.HttpServletRequest
getHeader(String name) => String
getDateHeader(String name) => long
getIntHeader(String name) => int
getHeaderNames() => Enumeration<String>
getHeaders(String name)
2.HttpServletResponse
getHeader(String name) => String
getHeaderNames() => Enumeration<String>
getHeaders(String name)
setHeader(String name, String value);
setDateHeader(String name, long t);
setIntHeader(String name, int i);
Servlet请求包装和响应包装器
HttpServletRequestWrapper implements HttpServletRequest
HttpServletResponseWrapper implements HttpServletResponse
Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中
![](https://img-blog.csdnimg.cn/20200731110503120.png)
© 2020 10 - Guyu.com | 【版权所有 侵权必究】 |