Servlet(详述、生命周期、处理用户的请求、单例设计模式、get、post请求、请求重定向和请求转发)

文章目录

  • Servlet
        • 1.什么是Servlet?
        • 2.Servlet的生命周期
        • 3.Servlet如何处理用户的请求 ?
        • 4.什么是单例?单例有哪些设计模式?
        • 5.servlet如何获取jsp的session和application对象?
        • 6.get请求和post请求的区别
        • 7.请求重定向与请求转发的区别

Servlet

1.什么是Servlet?

Servlet(Server Applet)是Java Servlet的简称,是运行在 Web 服务器或应用服务器上的小服务程序或服务连接器,用Java编写的服务器端程序,狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,我们将Servlet理解为后者;从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层;使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,交互式地浏览和生成数据,还可以生成动态Web内容。
Servlet(详述、生命周期、处理用户的请求、单例设计模式、get、post请求、请求重定向和请求转发)_第1张图片
简单说Servlet就是javax.servlet包中定义的接口。它声明了Servlet生命周期的三种基本方法:init(),service()和destroy()。它们由每个servlet(在SDK中定义或自定义)实现,并在特定时间由服务器调用。

2.Servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。

  • Servlet 通过调用 init () 方法进行初始化;
  • Servlet 调用 service() 方法来处理客户端的请求:service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可;
  • Servlet 通过调用 destroy() 方法终止(结束);
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
    Servlet(详述、生命周期、处理用户的请求、单例设计模式、get、post请求、请求重定向和请求转发)_第2张图片
    Servlet容器实质上是与Servlet交互的Web服务器的一部分:

Servlet(详述、生命周期、处理用户的请求、单例设计模式、get、post请求、请求重定向和请求转发)_第3张图片

代码演示:

//@WebServlet(value = "/HelloWorldServlet",loadOnStartup = 1)
// '/' 理解为是分隔符 ,分割的相对路径
@WebServlet(urlPatterns ={"/HelloWorldServlet","/Haha","/Hehe"} ,loadOnStartup = 1)
public class HelloWorldServlet extends HttpServlet {

    public HelloWorldServlet() {
        System.out.println("HelloWorldServlet的构造方法()");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行了HelloWorldServlet的service()...");
        super.service(req, resp);
    }

    //处理客户端的get请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行了HelloWorldServlet的doGet()...");
    }

    //处理客户端的post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //因为这里并没有给客户端返回任何的内容,那么客户端也没有输出任何内容。
        //resp.setContentType("text/html;charset=utf-8");
        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter out = resp.getWriter();

        System.out.println("执行了HelloWorldServlet的doPost()...");
        out.println("

我是服务器响应

"
); out.flush(); out.close(); } //关闭Tomcat服务器会执行destroy方法,但是jetty服务器不会,因为对于jetty服务器来讲,这种关闭,属于强制死亡。 @Override public void destroy() { System.out.println("HelloWorldServlet的destroy()"); } @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloWorldServlet的init()"); } }

通过浏览器访问三遍,你会发现,只有第一次访问时才会执行init()方法和构造方法。

3.Servlet如何处理用户的请求 ?

单例多线程(Thread A、Thread B…)的方式处理请求
即:服务器中可以存放多个不同的servlet,每个servlet可以被多个客户访问。
Servlet(详述、生命周期、处理用户的请求、单例设计模式、get、post请求、请求重定向和请求转发)_第4张图片

4.什么是单例?单例有哪些设计模式?

单例顾名思义就是程序运行中,最多只能有一个实例化的对象,即每次新new的对象的 hashCode 的值都是一样的
单例的设计模式:

  • 饿汉式;
  • 懒汉式等。

5.servlet如何获取jsp的session和application对象?

  • jsp九大内置对象:
    out,page,request,response,session,application,exception,pageContext,config
    常用的就是:request,response,session,application;
  • 通过 request.getSession 获取session;
  • 通过 request.getServletContext().setAttribute(“nation”,“china”) 获取application。

6.get请求和post请求的区别

get请求:

  • get是从服务器上获取数据的,get方式是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。也就是说,get的到的信息是资源,而不是资源的处理过程。
  • 请求的数据会附加在URL之后,以?分隔URL和传输数据,多个参数用&连接。URL编码格式采用的是ASCII编码,而不是Unicode,即所有的非ASCII字符都要编码之后再传输。
  • 因为URL的长度有限制,所以get方式传输的数据大小有所限制,传送的数据量不超过2KB。
  • get方式服务器端用Request.QueryString获取变量的值。
  • get方式传输的参数安全性低,因为传输的数据会显性显示在请求的URL中。

post请求:

  • 用来向目的服务器发出请求,要求它接收被附在请求后的实体,并把它当做请求队列中请求URL所指定资源的附加新子项。
  • post方式将表单内各个字段和内容放置在HTML HEADER中一起传送到Action属性所指定的URL地址,用户是看不到这个过程的。
  • post方式传送的数据量比较大,一般被默认为没有限制,但是根据IIS的配置,传输量也是不同的。
  • post方式在服务器端用Request.Form获取提交的数据。
  • post方式传输的数据安全性较高,因为数据传输不是明显显示的。

7.请求重定向与请求转发的区别

请求重定向(redirect):response.sendRedirect(url)

特点:

  • 有两次请求,地址栏会发生改变,request对象也会变。
  • request 里的属性无法保存。
  • 最常见的情形就是权限认证失败后,必须请求重定向到登录页面,重新登录。

请求转发(forward):request.getRequestDispatcher(url).forward(request,response)

特点:

  • 只有一次请求,地址栏不会发生改变,request对象不变,request 里的属性可以保存。
  • 有些非法公司可以通过转发来非法收取资金。

//下篇再见…谢谢

你可能感兴趣的:(JavaWeb)