自己动手写Web容器之TomJetty之五:包装请求参数

科研效率革命:Zotero与Web of Science联动实现千篇文献一键获取 本文详细介绍了如何利用Zotero与Web of Science联动实现科研文献的高效管理,包括批量导入、智能下载和自动整理千篇文献的技巧。通过精准检索、RIS文件导出和Zotero插件设置,科研人员可以大幅提升文献获取和管理的效率,特别适合开题报告和综述写作等场景。 阅读详情

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229

        前面我们实现了TomJetty响应无参请求静态页面的功能,但真实情况下,几乎所有请求都得携带参数。不能处理用户参数请求的Web服务器就好比温室里的花朵,始终上不了台面。所以本节我们将为TomJetty加入响应用户参数的功能。此外,前面我们使用的提交请求的方式都是GET方式,但在实际情况下,POST方式使用的更广泛,所以我们也将给TomJetty增加响应POST请求的能力。

1扩展RequestHeader类

1.1在RequestHeader类中新增parameter属性,用于标示请求头中客户请求的参数,并提供对应的getter/setter方法

private String parameter;

public String getParameter() {
    return parameter;
}

public void setParameter(String parameter) {
    this.parameter = parameter;
}

1.2在RequestHeaderParserImpl类的parse()方法中加入如下片段,用于解析在GET和POST两种提交方式下的请求头的参数部分,并将其保存到requestHeader对象中

String parameter = null;
try {
    if(method.equalsIgnoreCase("post")) {
        parameter = txt.substring(txt.lastIndexOf("\n") + 1, txt.length());
    } else if(method.equalsIgnoreCase("get")) {
        parameter = url.substring(url.indexOf("?") + 1, url.length());
        url = url.substring(0, url.indexOf("?"));
    }
} catch (Exception e) {
}

header.setParameter(parameter);

2自定义请求参数类

        创建一个Parameter类,采用键值对的方式存储请求携带的参数。如果直接使用HashMap数据结构进行存储,由于其底层的设计原则,将无法避免客户端浏览器重复提交的问题。

package cn.lynn.tomjetty;

public class Parameter {

    private String key;
    
    private String value;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((key == null) ? 0 : key.hashCode());
        result = prime * result + ((value == null) ? 0 : value.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Parameter other = (Parameter) obj;
        if (key == null) {
            if (other.key != null)
                return false;
        } else if (!key.equals(other.key))
            return false;
        if (value == null) {
            if (other.value != null)
                return false;
        } else if (!value.equals(other.value))
            return false;
        return true;
    }
    
}

3封装请求对象

        前面我们讲过,为Java语言服务的Web容器,实际上装载的是Servlet(Java服务端应用程序)。打开Java EE帮助文档,检索Servlet关键字。可以看到Servlet实际上被设计成一个接口。其设计层次如下:


        它有三个实现子类,分别对应于不同的网络协议,这里我们只关注HttpServlet。此外,它还声明了五个方法,分别是:destroy()、getServletConfig()、getServletInfo()、init()、service(ServletRequest req, ServletResponse res),学过JSP的同学知道,service()方法才是Servlet容器响应请求的核心方法。看到这里,我们将Servlet相关HTTP协议的架构设计思想引入到TomJetty中。

3.1.新建一个Servlet接口,并声明一个service()方法

package cn.lynn.tomjetty;

public interface IServlet {

    public void service(Request req, Response res);

}

3.2新增一个IServlet接口的HTTP协议实现类HttpServletImpl,并提供doGet()方法和doPost()方法(方法体暂时为空)分别处理来自客户端浏览器的两种不同的提交方式

package cn.lynn.tomjetty;

public class HttpServletImpl implements IServlet {

    public void service(Request req, Response res) {
    }

    public void doGet(Request req, Response res) {
    }
    
    public void doPost(Request req, Response res) {
    }
}

        那么为什么要添加这两个方法?通过查看Java EE的HttpServlet的设计文档,我们知道HttpServlet也提供了这两个方法。当然提供的不止这两个,还有doDelete()、doPut()等,呵呵,想多了,它们不属于本系列关注的范畴^_^。



        我们发现service()方法中传入参数类型已经不是普通的Request和Response,Servlet对它们进行了封装。所以我们也照猫画虎学着做。

3.3新建一个Request类,用于封装HTTP请求头和请求参数。并提供对应的存取它们的方法以供外部调用

package cn.lynn.tomjetty;

import java.util.ArrayList;
import java.util.List;

