JavaWeb--Servlet原理

一、什么是Servlet

  • Servlet就是一个java类,由服务器加载运行,由服务器创建它的对象,由服务器调用它的方法

  • jsp/servlet是java语言提供的开发web应用程序的技术、规范、标准

  • 在服务器端,servlet做了什么

    • 接收用户请求

    • 处理请求数据

    • genuine处理结果向用户响应数据

  • Servlet是javaweb的三大组件之一

    • 三大组件:Servlet、Filter(过滤器)、listener(监听器)

  • 关于Servlet的配置

    • url和servlet的映射关系

二、前后台交互的过程(自己会写)

  • 用户通过浏览器输入url,请求到登录页面,这里是一个完整的请求过程

  • 用户在登录页面填写用户名、密码,点击登录按钮,登录表单form中的action属性指向的url值就是处理表单数据的程序

    • 用户点击登录按钮,向服务器发起登录请求

    • web服务器接收到请求后,会拿到url中最后的资源路径(实际就是action的属性值),到web.xml中找相应的url-pattern

    • 找到对应的url-pattern后,根据其同标签的servlet-name,去找某个servlet标签下的servlet-name

    • 找到同名的servlet-name后,服务器根据同组servlet-class加载这个servlet类

    • 加载完成后实例化一个servlet对象来接收请求、处理请求、做出响应

三、HttpServletRequest

  • 代表请求,封装所有的请求数据,其对象request由服务器创建

  • 常用方法

    • 设置请求数据的编码格式(get不用设置,post需要设置)

      request.setCharacterEncoding("utf-8");

    • 获取请求数据

      1. String request.getParameter("参数的name属性值");

        • 比如:String uname = request.getParameter("uname");

        • 获取单个参数的value属性值

        • 不论前台页面提交的是什么类型,服务器接收到的都是String类型,如果需要其他数据类型,需要进行数据类型转换

      2. String[] request.getParameterValues("一组同名参数的name属性")

        • 比如:String[] hobbys = request.getParameterValues("hobby");

        • 获取一组同名的参数的value属性值,返回值是String数组

    • 获取请求方式

      request.getMethod();

      • 判断请求方式是GET还是POST

四、HttpServletResponse

  • 代表相应,封装了所有的响应数据,其对象response由服务器创建

  • 常用方法

    • 设置响应数据的编码格式

      response.setContentType("text/html;charset=utf-8");

      • 告诉浏览器响应的文档是html,编码格式是utf-8

    • 获取输出流

      PrintWrite pw = response.getWriter();
      //print()方法可以输出对象
      pw.print(new Date());
      pw.print("<h1>hello</h1>");
      //write()方法不能输出对象
      pw.write(new Date());//编译错误
      pw.flush();
      pw.close();

