Java Day16 Servlet(二)

news2024/11/15 23:34:22

Servlet

  • 1、继承结构
  • 2、ServletConfig对象
  • 3 、ServletContext
    • 3.1 获得路径
    • 3.2 域对象相关API
  • 4、HttpServletRequest
    • 4.1 获得请求行和请求头相关api
    • 4.2 请求中键值对相关api

1、继承结构

顶级Servlet接口

//初始化
 void init(ServletConfig var1) throws ServletException;
//得到配置内容 ServletConfig对象
    ServletConfig getServletConfig();
//处理用户请求的方法
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
//返回Servlet字符串描述信息的方法
    String getServletInfo();
//销毁方法
    void destroy();

GenericServlet 抽象类 一些实现的方法

   private transient ServletConfig config;
   //返回配置类对象
     public ServletConfig getServletConfig() {
        return this.config;
    }
    //初始化 可以将配置信息添加到当前实例中,实例化时 初始化使用的是该函数
 public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();//调用无参的init方法
    }
//我们要初始化的是无参的init方法,这样可以不用管config对象,也可以定义自己需要实现的init方法
    public void init() throws ServletException {
    }

HttpServlet 抽象类

//实现了service方法,将Servlet对象强转为HttpServlet对象。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException(lStrings.getString("http.non_http"));
        }

        this.service(request, response);
    }

如果我们继承了Httpserlet 可以重写service方法,也可以重写doget或者dopost等方法。

2、ServletConfig对象

为Servlet提供初始配置参数的一种对象,每个Servet都有自己独立唯一的Servletconfig对象。容器会为每个Servlet实例化一个Servletconfig对象,并通过Servlet生命周期的init方法传入给serviet作为属性。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.cky.servlet.UserServlet</servlet-class>
        <init-param>
            <param-name>kaya</param-name>
            <param-value>valuea</param-value>
        </init-param>
        <init-param>
            <param-name>kayb</param-name>
            <param-value>valueb</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/userservlet</url-pattern>
    </servlet-mapping>
</web-app>
package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//配置多个url路径 使用value 是一样饿效果
//@WebServlet(urlPatterns ={"/s1","/s2"})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig=this.getServletConfig();
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String s = initParameterNames.nextElement();
            System.out.println(s); //kaya
                                   // kayb
        }
    }
}

注解方式

package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//配置多个url路径 使用value 是一样饿效果
@WebServlet(urlPatterns ={"/s1","/s2"},
        initParams = {@WebInitParam(name ="kaya",value = "vlauea"),
        @WebInitParam(name="keyb",value = "vb")})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig=getServletConfig();
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            String s = initParameterNames.nextElement();
            String initParameter = servletConfig.getInitParameter(s);
            System.out.println(s+"--->"+initParameter);//keyb--->vb
                                                        //kaya--->vlauea
        }
    }
    }


3 、ServletContext

Servletcontext对象有称呼为上下文对象,或者叫应用域对象(后面统一讲解域对象)。容器会为每个app创建一个独立的唯-的Servletcontext对象
ServletContext对象为所有的Servlet所共享
ServletContext可以为所有的Servlet提供初始配置参数
在这里插入图片描述

package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//配置多个url路径 使用value 是一样饿效果
//@WebServlet(urlPatterns ={"/s1","/s2"})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletContext servletContext=this.getServletContext();
        ServletContext servletContext=getServletContext();

        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String s = initParameterNames.nextElement();
            String initParameter = servletContext.getInitParameter(s);
            System.out.println(s+"-->"+initParameter); //code-->i
        }
    }
}


    <context-param>
        <param-name>code</param-name>
        <param-value>i</param-value>
    </context-param>

3.1 获得路径

package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//配置多个url路径 使用value 是一样饿效果
//@WebServlet(urlPatterns ={"/s1","/s2"})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletContext servletContext=this.getServletContext();
        ServletContext servletContext=getServletContext();
      //获得文件的部署路径  在磁盘中目录位置
        String upload = servletContext.getRealPath("upload");// E:\java_code\web_all\out\artifacts\web02_war_exploded\upload
        System.out.println(upload);
        //获得项目的上下文路径 / 访问路径
        String contextPath = servletContext.getContextPath();
        System.out.println(contextPath); // web02
    }
    }


在这里插入图片描述

3.2 域对象相关API

ServletContext 是最大的一个域对象,应用中所有的Servlet共享域对象中的内容。
在这里插入图片描述

