Servlet(一)简单Servelt使用,直接实现Servlet接口,自定义service判断分发请求,配置servlet使用注解

一、简单Servelt使用

1.1 java文件


package com.demo01;

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

/**
 * @Description HttpServlet tomcat中的是http协议,servlet底层使用的是socket通信
 * @Package com.demo01
 * @ClassName MyServlet
 * @Data 2022-03-30 15:59
 * @Author peanut
 */
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应内容格式text/html(可以不写)
        //设置内容的编码格式utf-8
        //必须先设置编码格式再获取流对象,否则设置格式编码失效
        //有两种设置方式:方式1:resp.addHeader("content-type","text/html;charset=utf-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        //OutputStreamWriter osw  = new OutputStreamWriter(resp.getOutputStream(),"utf-8);
        writer.write("abc");
        writer.flush();
        writer.close();
    }
}

1.2 xml文件

### 1.3 xml文件
```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">
    <!--
        1、所用的请求都要注册servlet(每个servlet文件)
    -->
    <!--项目demo01的映射关系-->
    <servlet>
        <!--自定义起别名-->
        <servlet-name>servlet</servlet-name>
        <!--映射servlet类完整路径-->
        <servlet-class>com.demo01.MyServlet</servlet-class>
        <!--设置优先级-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--引用<servlet>中的别名-->
        <servlet-name>servlet</servlet-name>
        <!--完整路径:http://本机ip地址:端口号/部署时的根路径/servlet文件访问路径-->
        <!--设置servlet文件访问路径,只能以/或*开始-->
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>


    <!--项目demo02的映射关系-->
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.demo02.MyServlet</servlet-class>
        <!--设置servlet初始化参数-->
        <init-param>
            <!--参数value-key的方法进行存储-->
            <param-name>username</param-name>
            <param-value>小明</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123</param-value>
        </init-param>
        <!--设置优先级-->
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/demo02</url-pattern>
    </servlet-mapping>

</web-app>

二、直接实现Servlet接口

2.1 java文件

package com.demo02;

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

/**
 * @Description 直接实现Servlet接口
 * @Package com.Demo02
 * @ClassName MyServlet
 * @Data 2022-03-30 16:00
 * @Author peanut
 */
public class MyServlet implements Servlet {

    /**
     * servlet第一次加载的时候,会执行该方法
     *
     * @param servletConfig 这个是初始化参数,就是web.xml中<init-param>的参数
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //获取配置web.xml中的参数
        String username = servletConfig.getInitParameter("username");
        String password = servletConfig.getInitParameter("password");
        System.out.println("用户名:" + username);
        System.out.println("密码:" + password);

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("全部请求接收到了这里...");
    }

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

    @Override
    public void destroy() {

    }
}

三、自定义service判断分发请求

3.1 接收请求顺序

  1. servlet底层是由service接收所有类型的请求再进行判断分发

3.2 代码演示

package com.demo03;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Description 继承GenericServlet抽象类从service方法中判断是get或post请求,
 * 模拟源码get、post、put等请求方式的判断分发:所以servlet底层是由service接收所有类型的请求再进行判断分发
 * @Package com.demo03
 * @ClassName MyGenericServlet
 * @Data 2022-03-30 19:32
 * @Author peanut
 */
@WebServlet(name = "MGS", urlPatterns = "/demo03")
public class MyGenericServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("类:"+servletRequest.getClass().getName());
        //判断是否能实例化称为目标子类
        if (servletRequest instanceof HttpServletRequest && servletResponse instanceof HttpServletResponse) {
            //1、HttpServletRequest接口继承了ServletRequest接口
            //2、HttpServletRequest的实现类是RequestFacade
            //3、service方法中传的是RequestFacade实现类
            //4、HttpServletRequest含有默认getMethod()方法,RequestFacade也继承了该方法
            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse resp = (HttpServletResponse) servletResponse;
            //忽略判断是get还是post请求
            if (req.getMethod().equalsIgnoreCase("GET")) {
                doGet(req, resp);
            }
            if (req.getMethod().equalsIgnoreCase("POST")) {
                doPost(req, resp);
            }
        }

    }

    /**
     * 自定义get方法
     *
     * @param req
     * @param resp
     */
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("我是get请求");
    }

    /**
     * 自定post方法
     *
     * @param req
     * @param resp
     */
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("我是post请求");
    }
}

四、配置servlet使用注解

4.1 代码演示

package com.demo04;
import javax.servlet.ServletConfig;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description 1、基于注解的Servlet配置,省略web.xml配置
 * 2、name:MyServlet的名字,类似于<servlet-name>标签起的名字,在该类注解中可以省略
 * 3、urlPatterns相当于<servlet-pattern>,可以配置多个路径格式:urlPattern={"/...","/..."}
 * 4、一个@WebInitParam注解相当于一个<init-param>标签,name和value也分别对应
 * 5、loadStartup 相当于<load-on-startup>标签 设置的数字越小,优先级越高,当设置一个大于0的数字时,
 * Tomcat启动时servlet 就会被初始化(默认 -1 表示第一次访问的时候初始化)
 * @Package com.demo04
 * @ClassName MyServlet
 * @Data 2022-03-30 17:49
 * @Author peanut
 */
@WebServlet(name = "myServlet", urlPatterns = "/demo04", initParams = {@WebInitParam(name = "username", value = "小明"), @WebInitParam(name = "password", value = "123")}, loadOnStartup = 1)
public class MyServlet extends HttpServlet {

    /**
     * 1、init()无参构造,如果调用了这个方法,那么就要调用getServletConfig()获取ServletConfig配置信息
     * 但不能同时重写init的有参构造,因为init有参构造里面负责给ServletConfig全局赋值的,否则getServletConfig获取为null
     * 2、使用init有参构造则不用调用getServletConfig方法,直接方法参数里的值即可
     */
    @Override
    public void init() {
        ServletConfig servletConfig = getServletConfig();
        String username = servletConfig.getInitParameter("username");
        String password = servletConfig.getInitParameter("password");
        System.out.println("demo04用户名:" + username + " 密码:" + password);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("我是get请求...");
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT阿生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值