Servlet技术
Servlet概述
Servlet是JavaWeb的三大组件之一,它属于动态资源。
Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据;
处理请求;
完成响应;
Servlet与JSP
JSP是另外一种方式实现的Servlet,Servlet是JSP的早期版本,JSP更加注重页面的表现,而Servlet中则更注重业务逻辑的实现。
编写的页面显示效果比较复杂时,首选是JSP。或者在开发过程中,HTML代码经常发生变化,而Java代码则相对比较固定时,可以选择JSP。而在处理业务逻辑时,首选则是Servlet。
JSP只能处理浏览器的请求,而Servlet则可以处理一个客户端的应用程序请求。因此,Servlet加强了Web服务器的功能。
Servlet是纯java代码编写,可以方便调用java的其他组件;JSP是将java代码嵌入到HTML代码中,更容易生成复杂的HTML。
Servlet工作原理
(1) Web服务器(Servlet容器)接收到客户端请求,容器创建“请求和响应”对象,并判断请求的Servlet对象是否存在。
(2) 如果存在,则之间调用此Servlet对象的Service方法(间接调用doPost或doGet等方法),并将“请求和响应”对象作为参数传递。
(3) 如果不存在,容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法进行初始化,之后调用Service方法。
(4) 在Service方法中,通过请求对象获取客户端提交的数据并处理,然后通过响应对象将处理结果返回给客户端。
Servlet创建过程
Servlet生命周期
初始化阶段:调用init()方法。Servlet对象被创建时,由容器调用此方法对该对象进行初始化。
响应客户请求阶段:调用service()方法。对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的HttpServletRequest对象和HttpServletResponse对象,然后调用 Servlet 的service方法。
终止阶段:当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用 Servlet的destroy方法。在destroy方法中,可以释放Servlet所占用的资源。
Servlet主要接口及实现类
javax.servlet.Servlet接口
Servlet接口的基本目标是提供生命周期方法
javax.servlet.ServletConfig接口
用于在初始化时从Servlet容器中读取其他配置信息
getInitParameter(String name):根据给定的初始化参数名,返回匹配的初始化参数值。
getInitParameterNames():返回一个Enumeration对象,里面包含了所有的初始化参数名。
getServletContext():返回一个ServletContext对象。
getServletName():返回Servlet的名字
javax.Servlet.GenericServlet类
实现了javax.servlet.Servlet接口和javax.servlet.ServletConfig接口的抽象类,它处service()方法外的所有接口方法做了缺省实现。
javax.Servlet.http.HttpServlet类
HttpServlet类是Servlet API提供的一个专用于HTTP协议的类, 该类是GenericServlet类的子类,在GenericServlet类的基础上进行了一些针对HTTP特点的扩充。它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
HttpServletRequest和HttpServletResponse接口
分别继承自javax.servletRequest和javax.servletResponse接口
javax.servlet.http.HttpServletRequest接口
javax.servlet.http.HttpServletResponse接口
ServletContext接口(servlet上下文)
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象包含Web应用中所有 Servlet 在 Web 容器中的一些数据信息。ServletContext随着Web应用的启动而创建,随着 Web 应用的关闭而销毁。一个 Web 应用只有一个ServletContext 对象。
ServletContext中不仅包含了 web.xml 文件中的配置信息,还包含了当前应用中所有Servlet可以共享的数据。可以这么说, ServeltContext 可以代表整个应用,所以ServletContext有另外一个名称:application。
Servlet初始化时,Web容器将初始化一给Servlet,当前ServletContext包含在ServletConfig对象;利用上下文对象,可以存储应用级数据(如网站的访问人数),可为所有用户共享。
在Servlet中获取ServletContext对象:
void init(ServletConfig config)中:
ServletContext context =config.getServletContext();
ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;
在GenericeServlet或HttpServlet中获取ServletContext对象:
GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
JavaWeb四大域对象
PageContext;
ServletRequest;
HttpSession;
ServletContext;
ServletContext对象方法:
void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行
void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
Enumeration getAttributeNames():获取所有域属性的名称;
Servlet与客户端进行通信
Servlet与客户端的交互主要通过doXXX方法或Service方法中传入的request对象和response对象。
通过request对象不但可以获取客户端提交的信息,还可以获得会话对象session进行会话管理;
通过response对象完成对客户端的响应。
通过request对象获取请求信息以及转发请求
request对象保存了用户的请求信息,通过此对象可以获取用户提交的数据。该对象的使用和JSP的内置对象request的使用方法完全相同。
请求转发或请求包含,都表示由多个Servlet共同来处理一个请求。
RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
rd.forward(request, response) ;
RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
rd.include (request, response);
对session进行操作
在Servlet中,容器没有直接将会话对象传入,而是将会话对象绑定到request对象中。在Servlet总要管理会话首先必须通过如下方法来获取会话对象:
public HttpSession getSession() 获得会话对象,若不存在则建立
public HttpSession getSession(boolean create) 获得会话对象,则根据参数create觉得是否建立会话对象,若为true则创建,否则不创建返回一个空对象。得到会话对象后,会话管理和JSP内置对象session相同。
通过response对象对用户进行响应
JSP和Servlet中都通过response对象来对客户端做出响应的。但Servlet中没有传入输出流对象,若要向客户端输出信息首先要通过response对象获得输出流对象,方法如下:
PrintWriter out = response.getWriter();
在Servlet中,使用out对象向客户端输出信息之前必须执行下面两个方法:
response. setContentType(“text/html;charset=UTF-8”);
设置响应的内容类型和编码,将“UTF-8”指定为工程所采用的编码即可。
response.setCharacterEncoding(“UTF-8”);
设置response对象的编码。
若没有设置相应编码,在浏览器中可能会显示乱码。
对Cookie进行操作
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。
当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
Cookie的创建
Cookie myCookie = new Cookie(“username”,“张三”);
通过response对象使用Cookie
response.addCookie(myCookie);
Cookie对象获取
Cookie[] cookies=request.getCookie();
Cookie不只是有name和value,还有在客户端的有效时间,可以设置Cookie的有效时间。
setMaxAge(int)