zoukankan      html  css  js  c++  java
  • Servlet基础

    1.Servlet概述

      Servlet是使用Java语言编写的运行在服务器端的程序,通常来说,Servlet是只所有实现了Servlet接口的类。 Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等。

      Servlet是由Servlet容器提供,Servlet容器是指提供了Servlet功能的服务器(如Tomcat)。Servlet容器会将Servlet动态加载到服务器上,然后通过HTTP请求和HTTP响应和客户端进行交互。

      ①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。

      ②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器。

     

    Servlet技术的特点:

      (1)方便:Servlet提供了大量的使用工具例程,如处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话等。

      (2)跨平台:Servlet使用Java类编写,可以在不同的操作系统平台和不用的应用服务平台运行。

      (3)灵活性和可扩展性强:采用Servlet开发的Web应用程序,由于Java类的继承性及构造函数等特点,使得应用灵活,可随意扩展。

     

    2.实现Servlet程序

      在前面,我们已经知道了servlet是什么,为什么需要servlet?(为了实现动态网页,而不是显示静态网页)

     (1)创建一个servletDemo1继承HttpServlet,重写doGet和doPost方法,也就是看请求的方式是get还是post,然后用不同的处理方式来处理请求。

     1 import java.io.IOException;
     2 import javax.servlet.ServletException;
     3 import javax.servlet.http.HttpServlet;
     4 import javax.servlet.http.HttpServletRequest;
     5 import javax.servlet.http.HttpServletResponse;
     6 
     7 public class servletDemo4 extends HttpServlet {
     8     private static final long serialVersionUID = 1L;
     9 
    10     public void doGet(HttpServletRequest request, HttpServletResponse response)
    11             throws ServletException, IOException {
    12         System.out.println("4");
    13     }
    15     public void doPost(HttpServletRequest request, HttpServletResponse response)
    16             throws ServletException, IOException {
    17         
    18     }
    19 }

      (2)在web.xml中配置servletDemo1,为什么需要配置?让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
     3   <servlet>
     4     <!-- 给servlet取名字,一般写的servlet类的名字 -->
     5     <servlet-name>servleDemo1</servlet-name>                            //3
     6     <!-- servlet的全限定类名,也就是servlet的位置 -->
     7     <servlet-class>com.itheima.servlet.ServleDemo1</servlet-class>      //4
     8   </servlet>
     9 
    10   <servlet-mapping>
    11     <!-- 跟上面的servlet名字相同 -->
    12     <servlet-name>servleDemo1</servlet-name>                   //2
    13     <!-- 浏览器通过url找到servle。 一定要加,相当于项目名称 -->
    14     <url-pattern>/demo1</url-pattern>                          //1
    15   </servlet-mapping>
    16   
    17   <welcome-file-list>
    18     <welcome-file>index.jsp</welcome-file>
    19   </welcome-file-list>
    20 </web-app>

    按照步骤,首先浏览器通过http://localhost:8080/项目名称/demo1来找到web.xml中的url-pattern,这就是第一步,匹配到了url-pattern后,就会找到第二步servlet的名字servletDemo1,知道了名字,就可以通过servlet-name找到第三步,到了第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。

      (3)部署应用到tomcat服务器

      (4)测试:http://locahost:8080/day08_servlet(项目名称)/demo1

    Servlet执行过程:

    3.Servlet的生命周期

    1、servlet的生命周期是什么?

        服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)

        该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

        最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

    实例化-->初始化-->服务->销毁

    1.初始化阶段:    出生:(实例化-->初始化)第一次访问Servlet就出生(默认情况下)

      当客户端向Servlet容器发送HTTP请求要求访问Servlet时,Servlet容器(Tomcat)首先会解析请求,检查内存中是否已经有核心的Servlet对象,如果有,则直接使用该Servlet对象,如果没有,则创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,早Servlet的整个生命周期内,它的init()方法只被调用一次。

    2.运行阶段:    活着:(服务)应用活着,servlet就活着

      这是Servlet生命周期最重要的阶段,在这个阶段中,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service() 方法。service() 方法从ServletRequest对象中获得客户请求消息并处理该请求,通过ServletRequest对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并创建新的ServletReq和ServletResponse对象,也就是说,service()方法在Servlet的整个声明周期中会被多次调用。

    3.销毁阶段:    死亡:(销毁)应用卸载了servlet就销毁。

      当服务器关闭或Web应用被移除容器时,Servlet随着Web应用的关闭而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个声明周期中,destroy()方法也智能被调用一次。

       需要注意的是:Servlet对象一旦创建就会驻留在内存中等待客户端的访问,知道服务器关闭或Web应用被移除容器时,Servlet对象才会被销毁。

    如何让servlet在服务器启动时就创建

    4.Servlet的三种创建方式

    (1)实现javax.servlet.Servlet接口;

    (2)继承javax.servlet.GenericServlet类(适配器模式)

    (3)继承javax.servet.HTTPServlet类(模板方法设计模式)

    小技巧:使生成的servlet更清新一些

    找到:MyEclipseCommonplugins目录

    把com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar复制到上面目录

    问题:(原文:https://www.cnblogs.com/whgk/p/6399262.html

    1、为什么创建的servlet是继承自httpServlet,而不是直接实现Servlet接口?

    2、servlet的生命周期中,可以看出,执行的是service方法,为什么我们就只需要写doGet和doPost方法呢?

    5.Servlet的线程安全

    Servlet对象是一个单实例的对象,并且在多线程的环境下运行,所以Servlet对象存在线程安全问题 。

      当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。

    解决线程安全问题的最佳办法,不要写全局变量,而写局部变量。

    6.ServletConfig和ServletContext

    (1)ServletConfig接口

      在运行Servlet程序时,可能需要一些辅助信息,例如,文件中使用的编码、使用Servlet程序的共享信息等,这些信息可以在web.xml文件中使用一个或多个<init-param>元素进行配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到Servlet的ServletConfig对象中,此时可调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。

    作用1:可以获取servlet配置信息

    作用2:可以获得ServletContext对象

    getServletName();  //获取servlet的名称,也就是在web.xml中配置的servlet-name;

    getServletContext(); //获取ServletContext对象;

    getInitParameter(String); //根据初始化参数名返回对应的初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数;

    getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型。

    注意:在上面我们所分析的源码过程中,我们就知道,其实可以不用先获得ServletConfig,然后在获取其各种参数,可以直接使用其方法,比如上面我们用的ServletConfig().getServletName();可以直接写成getServletName();而不用在先获取ServletConfig();了,原因就是在GenericServlet中,已经帮我们获取了这些数据,我们只需要直接拿就行。

    (2)ServletContext接口

      当Tomcat启动时,Tomcat会为每个Web应用创建唯一一个ServletContext对象代表当前的Web应用,该对象封装了当前Web用于的所有信息。可以利用该对象获取Web应用程序的初始化、读取资源文件等。

    (原文:https://www.cnblogs.com/whgk/p/6399262.html

      获取途径:getServletContext(); 、getServletConfig().getServletContext();  //这两种获取方式的区别就跟上面的解释一样,第一种是直接拿,在GenericServlet中已经帮我们用getServletConfig().getServletContext();拿到了ServletContext。我们只需要直接获取就行了,第二种就相当于我们自己在获取一遍,两种读是一样的。

      功能:tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。

      1、web项目中共享数据,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

          setAttribute(String name, Object obj) 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到

          getAttribute(String name) 通过指定名称获得内容

          removeAttribute(String name) 通过指定名称移除内容 

     

      2、整个web项目初始化参数 //这个就是全局初始化参数,每个Servlet中都能获取到该初始化值

            getInitPatameter(String name)  //通过指定名称获取初始化值

            getInitParameterNames()  //获得枚举类型

             web.xml 配置 整个web项目的初始化

    3、获取web项目资源

       获取web项目下指定资源的路径:getServletContext().getRealPath("/WEB-INF/web.xml")

                                                                     String  getRealPath(String path);//根据资源名称得到资源的绝对路径.  可以得到当前应用任何位置的任何资源。

      获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(java.lang.String path)

    4、getResourcePaths(java.lang.String path)  指定路径下的所有内容

    5.实现Servlet的转发

      RequestDispatcher getRequestDispatcher(String path) ;//参数表示要跳转到哪去

    2018-09-24 10:46:58

  • 相关阅读:
    DVWA 黑客攻防演练(十)反射型 XSS 攻击 Reflected Cross Site Scripting
    DVWA 黑客攻防演练(九) SQL 盲注 SQL Injection (Blind)
    DVWA 黑客攻防演练(八)SQL 注入 SQL Injection
    DVWA 黑客攻防演练(七)Weak Session IDs
    DVWA 黑客攻防演练(六)不安全的验证码 Insecure CAPTCHA
    DVWA 黑客攻防演练(五)文件上传漏洞 File Upload
    工作流表结构设计
    Visual Studio 2019尝鲜----新建空项目体验
    《使用CSLA 2019:CSLA .NET概述》原版和机译文档下载
    .NET快速开发平台的在线预览
  • 原文地址:https://www.cnblogs.com/qqiua/p/9689517.html
Copyright © 2011-2022 走看看