package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//配置多个url路径 使用value 是一样饿效果
@WebServlet(urlPatterns ={"/s1","/s2"},
        initParams = {@WebInitParam(name ="kaya",value = "vlauea"),
        @WebInitParam(name="keyb",value = "vb")})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext=getServletContext();
        servletContext.setAttribute("ka",2);

    }
    }


package com.cky.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(urlPatterns ={"/s3",})
public class UserServlet1  extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext=getServletContext();
        int ka = (int)servletContext.getAttribute("ka");
        System.out.println(ka);  //2
    }
}

先运行UserServlet 设置值,之后运行UserServlet1获得属性值,如果先执行UserServlet1,会获得null。

4、HttpServletRequest

4.1 获得请求行和请求头相关api

package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//配置多个url路径 使用value 是一样饿效果
@WebServlet(urlPatterns ={"/s1","/s2"},
        initParams = {@WebInitParam(name ="kaya",value = "vlauea"),
        @WebInitParam(name="keyb",value = "vb")})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //行相关 Get/POST URI HTTP/1.1
        System.out.println(req.getMethod());//请求方式 GET
        System.out.println(req.getScheme());//请求协议 http
        System.out.println(req.getProtocol());//请求协议和版本 HTTP/1.1
        System.out.println(req.getRequestURI());//资源标识符 /web02/s1
        System.out.println(req.getRequestURL());//资源定位符 http://localhost:8081/web02/s1
        System.out.println(req.getLocalPort());//本应用容器端口号  8081
        System.out.println(req.getServerPort()); //客户端发请求的端口号 与上一个可能不同,因为中间可能经过代理 8081
        System.out.println(req.getRemotePort()); //客户端软件端口号 53389

        //头相关
        System.out.println(req.getHeader("Accept")); //获取单个 text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
        //获得所有
        Enumeration<String> headerNames = req.getHeaderNames(); 
        while (headerNames.hasMoreElements()) {
            String s = headerNames.nextElement();
            System.out.println(s+":"+req.getHeader(s));
        }


    }
    }


4.2 请求中键值对相关api

http://localhost:8081/web02/s1?username=cky&passward=123&hobby=篮球&hobby=sing

package com.cky.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

//配置多个url路径 使用value 是一样饿效果
@WebServlet(urlPatterns ={"/s1","/s2"},
        initParams = {@WebInitParam(name ="kaya",value = "vlauea"),
        @WebInitParam(name="keyb",value = "vb")})
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取单个参数
        String username = req.getParameter("username");  //cky
        System.out.println(username);
        //获取多个值
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies)); // [篮球, sing]

        //获取所有参数名
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String pname = parameterNames.nextElement();
            String[] parameterValues = req.getParameterValues(pname);
            if(parameterValues.length>1){
                System.out.println(Arrays.toString(parameterValues));
            }
            else
                System.out.println(parameterValues[0]);
        }
//        cky
//        123
//        [篮球, sing]

        //获得参数的 Map集合
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry : entries) {
            String key = entry.getKey();
            String[] parameterValues = req.getParameterValues(key);
            if (parameterValues.length > 1) {
                System.out.println(Arrays.toString(parameterValues));
            } else
                System.out.println(parameterValues[0]);

        }
        //        cky
//        123
//        [篮球, sing]

    }
    }


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1542941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤&#xff1a; redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先&#xff0c;Redis 的所有键都是字符串,常用的数据类型有 5 种&#xff1a;Strin…

ArkTS编写的HarmonyOS原生聊天UI框架

简介 ChatUI&#xff0c;是一个ArkTS编写的HarmonyOS原生聊天UI框架&#xff0c;提供了开箱即用的聊天对话组件。 下载安装 ohpm install changwei/chatuiOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 接口和属性列表 接口列表 接…

算法系列--动态规划--子序列(1)

&#x1f495;"深思熟虑的结果往往就是说不清楚。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(1),是子序列问题的开篇!带大家初识子序列问题 一.什么是子序列问题 我们…

【Burpsuite抓取APP、小程序数据包教程】

文章目录 一、抓取APP数据包1、burpsuite设置2、逍遥模拟器设置3、抓包即可 二、抓取小程序数据包1.bp设置代理端口2.利用火狐插件foxyproxy设置代理3.访问连接http://burp下载证书4.浏览器导入证书5.设置Proxifier6.配置代理规则7.进入小程序抓包 总结 一、抓取APP数据包 1、…

openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint

文章目录 openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint250.1 功能描述250.2 语法格式250.3 参数说明250.4 示例 openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint 250.1 功能描述 指明Join使用的方法&#…