五、创建servlet的三种方式

  • 实现Servlet接口

    public class HelloServlet implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("Servlet被创建初始化");
        }
    ​
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    ​
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("servlet提供服务");
        }
    ​
        @Override
        public String getServletInfo() {
            return null;
        }
    ​
        @Override
        public void destroy() {
            System.out.println("servlet被销毁");
        }
    }
    • 在Servlet接口中定义了servlet生命周期方法

      • init():

        • servlet初始化方法

        • 在第一次访问servlet时,servlett才会被初始化

        • 一个servlet只能被初始化一次,就像一个人只出生一次

      • service():

        • servlet提供服务的方法,即接受请求、处理请求、做出响应的方法,可以接收任意方式的请求

        • 可以被调用多次

      • destroy():

        • servlet销毁方法

        • 在web服务器关闭时调用,只能调用一次,就像一个人只死亡一次

    • servlet的出生

      • 默认情况下,服务器会在servlet第一次被请求时,加载它,创建它的对象,而且一生只实例化一个对象

      • 比如:我们首次访问http://localhost:8080/hello时,服务器会根据url后的"/hello"在web.xml中找到与之对应的com.jxd.servlet.HelloServlet,然后创建它的对象,当我们第二次访问http://localhost:8080/hello时,服务器不会再创建它的对象,而是直接使用上次创建的对象

      • 在servlet对象被创建后,服务器会马上调用servlet的init()方法进行初始化,一个servlet的一生该方法只会被调用一次,我们可以把servlet的一些初始化方法放在init()中

      • 设置servlet随着服务器的启动而被创建

        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>com.jxd.servlet.HelloServlet</servlet-class>
            <!--设置servlet随着服务器的启动而被加载,里面的值为非负数,0的优先级最高-->
            <load-on-startup>0</load-on-startup>
        </servlet>

      • 一般不这样设置,因为这样会增加服务器的启动压力,服务器启动时需要加载的项过多

    • servlet的销毁

      • servlet不会轻易销毁,通常在关闭服务器的时候,servlet才会销毁

      • 服务器关闭时会调用destroy()方法,我们可以把servlet的临终遗言放在destroy()中,比如对某些资源的释放等代码可以放在destroy()中

    • 总结servlet的生命周期(重要

      • 第一次请求servlet时,服务器会创建它的对象,然后执行init()方法进行初始化,init()方法只能被调用一次,然后执行service方法提供服务

      • 再次访问servlet时,只会调用service()方法,该方法可以被调用多次

      • web服务器关闭时,会调用destroy()方法销毁servlet

  • 继承GenericServlet

    • 该类实现了Servlet接口,只需要重写service方法提供服务即可

  • 继承HttpServlet 比较常用的方式

六、ServletConfig接口

  • servlet的配置信息

  • init(ServletConfig servletConfig)

  • 在web.xml中为servlet配置一些初始化参数

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.jxd.servlet.HelloServlet</servlet-class>
        <!--为当前servlet添加初始化参数,只对当前servlet生效-->
        <init-param>
            <param-name>param1</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </servlet>

  • 当我们首次访问servlet时,web服务器会根据url找到相应的servlet,服务器在创建servlet对象时,会将servlet的配置信息(servlet的名字、初始化信息等等)封装到ServletConfig对象中,在调用init()方法时,会将ServletConfig对象传递给它,进而,我们可以通过ServletConfig对象获取到该Servlet的配置信息

    //获取servlet的初始化参数
    String param1 = servletConfig.getInitParameter("param1");
    System.out.println("param1的value是:" + param1);
    //获取servlet的别名
    String servletName = servletConfig.getServletName();
    System.out.println("servlet的名字是:" + servletName);
  • ServletConfig代表servlet的配置信息,对应的是web.xml中的<servlet></servlet>标签

  • 获取ServletConfig对象

    • 实现了Servlet接口的Servlet类

      • 在init(ServletConfig servletConfig)方法中,直接使用

    • 继承了HttpServlet的servlet类

      • 在doPost()或doGet()方法中通过this获取ServletConfig对象

        ServletConfig servletConfig = this.getServletConfig();

七、ServletContext接口

  • 设置全局变量

    <!--设置全局参数-->
    <context-param>
        <param-name>uname</param-name>
        <param-value>admin</param-value>
    </context-param>

  • 获取全局初始化参数

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext = this.getServletContext();
        String uname = servletContext.getInitParameter("uname");
        System.out.println(uname);
        ServletConfig servletConfig = this.getServletConfig();
    }

  • ServletContext在web服务器启动时就创建,在web服务器关闭时才销毁,和服务器同生共死

  • 放在该对象中的数据,会被此web应用的所有资源共享

  • 常用方法

    • 获取ServletContext对象

      //获取ServletContext对象
      ServletContext servletContext = this.getServletContext();
    • 获取web.xml中设置的全局变量

      String uname = servletContext.getInitParameter("uname");
    • 往ServletContext对象中存放数据

    • //往ServletContext中存放数据
      servletContext.setAttribute("msg","ServletContext");
    • 获取ServletContext对象中的数据,因为存进去的都是Object类型,所以获取到的也是Object类型,需要其他类型需要进行类型转换

    • //获取ServletContext中的参数
      String msg = (String) servletContext.getAttribute("msg");
      System.out.println("msg对应的信息是:" + msg);
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值