Servlet
Servlet是由SUN公司提供的一门动态Web资源开发技术。
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据
- 处理请求
- 完成响应
实现Servlet的方式
- 实现javax.servlet.Servlet接口(不方便);
- 继承javax.servlet.GenericServlet类(不方便);
- 继承javax.servlet.http.HttpServlet类(方便);
Servlet接口
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
创建准备JavaWeb应用所需内容:
- 创建/WEB-INF目录
- 创建/WEB-INF/classes目录
- 创建/WEB-INF/lib目录
- 创建/WEB-INF/web.xml文件
完成一个Servlet需要两步
编写Servlet类
public class HelloServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {}
public ServletConfig getServletConfig() {return null;}
public void destroy() {}
public String getServletInfo() {return null;}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("hello servlet!");
}
}
在web.xml文件中配置Servlet
hello
cn.itcast.servlet.HelloServlet
hello
/helloworld
Servlet生命周期
1、实例化 在第一次访问servlet的时候创建servlet对象,只调用一次。证明servlet对象在Tomcat中是单例。
2、初始化init()方法 创建完servlet对象的时候调用,只调用1次。
3、服务service()方法 每次发出请求是调用。调用N次
4、销毁 destroy()方法 销毁servlet对象的时候调用,停止服务器或者重新部署web应用时销毁servlet对象。只调用一次。
Servlet调用过程
- 首先,客户机浏览器根据ip地址,找到要访问的服务器;连接上这台服务器;然后客户机的浏览器发送http请求头给服务器;
- 服务器收到请求头,以后分析协议请求头,得知客户机要访问的主机、web应用、哪一个资源 ;
- 服务器上的动态资源,都对应着一个servlet类, 如果该资源是 第一次 被外部访问,也就意味着servlet类是第一次被访问,那么,服务器会创建一个该Servlet类的一个对象 ,这个对象有生命周期方法,
- 创建完毕以后,自动执行init()方法,进行初始化; (只有这里,才会对 第一次 很在意),然后,服务器创建代表请求的ServletRequest对象;代表回应的ServletResponse对象,这时候的ServletResponse是 空的回应头; (这一步是每次访问都会执行)
- 接着调用servlet的service()方法,来响应客户机的请求 ;执行我们写的逻辑 ;
- Servlet对象将service()方法的处理结果返回;也就是将数据写到了ServletResponse对象中;
- 服务器,发现ServletResponse对象中有数据了 ,就会从ServletResponse中取出数据,构建一个http响应头,回送给客户机;
- Servlet 通过调用 destroy() 方法终止
HttpServlet
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
Servlet接口相关类型
- ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
- ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
- ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的
元素。
ServletRequest和ServletResponse
ServletRequest和ServletResponse是Servlet#service() 方法的两个参数,一个是请求对象,一个是响应对象,可以从ServletRequest对象中获取请求数据,可以使用ServletResponse对象完成响应。你以后会发现,这两个对象就像是一对恩爱的夫妻,永远不分离,总是成对出现。
ServletRequest和ServletResponse的实例由服务器创建,然后传递给service()方法。如果在service() 方法中希望使用HTTP相关的功能,那么可以把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse。这也说明我们经常需要在service()方法中对ServletRequest和ServletResponse进行强转,这是很心烦的事情。不过后面会有一个类来帮我们解决这一问题的。
GenericServlet
GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。
HttpServletRequest方法:
- String getParameter(String paramName):获取指定请求参数的值;
- String getMethod():获取请求方法,例如GET或POST;
- String getHeader(String name):获取指定请求头的值;
- void setCharacterEncoding(String encoding):设置请求体的编码!因为GET请求没有请求体,所以这个方法只只对POST请求有效。当调用request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用!
HttpServletResponse方法:
- PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如
response.getWriter().print(“
Hello JavaWeb!
”); - ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片;
- void setCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调用
setCharacterEncoding(“utf-8”);
之后,再response.getWriter()获取字符响应流对象,这时的响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端; - void setHeader(String name, String value):向客户端添加响应头信息,例如
setHeader(“Refresh”, “3;url=http://www.baidu.com”)
,表示3秒后自动刷新到http://www.baidu.com; - void setContentType(String contentType):该方法是
setHeader(“content-type”, “xxx”)
的简便方法,即用来添加名为content-type响应头的方法。content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”)
,如果响应数据为文本类型,那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)
表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)
方法; - void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:
response(404, “您要查找的资源不存在!”)
。
ServletContext
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。
获取ServletContext对象
- ServletConfig中的getServletContext()方法
- GenericServlet中的getServletContext()方法
- HttpSession中的getServletContext()方法
- ServletContextEvent中的getServletContext()方法
ServletContext是JavaWeb四大域对象之一:
- PageContext;
- ServletRequest;
- HttpSession;
- ServletContext;
Servlet必须掌握的其他知识
forward() 与redirect()的区别?
1. getRequestDispatch().forward() 请求转发跳转发生在服务器<容器>因此可以取得,浏览器不知道请求被转发了,所以地址栏上不会看到变化,sendRedirect发生在浏览器,要求浏览器重新请求另一个URL,故又称为重定向,地址栏上会显示URL的变更。
2. 如果希望下一个页面可以使用此属性,用getRequestDispatch
3. 如果session.setAtrribute(“name”,“aa”) 如果希望下一个页面可以使用属性,两个方法都可以用,但是建议使getRequestDispatch
4. 如果希望跳转到本网站外的URL,只能用sendRedirect
什么时候调用doGet和doPost
1.Serlvet接口只定义了一个服务方法就是service,而HttpServlet类实现了该方法并且要求调用下列的方法之一:
2.doGet:处理GET请求
3.doPost:处理POST请求
4.当发出客户端请求的时候,调用service 方法并传递一个请求和响应对象。Servlet首先判断该请求是GET 操作还是POST 操作。然后它调用下面的一个方法:doGet 或 doPost。如果请求是GET就调用doGet方法,如果请求是POST就调用doPost方法。doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。
页面间对象传递的方法是什么
1.在要传递值的页面,Response.sendRedirect(url)
2.session
3.cookie
4.applicaiton
5.request.serAttribute(“uname”,u);
6.request.getRequestDispacther(“/…/…”)
共享数据在web中的范围(四种会话跟踪技术)
(1).page:仅在当前页可用(保存在当前的PageContext中)
(2).request:仅用于当前客户端的请求(保存在ServletRequest对象中),它在同一个请求范围内有效.
(3).session:仅在当前的HttpSession的生命周期内,当前浏览器窗口的整个生存期都有效.关闭浏览器时,这个对象会跟着消失,在整个对话期间都有效.
(4).application:在整个应用范围内都有效,只有当服务器重启时,这个对象才会消失.
JSP和Servlet的区别
1.JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成擅长于流程控制和事务处理而通过Servlet来生成动态网页;JSP由HTML代码和JSP标签构成,可以方便地编写动态网页
2.因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模3.JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
Cookie 和Session
Cookie:服务器在客户端保存用户的信息
Session:服务器可以为每个用户浏览器创建一个会话对象
谈谈Servlet过滤器的作用?
Servlet是特殊的Servlet,能够对特定的请求路径进行过滤,在访问这个路径之前,先执行过滤器,过滤器进行预处理,过滤器决定是否继续执行后续的文件。典型的应用,可以把用户验证的代码写在过滤器中,然后把过滤的路径配制成需要验证的文件的路径。
谈谈Servlet监听器的作用
Servlet监听器对特定的事件进行监听,当产生这些事件的时候,会执行监听器的代码。可以对应用的加载、卸载,对session的初始化、销毁,对session中值变化等事件进行监听。