Intel被喷惨的大小核CPU终于有救,12、13代也沾了光

2021年 Intel 将混合架构引入 PC &#xff0c;至今也没能让所有用户接受这一改动。 虽然 PE 核心设计 帮助我们更好理解鸡兔同笼问题 带来了额外的多线程性能提升&#xff0c;但对于游戏玩家们可就不那么友好了。 关了吧觉得亏&#xff0c;不关吧又要时不时担心大核偷懒、小核…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样&#xff0c;也是数据结构的一种&…

蓝桥杯基础练习详细解析一(代码实现、解题思路、Python)

试题 基础练习 数列排序 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第…

同城桶装水订水送水小程序:为水站打开新局面;

你是否还在为传统的电话、微信订水方式而烦恼&#xff1f;效率低下、管理混乱&#xff0c;是时候拥抱变革&#xff0c;让生意更上一层楼了&#xff01;同城送水小程序&#xff0c;一键解决你的所有痛点&#xff0c;让您的水站焕发新生。 水站系统功能亮点&#xff1a; 1. 一键…

无货源电商上货成功解析,如何选用采集和上货软件提高工作效力

最近大家是不是有一个疑惑&#xff1f;就是咱们在上货的过程中会出现解析失败 不论怎么上传&#xff0c;数据都是失败的&#xff0c;上传成功率很低很低&#xff0c;换了各种的上货软件 几百的几千的软件都用过了效果还是不行&#xff1f;和代理宣传的不符&#xff1f;什么日传…

如何成功将自己开发的APP上架到应用商店

如何成功将自己开发的APP上架到应用商店 随着移动应用市场的蓬勃发展&#xff0c;开发一款优秀的APP已成为许多企业和个人的首要选择。然而&#xff0c;成功上架并有效推广APP至关重要。本文将逐步介绍完整的上架流程&#xff0c;包括准备所需材料、注册开发者账户、进行APP备…

【Python实战】——神经网络识别手写数字

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

学习Python的第二天

下载工具 PyCharm Community Edition 2023.3.4 下载环境 Python3.10.4 目录 1.初识python 1.1 Python的起源 1.2 为什么学习Python 2.什么是编程语言 2.1 语言的概念 2.2 为什么不使用中文来与计算机交流呢 3.python环境安装 4.第一个python程序 5.python解释器 5…

人才推荐 | 纺织科学与工程博士,经验丰富的面料专家和采购专家

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

一款炫酷的python形状绘制动画库

这个库让复杂数学概念的可视化变得既简单又有趣&#xff0c;无论是线性代数、微积分&#xff0c;还是更高级的数学主题&#xff0c;Manim都能让它们栩栩如生&#xff0c;特别适合于制作数学视频和演示文稿。 特点 动画生成&#xff1a; Manim库提供了一套丰富的工具和方法&…

C++ unordered_set和unordered_map

哈希 1. unordered_set/unordered_map1.1 背景1.2 unordered_set1.2.1 特性1.2.2 常用方法 1.3 unordered_map1.3.1 特性1.3.2 常用方法 2. 哈希2.1概念2.2 哈希冲突2.2.1哈希函数2.2.2 解决哈希冲突2.2.2.1 闭散列2.2.2.2 开散列 1. unordered_set/unordered_map 1.1 背景 之…

新台阶——蓝桥杯单片机省赛第十四届程序设计题目

在做十四届题目之前&#xff0c;常常听学长说&#xff0c;十四届以前拿省一真的是右手就行&#xff0c;并不相信&#xff0c;在经历十四届痛苦的大量修bug和优化之后&#xff0c;或许学长的话真说对了几分。话不多说&#xff0c;我们开始一起完成单片机第十四届程序设计题目。 …

【】(综合练习)博客系统

在之前的学些中&#xff0c;我们掌握了Spring框架和MyBatis的基本使用&#xff0c;接下来 我们就要结合之前我们所学的知识&#xff0c;做出一个项目出来 1.前期准备 当我们接触到一个项目时&#xff0c;我们需要对其作出准备&#xff0c;那么正规的准备是怎么样的呢 1.了解需求…

基于傅里叶描述子的手势动作识别,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

ubuntu22.04物理机双系统手动分区

ubuntu22.04物理机双系统手动分区 文章目录 ubuntu22.04物理机双系统手动分区1. EFI系统分区2. 交换分区3. /根分区4. /home分区分区后的信息 手动分区顺序&#xff1a;EFI系统分区(/boot/efi)、交换分区(/swap)、/根分区、/home分区。 具体参数设置&#xff1a; 1. EFI系统分…