Servlet学习笔记(一)

Servlet

一、Servlet概述

1.1什么是Servlet

  • Servlet是JavaEE规范之一。规范就是接口

  • Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。

  • Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端

1.2 实现Servlet程序

1.2.1 创建WEB项目操作————idea 2021版本

  • 点击确认后即可创建成功
1.2.2 手动实现第一个Servlet程序
  • 编写一个类去实现Servlet接口
  • 实现service方法,处理请求,并响应数据
  • 到web.xml中去配置servlet程序的访问地址

Servlet程序的示例代码:

import javax.servlet.*;
import java.io.IOException;
//实现Servlet接口后并重写他的五个方法,这五个方法的含义后面会说
public class MyServlet 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 {
    System.out.println("HelloServlet被访问了");
  }

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

  @Override
  public void destroy() {

  }
}

web.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--servlet标签给Tomcat配置Servlet程序-->
    <servlet>
        <!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class是Servlet程序的全类名-->
        <servlet-class>com.LIUli.Servlet.MyServlet</servlet-class></servlet>
    <!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern标签配置访问地址
/斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello表示地址为:http://ip:port/工程路径/hello<br/>-->
        <url-pattern>/hello</url-pattern></servlet-mapping></web-app>
  
1.2.3 Servlet常见的错误
  • url_patten中配置的路径没有以**”/“**打头:

  • ②servlet-name配置的值不存在

  • Servlet-class标签的全类名配置错误:

  • lib文件的位置放错,要放在web-inf

1.3 url地址到Servlet程序的访问

1.4 Servlet的生命周期

  • 1、执行Servlet构造器方法

  • 2、执行init()初始化方法

    第一、二步,是在第一次访问,的时候创建Servlet程序会调用。

  • 3、执行service()方法

    第三步,每次访问都会调用。

  • 4、执行destroy()销毁方法

    第四步,在web工程停止的时候调用

1.5 GET和POST请求的分发处理

publicvoidservice(ServletRequestservletRequest,ServletResponseservletResponse)throwsServletException,IOException{
//类型转换(因为它有getMethod()方法)
HttpServlet RequesthttpServletRequest=(HttpServletRequest) servletRequest;
//获取请求的方式String method=httpServletRequest.getMethod();
if("GET".equals(method)){
doGet();
}elseif("POST".equals(method)){
doPost();
}
}
/***做get请求的操作*/
public void doGet(){
System.out.println("get请求");
System.out.println("get请求");
}
/***做post请求的操作*/
public void doPost(){
System.out.println("post请求");
System.out.println("post请求");
}
}

1.6通过继承HttpServlet实现Servlet程序

  • 在继承HttpServlet实现Servlet程序之前,我们需要在外部库里先导入Tomcat
  • 如果不进行上述操作,可能会出现无法继承HttpServlet

一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序。

  • 编写一个类去继承HttpServlet类

  • 根据业务需要重写doGet或doPost方法

  • 到web.xml中的配置Servlet程序的访问地址

Servlet类的代码:

class HelloServlet extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("执行了HelloServlet的doPost方法 ");
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("执行了HelloServlet的doGet方法 ");
  }
}

web.xml中的配置:

 <servlet>
<servlet-name>HelloServlet</servlet-name>
 <servlet-class>com.LIUli.Servlet.HelloServlet</servlet-class>
</servlet>  

 <servlet-mapping>
   <servlet-name>HelloServlet</servlet-name>
   <url-pattern>/helloServlet</url-pattern>
</servlet-mapping>

1.7 Servlet类的继承体系

二、ServletConfig类

ServletConfig类从类名上来看,就知道是Servlet程序的配置信息类。

Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。

Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。

2.1 ServletConfig类的三大作用

  • 可以获取Servlet程序的别名servlet-name的值
  • 获取初始化参数init-param
  • 获取ServletContext对象

web.xml中的配置:

<!--servlet标签给Tomcat配置Servlet程序-->
    <servlet>
        <!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class是Servlet程序的全类名-->
        <servlet-class>com.LIUli.Servlet.MyServlet</servlet-class>
<!--init-param是初始化参数-->
  <init-param>
 <!--是参数名-->
  <param-name>username</param-name>
  <!--是参数值-->
   <param-value>root</param-value>
  </init-param>
  <!--init-param是初始化参数-->
 <init-param>