public class Request {
    // 引入请求头
    private RequestHeader header;
    // 设置参数集合
    private List<Parameter> params = new ArrayList<Parameter>();
    // 设置请求参数
    public void setParameter(String param) {
        if(param == null || param.trim().equals("")) {
            return;
        }
        
        String[] result = param.split("&");
        
        for (int i = 0; i < result.length; i++) {
            Parameter parameter = new Parameter();
            parameter.setKey(result[i].split("=")[0]);
            parameter.setValue((result[i].split("=").length <= 1) ? "" : result[i].split("=")[1]);
            params.add(parameter);
        }
    }
    // 获取请求参数的值
    public String getParameterValue(String key) {
        String result = null;
        for(Parameter parameter : params) {
            if(parameter.getKey().equals(key)) {
                result =  parameter.getValue();
            }
        }
        return result;
    }

    public RequestHeader getHeader() {
        return header;
    }

    public void setHeader(RequestHeader header) {
        this.header = header;
    }
}

3.4在TomJetty类的run()方法中加入如下片段,将请求头和请求参数存放到Request对象中进行统一管理

// 封装请求头
Request request = new Request();
request.setParameter(header.getParameter());
request.setHeader(header);

4响应请求参数效果展示

4.1GET方式提交


        在IE浏览器输入上述地址后回车,控制台打印如下:

RequestHeader [
GET /index.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; KB974488)
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:9527
Connection: Keep-Alive
Cookie: null
parameter: username=lynnli1229&password=123456
]

4.2POST方式提交

        新建一个input.htm文件,在其<body>标签内编写一个表单用于POST提交用户信息。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="http://127.0.0.1:9527/index.htm" name="form" id="form" method="post">
    用户名:<input name="username" type="text"></br>
    密    码:<input name="password" type="password"></br>
        <input name="submit" value="提交" type="submit">
        <input name="reset" value="重置" type="reset">
    </form>
</body>
</html>

        在IE浏览器输入上述地址后回车,接着填写表单项,点击提交按钮,页面会导航到index.htm,控制台打印如下:

RequestHeader [
GET /input.htm HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/QVOD, application/QVOD, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; KB974488)
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:9527
Connection: Keep-Alive
Cookie: null
parameter: /input.htm
]
RequestHeader [
POST /index.htm HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/QVOD, application/QVOD, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; KB974488)
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:9527
Connection: Keep-Alive
Cookie: null
parameter: username=lynnli1229&password=123456&submit=%E6%8F%90%E4%BA%A4
]

        至此,TomJetty服务器已经能够在POST和GET两种请求提交方式下,都可以为携带参数的静态页面请求提供服务。然而只能处理静态页面请求的服务器还是远远不够的,毕竟现阶段动态网页才是主流。所以下一节我们将赋予TomJetty服务器处理动态网页的能力。

车载以太网-组播 阅读详情

相关推荐

单片机控制双向可控硅的5种实用触发电路设计(附完整电路图)

本文深入解析了单片机控制双向可控硅的5种实用触发电路设计,涵盖从基础隔离到复杂负载驱动的实战方案。重点探讨了光电耦合器选型、过零检测同步、RC吸收电路精密计算以及应对感性负载和高噪声环境的加固策略,并提供了完整的电路图与调试避坑指南,旨在帮助开发者实现安全可靠的交流负载控制。

joy55的博客 2210

嵌入式jetty相关知识总结

1嵌入式jetty简介 在介绍嵌入式jetty之前,首先介绍一下jetty。 Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和Web连接。

李昊的专栏 3866

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3220

自己动手写Web容器之TomJetty之三:掀起请求盖头来

传送门☞轮子的专栏☞转载请注明☞http://blog.youkuaiyun.com/leverage_1229 前面我们对于实现TomJetty做了一些知识铺垫和复习,息知了HTTP请求的头部的组成元素。目前的TomJetty服务器已经能够成功启动,可是请求一旦过来却又看不懂^_^。所以本文就来解析HTTP请求头,剖析它的各部分。让TomJetty服务器能够明白它的意图。 ...

weixin_30262255的博客 116

软件测试--用例篇(测试用例的好处、测试用例的七种设计方法、测试用例的粒度、测试用例的评价)

作为软件测试工程师,最主要的工作就是:编写测试用例,那么为什么要编写测试用例?它有什么好处?如何编写测试用例?测试用例写简单好还是复杂好?如何评价测试用例的质量? 天呐撸!能说不会吗?! 作为倾向软件测试工程师的老铁们,还是一起来学习吧! 一、编写测试用例的好处 测试用例是测试者的依据 测试用例使得工作可重复,是自动化测试的基础 补充:自动化测试的前提条件是:功能比较稳定,页面...

cherrydreamsover的博客 3734

k3s快速搭建k8s集群环境

k8s 搭建方式有多种,如果你是内网环境,希望占用服务器资源少或是边缘系统(如ARM系统),强烈推荐您使用 k3s进行安装 目录k3s 简介k3s架构中文官方文档三台服务器快速搭建k8s集群安装说明步骤1 修改主机名,保持唯一步骤2 安装docker步骤3 安装master节点步骤4 安装worker节点加入集群步骤5 查看集群步骤6 部署 k8s仪表盘 dashboard k3s 简介 轻量级 Kubernetes。安装简单,内存只有一半,所有的二进制都不到 100MB K3s 是一个完全符合 Ku.

