欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet

程序员文章站 2022-03-11 21:56:29
...

1.1 Servlet的基本概述

  • Servlet运行在服务端(Tomcat服务器)的java小程序,是Sun公司提供的一套规范,用来处理客户端请求、响应给浏览器的动态web资源技术。但Servlet的实质就是java程序,只不过Servlet程序实现了Servlet的接口而已,通过java的API动态的向客户端输出内容。
  • 任何类只要实现了Servlet接口,都可以称作为Servlet。

1.1.1 Servlet与普通的java程序的区别

  1.  普通的java类需要有main方法才可以运行,Servlet程序是由Tomcat服务器调用的,不需要main方法。
  2. 普通的java类不能接收用户的请求数据与响应数据给浏览器,Servlet可以接收用户的请求数据并且可以向浏览器输出数据。

 1.2 Servlet2.5实现HelloWorld的例子

  • 如果需要实现一个Servlet,那么只需要编写一个类实现Servlet的接口即可,任何类只要实现了Servlet的接口,都可以被称作为Servlet的程序。

 步骤

  • 1.先创建一个web的module。

Servlet

  •  2.项目的目录结构介绍:

Servlet

 

  •  3.在src目录下创建Servlet程序。自定义一个类实现Servlet接口,并且要实现Servlet接口的所有方法。
  • 4.那你的业务逻辑编写在Service方法内部,其它方法留空即可。
package com.sunny.web;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

/*
    request:代表了用户的请求,用户的所有请求信息都封装到该对象中。
    response:代表了服务器给浏览器的响应信息。
 */
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //需求:向浏览器输出:您好,Servlet
        //解决向浏览器输出中文乱码的问题
        servletResponse.setContentType("text/html;charset=utf-8");
        //通过response得到向浏览器输出的字符流对象
        PrintWriter out = servletResponse.getWriter();
        //使用流向浏览器输出数据
        out.write("helloworld");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
  • 5.在web.xml文件上配置Servlet与URL的映射路径。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
<!--配置Servlet的基本信息-->
    <servlet>
        <!--给Servlet起一个别名-->
        <servlet-name>demo01</servlet-name>
        <!--Servlet的完整路径 Servlet的完整路径=包名+类名-->
        <servlet-class>com.sunny.web.ServletDemo</servlet-class>
    </servlet>


    <!--配置Servlet的映射信息-->
    <servlet-mapping>
        <servlet-name>demo01</servlet-name>
        <!--配置Servlet的映射路径,映射路径一定要以“/”开头-->
        <url-pattern>/aaa</url-pattern>
    </servlet-mapping>
</web-app>
  • 6.让Tomcat关联模块(工程),部署项目。

 Servlet

Servlet

Servlet

  • 7.启动Tomcat服务器,并访问。 

 Servlet


2.1 Servlet3.0实现HelloWorld的例子

2.1.1 Servlet2.5与3.0的区别

  • Servlet3.0相较于Servlet2.5:新增了一些注解,简化了javaWeb代码开发,可以省略web.xml配置文件,支持异步处理(多线程技术)支持可插性特性(书写的代码编译后生产的class文件可以直接部署到其它项目的,自动加载执行)

2.1.2 代码实现Servlet3.0步骤:(注解配置Servlet) 

  • 步骤:1.创建web工程,选择JavaEE规范7及以上

Servlet

  •  2.自定义一个类实现Servlet接口,并且实现Servlet接口的所有方法。
  • 3.把自己业务逻辑编写在Srvice方法中。 
  • 4.使用webServlet注解配置Servlet的映射路径。
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/*
    配置Servlet的映射路径
    name就相当于Servlet-name别名,如果只有urlpattern存在的时候,可以省略urlpattern不写。
 */
@WebServlet(name = "demo",urlPatterns = "/abc")
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        PrintWriter out = servletResponse.getWriter();
        out.write("helloworld");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

5.部署项目 

Servlet

 6.启动Tomcat服务器,并访问

Servlet

 

 

Servlet

 6.启动Tomcat服务器并访问

Servlet

  •  