<!--是参数名-->
 <param-name>url</param-name>
  <!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
</servlet>
    <!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern标签配置访问地址
/斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello表示地址为:http://ip:port/工程路径/hello<br/>-->
        <url-pattern>/hello</url-pattern></servlet-mapping>

Servlet中的代码

@Override
public void init(ServletConfigservletConfig) throws ServletException{
    System.out.println("2init初始化方法");
    
    
    //1、可以获取Servlet程序的别名servlet-name的值
    System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
    //2、获取初始化参数init-param
    System.out.println("初始化参数username的值是;"+servletConfig.getInitParameter("username"));
    System.out.println("初始化参数url的值是;"+servletConfig.getInitParameter("url"));
    //3、获取ServletContext对象
    System.out.println(servletConfig.getServletContext());

三、ServletContext类

3.1 ServletContext概述

  • 1、ServletContext是一个接口,它表示Servlet上下文对象

  • 2、一个web工程,只有一个ServletContext对象实例。

  • 3、ServletContext对象是一个域对象。

  • 4、ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。

什么是域对象?

域对象,是可以像Map一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个web工程。

域对象取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

3.2 ServletContext类的四个作用

  • 获取web.xml中配置的上下文参数context-param
  • 获取当前的工程路径,格式:/工程路径
  • 获取工程部署后在服务器硬盘上的绝对路径
  • 像Map一样存取数据

ServletContext演示代码:

@WebServlet(name = "ServletDemo", value = "/ServletDemo")
public class ServletDemo extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("小飞棍来了");
    System.out.println("/demo1,收到请求了");
    String str = "zhangsan";
    //域对象,就是来共享数据。
    //获取全局域对象
    ServletContext servletContext = this.getServletContext();
    //往域中存储数据
    servletContext.setAttribute("name", str);
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  }
}


@WebServlet(value = "/demo2", name = "ServletDemo2")
public class ServletDemo2 extends HttpServlet {
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("/demo2,收到请求了");

    //我要取到 /demo1 中数据
    ServletContext servletContext = this.getServletContext();
    Object name = servletContext.getAttribute("name");
    System.out.println(name);


    //手动销毁数据
    servletContext.removeAttribute("name");
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
  }
}

动态获取服务器路径

  //我在我们项目的三个地方,放了三个文件
    //src 目录下放了一个 a.txt
    //web 目录下放了一个 b.txt
    //web/WEB-INF 下 放了一个 c.txt

/* getRealPath():
				 1. web下:项目根目录下
                2. WEB - INF下:项目根目录下 / WEB - INF
                3. src下:项目根目录下 / WEB - INF / classes*/

    ServletContext servletContext = this.getServletContext();
    //获取服务器的真实路径
   // F:\JAVA\LI2\GuoQingWebDay01\out\artifacts\GuoQingWebDay01_war_exploded\
    String realPath = servletContext.getRealPath("/");

    System.out.println(realPath);
    
    FileInputStream in = new FileInputStream(servletContext.getRealPath("/WEB-INF/classes/a.txt"));
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String s = reader.readLine();
    System.out.println(s);

    System.out.println(in);

    FileInputStream in2 = new FileInputStream(servletContext.getRealPath("/b.txt"));

    System.out.println(in2);
    

    FileInputStream in3 = new FileInputStream(servletContext.getRealPath("/WEB-INF/c.txt"));
    System.out.println(in3);
  }

web项目中,一个普通的类(不是Servlet)他怎么读取配置文件

//普通的类(不是Servlet),他只能读取放在src下的位置文件,其他两个地方读不到
        //src下的文件,编译完之后,就放在项目的 classes 目录下 这个目录叫做类路径
        //方式1:
        InputStream in = MyUtils.class.getClassLoader().getResourceAsStream("a.txt");

        System.out.println(in);

        System.out.println("=====================================");
        //方式2:

        //1.获取该类对应的类加载器对象    //反射
        ClassLoader loader = MyUtils.class.getClassLoader();
        //2.获取文件运行的真实路径
        URL url = loader.getResource("a.txt");
        //获取路径
        String path = url.getPath();
        System.out.println(path);

        FileInputStream fileInputStream = new FileInputStream(path);

        System.out.println(fileInputStream);


        String realPath = servletContext.getRealPath("/");
        System.out.println(realPath);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值