gzt19881123的专栏 2445

深入Jetty源码之Servlet框架及实现(ServletRequest、ServletResponse)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象。这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些“服务器端运行的小程序”对服务器实现的无关性(即提升了其可移植性)...

weixin_34138255的博客 572

python利用IQR方法与3σ方法进行异常值处理(含代码)

python利用IQR方法进行异常值处理

weixin_46713695的博客 2031

Jersey框架:封装基于Jetty的通用服务器

1.需求场景 依赖于Jetty容器封装一个Jersey微服务的启动类,在微服务入口中通过简单的调用即可实现微服务启动。主要需求如下: 可以指定服务启动端口 可以指定服务的应用域路径 可以指定要注册到Jersey容器的资源包 可以指定要注册到Jersey容器的资源类 2.设计思路 在通用封装类中维护一个Jetty的Server实例,代表真正的服务器 默认注册res、filter和excepti...

机器熊的技术大杂烩 612

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 283

基于单片机的智能温控风扇设计

该智能温控风扇系统的设计目标是根据环境温度自动控制风扇的转速或开关状态,确保用户始终处于舒适的温度范围内。实时温度监测:通过温度传感器(如DS18B20或DHT22)实时监控环境温度。风扇控制:根据温度变化自动调节风扇的转速,温度过高时风扇加速,温度适中时风扇转速降低,达到节能与舒适平衡。LCD显示:通过LCD屏幕实时显示温度信息。无线通信:通过Wi-Fi或蓝牙模块将温度数据发送至手机或云平台,支持远程控制风扇的开关或调节转速。报警功能:温度过高或过低时,蜂鸣器发出警报,提示用户注意。

2201_76125393的博客 1158

自己动手写Web容器之TomJetty之一:服务内功经脉

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 2.开启服务器 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面起步 传送门 ☞ 5.包装请求参数 传送门 ☞ 6.动态页面引入         Jetty 是一个开源的servlet容器,它为基于Java的web内容,

leverli的专栏 4481

ssd训练自己的数据集

基于SSD实现目标检测(训练自己的数据集)

reset2021的博客 6804

自己动手写Web容器之TomJetty之四:静态页面起步

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 1.服务内功经脉 传送门 ☞ 2.开启服务器 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 5.包装请求参数 传送门 ☞ 6.动态页面引入         上一节我们实现了将HTTP请求头的内容解析后打印到控制台上,让HTTP请求头的各个

leverli的专栏 3435

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

自己动手写Web容器之TomJetty之六:动态页面引入

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 1.服

leverli的专栏 6430

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

自己动手写Web容器之TomJetty之二:开启服务器

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 1.服务内功经脉 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面启步 传送门 ☞ 5.包装请求参数 传送门 ☞ 6.动态页面引入         上一节我们对于实现TomJetty服务器做了一些与Web有关的知识铺垫和回顾。那

leverli的专栏 3344

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[置顶] 自己动手写Web容器之TomJetty之六:动态页面引入

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 2.让服务动起来 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面起步 传送门 ☞ 5.包装请求参数         在上一节,我们已经完成了TomJetty服务器处理静态页面请求的功能。但是只能处理...

weixin_34242331的博客 110

[置顶] 野生Web容器之TomJetty之掀起你的盖头来

传送门:上一节         上文我们对于实现这个野生Web容器做了一些知识铺垫和复习,息知了HTTP请求的头部的组成元素,本文我们主要讲解如何在代码中去解析它的各个部分,掀起盖头来,给哥笑一个^_^。在这之前,我们需要建立服务器,把框架搭建起来。 一、服务器建立 1.新建一个名为TomJetty的Java工程。 2.在工程src目录下新建一个tomjetty.config文件,用于提...

weixin_33798152的博客 168

[置顶] 野生Web容器之TomJetty之内功经脉

        Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。Tomcat 是一个免费的开放源代码的Web 应用服务器,属于轻量级...

weixin_34138521的博客 97

[置顶] “非主流”Web容器之TomJetty之让服务动起来

  传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面启程         上一节我们对于实现TomJetty服务器做了一些与Web有关的知识铺垫和回顾。那么从本节正式开始实现TomJetty服务器的“山寨”之旅。要想实现一个服务器,第一步要把服务器建立起来,并且能够正常运行,才能等待来自客户端的请求。考虑到这一点,我们本节就来处理TomJet...

weixin_34235457的博客 104
上一篇: Android玉石短剑之GridView之精挑细选
下一篇: 某大型银行深化系统之一:平台技术
innovation
博客等级 码龄14年 251粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值