3.1Servlet的生命周期(在现实开发中基本上不会用到,面试题)

3.1.1 与Servlet生命周期相关的方法

方法 作用 运行次数
构造方法 在对象实例化的时候执行 1次
void init(ServletConfig servletConfig)
Servlet被创建的时候调用 1次
void service(ServletRequest servletRequest, ServletResponse servletResponse)
每次客户端请求都会执行 n次
void destroy()
在服务器关闭的时候 1次

3.1.2 Servlet的运行过程: 

  1. 浏览器发送请求,tomcat接收到请求的地址。通过请求地址找到访问哪个项目,通过最后/day27_02,找项目中所有的Servlet
  2. 通过反射读取每个Servlet中的注解值,匹配到/cicle,找到了需要访问的servlet。
  3. 通过反射实例化这个Servlet对象
  4. 创建request和response对象
  5. 并且调用service方法,将request和response对象传递进来。
  6. 执行servlet中的代码
  7. 将响应的信息封装成response对象返回到浏览器,在浏览器上显示出来。

Servlet

package com.sunny.lifecicle;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/cicle")
public class CycleServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet对象创建了,init方法被调用了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("用户请求过来了,调用了service方法");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("servlet对象被销毁了,destory方法被调用了");
    }
}

 


  1. init在Servlet创建的时候调用,Servlet对象是在第一次访问的时候创建。(只会调用一次)
  2. 每次用户的请求过来的时候都会调用service方法。(n次)
  3. 重新部署项目或是重启服务器的时候会调用destory方法。

面试题目:创建一个Servlet,该Servlet被访问了2次,请问init方法被调用了多少次,service方法被调用了多少次

 servlet的设计是采用单例设计模式,Servlet对象在内存中只有一个对象,所以不管你访问了Servlet多少次,都只会调用1次init方法。

1.init方法被调用了1次。

2.service方法被调用了2次。

  • Servlet运行原理的要点:
  1. Servlet对象由Tomcat服务器创建的。
  2.  request,response也是由Tomcat服务器创建的,而且request代表了请求信息,response代表了响应信息。
  3. service方法也是由Tomcat服务器调用的。

4.1Servlet的继承体系

4.1.1 Servlet继续体系的目的

  • 当创建Servlet 程序的时候,需要实现Servlet的接口,实现Servlet接口的时候需要把Servlet接口的所有方法都实现,但是我们只需要使用Service方法,所以创建的时候比较麻烦。

4.1.2 Servlet继承体系

  1.  Servlet接口。
  2. GenericServlet 该类实现了Servlet接口了。
  3. HTTPServlet对于get方式提交数据的时候调用了doGet方法,对于post方式提交的时候会调用doPost方法。

 4.1.3 GenericServlet代码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<h3>=======get方式提交======</h3>
<form action="/ServletTest04/test01" method="get">
    用户名:<input type="text" name="userName"/>
    <input type="submit" value="提交"/>
</form>


<h3>=======post方式提交======</h3>
<form action="/ServletTest04/test01" method="post">
    用户名:<input type="text" name="userName"/>
    <input type="submit" value="提交"/>
</form>



</body>
</html>
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/test01")
public class ServletDemo02 extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
       /* //解决中文乱码问题
        response.setContentType("text/html;charset=utf-8");
        //获取输出流
        PrintWriter out = response.getWriter();
        //向浏览器输出
        out.write("hello,GenericServlet");*/
        System.out.println("service方法被调用了...");
    }
}
  •  现象:不管是浏览器使用的get方式提交的数据还是post方式提交的数据,都会调用service方法处理。
  • 弊端:在实际开发的过程中有时候我们对于get与post的提交数据是有着不同的处理方式,比如:提交的数据是中文,如果需要解决中文乱码问题,那么get与post的解决方式就不一样。

 4.1.4 使用HTTPServlet创建

Servlet

Servlet 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletDemo03")
public class ServletDemo03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost方法被调用了...");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet方法被调用了...");
    }
}

5.1 修改Servlet的模板

Servlet

Servlet 

相关标签: Servlet