什么是 Servlet?




什么是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基本流程:

  1. 开发一个类,继承 HttpServlet, 重写 doGet 方法
  2. 在 web.xml中,去配置这个 Servlet
  3. 部署到Tomcat容器中
  4. 启动Tomcat
  5. 打开浏览器,发送请求,查看响应



Servlet的生命周期

也就是指Servlet从创建到销毁的全过程。

    1. 当请求来到时,容器会根据请求的 url 来判断由哪个Servlet来响应
    1. 容器会判断当前应用中的Servlet是否使用了 load-on-startup选项,如果有加了此选项的
      Servlet,则根据load-on-startup的值来先后创建这些Servlet,并调用它们的init方法。

当然,对于没有加 load-on-startup选项的servlet,则
判断此Servet实例是否已经存在?

	如果不存在,容器就会创建这个Servlet的实例【只创建一次】,并执行它的init方法,[只执行1次]
	这个实例并交由容器管理。
	如果存在,则执行此Servlet的 service 方法【每次请求都会执行1次】
    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();


转发和重定向的区别?

  1. 请求转发时,地址栏中的地址是不变化的,因为请求是同一个;
    重定向时,地址栏中的地址是变化的,因为请求是新的请求。

  2. 请求转发时,可以从 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:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中

© 2020 10 - Guyu.com | 【版权所有 侵权必究】
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值