WEB前端(六)--Servlet

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对象。只调用一次。
WEB前端(六)--Servlet_第1张图片

Servlet调用过程

  1. 首先,客户机浏览器根据ip地址,找到要访问的服务器;连接上这台服务器;然后客户机的浏览器发送http请求头给服务器;
  2. 服务器收到请求头,以后分析协议请求头,得知客户机要访问的主机、web应用、哪一个资源 ;
  3. 服务器上的动态资源,都对应着一个servlet类, 如果该资源是 第一次 被外部访问,也就意味着servlet类是第一次被访问,那么,服务器会创建一个该Servlet类的一个对象 ,这个对象有生命周期方法,
  4. 创建完毕以后,自动执行init()方法,进行初始化; (只有这里,才会对 第一次 很在意),然后,服务器创建代表请求的ServletRequest对象;代表回应的ServletResponse对象,这时候的ServletResponse是 空的回应头; (这一步是每次访问都会执行)
  5. 接着调用servlet的service()方法,来响应客户机的请求 ;执行我们写的逻辑 ;
  6. Servlet对象将service()方法的处理结果返回;也就是将数据写到了ServletResponse对象中
  7. 服务器,发现ServletResponse对象中有数据了 ,就会从ServletResponse中取出数据,构建一个http响应头,回送给客户机;
  8. Servlet 通过调用 destroy() 方法终止

WEB前端(六)--Servlet_第2张图片

HttpServlet

WEB前端(六)--Servlet_第3张图片
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。

Servlet接口相关类型

  • ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;

WEB前端(六)--Servlet_第4张图片

  • ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;

WEB前端(六)--Servlet_第5张图片

  • ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的元素。

WEB前端(六)--Servlet_第6张图片

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。
WEB前端(六)--Servlet_第7张图片

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中就可以获取这个值,这就是共享数据了。
WEB前端(六)--Servlet_第8张图片

获取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中值变化等事件进行监听。

你可能感兴趣的:(servlet)