javaweb-Servlet的使用

news2024/12/25 19:08:39

xml设置

创建项目需要勾选下图的创建xml(适用于3.0以下版本,3.0以上的可以跳过使用下面的注解开发)
在这里插入图片描述
创建完项目后,找到web—WEB-INF—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_3_1.xsd"
         version="3.1">
        <!--  配置servlet路径  -->
    <servlet>
        <!--    起名    -->
        <servlet-name>demo1</servlet-name>
        <!--   配置全类名(全限定名)     -->
        <servlet-class>com.jwz.web.servlet.ServletDemo01</servlet-class>
        <!--
        指定servlet的创建时机
        1.第一次被访问时创建
        <load-on-startup>的值为负数
        2.在服务器启动时创建
        <load-on-statup>的值为日或正整数
        启动服务器,注意初始化方法打印的值
        -->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <!--  配置servlet的mapping -->
    <servlet-mapping>
        <!--下面名字和上面保持一致-->
        <servlet-name>demo1</servlet-name>
        <!--路径-->
        <url-pattern>/xiaoji</url-pattern>
    </servlet-mapping>
</web-app>

注解开发

@WebServlet() //配置访问的路径,无需配置xml,类似xml的url-pattern
@WebServlet(value = "/lujing")
@WebServlet(urlPatterns = "/lujing") //以上两种方式均可以配置访问路径
//一般默认使用value,因为value可以省略,所以可以简写下面形式
@WebServlet("/lujing")

servlet结构说明

@webservlet("/xiaoji")
public class ServletDemo01 implements Servlet {

    /**
     * 初始化方法
     * 在servlet被创建时,只会执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.........");
    }

    /**
     * 获取ServletConfig对象
     * ServletConfig:servlet的配置对象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     *提供服务方法
     * 每一次servlet被访问时执行,执行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello servlet");
    }


    /**
     * 获取servlet的一些信息
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     *销毁方法
     *服务器正常关闭时执行,执行一次
     */
    @Override
    public void destroy() {
        System.out.println("destroy....");
    }
}

路径的设置

package com.jwz.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;

//定义多个路径,以下三个路径均可以访问

/**
 * 路径定义规则
 *  /XXX
 *  /XXX/XXX:多层路径,目录结构
 *  *.xiaoji
 */
//@WebServlet({"/d4","/dd4","/ddd4"})
//@WebServlet("/user/demo04")//多层路径
//@WebServlet("/user/*")//多层路径最后一层为任意匹配路径
//@WebServlet("/*")//为任意匹配路径
  @WebServlet("*.xiaoji")//任意字段.xiaoji才能访问
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo04....");
    }
}

继承关系

直接继承GenericServlet,相当于只需要重写servlet的service方法

public class ServletDemo02 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet02");
    }
}

继承HttpServlet有两个方法分别监听get和post的请求

@WebServlet("/xiaoji1")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
    }
}

HttpServlet中的request方法

在继承的HttpServlet中的request获取请求行数据的方法
  1. 获取请求方式 :GET
    * String getMethod()
    2. 获取虚拟目录:/day14
    * String getContextPath()
    3. 获取Servlet路径: /demo1
    * String getServletPath()
    4. 获取get方式请求参数:name=zhangsan
    * String getQueryString()
    5. 获取请求URI:/day14/demo1
    * String getRequestURI(): /day14/demo1
    * StringBuffer getRequestURL() :http://localhost/day14/demo1
    * URL:统一资源定位符 : http://localhost/day14/demo1
    * URI:统一资源标识符 : /day14/demo1
    6. 获取协议及版本:HTTP/1.1
    * String getProtocol()
    7. 获取客户机的IP地址:
    * String getRemoteAddr()
@WebServlet("/demo01")
public class demo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送请求为Get,这里使用doget
        //获取请求方式:GET
        System.out.println(request.getMethod());
        //获取虚拟目录:/servlet_war_exploded
        System.out.println(request.getContextPath());
        //获取servlet路径:/demo01
        System.out.println(request.getServletPath());
        //获取get请求参数:name=zhangsan&age=28
        System.out.println(request.getQueryString());
        //获取请求的URI:/servlet_war_exploded/demo01
        System.out.println(request.getRequestURI());
        //获取请求的URL:http://localhost:8080/servlet_war_exploded/demo01
        System.out.println(request.getRequestURL());
        //获取协议及版本:HTTP/1.1
        System.out.println(request.getProtocol());
        //获取客户机的ip地址:0:0:0:0:0:0:0:1
        System.out.println(request.getRemoteAddr());
    }
}
在继承的HttpServlet中的request获取请求头数据的方法
  • String getHeader(String name):通过请求头的名称获取请求头的值
    * Enumeration getHeaderNames():获取所有的请求头名称
package com.jwz.servlet.request方法演示;
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;
import java.util.Enumeration;

/**
 * 演示request获取请求行数据(具体方法看txt文本)
 */
@WebServlet("/demo02")
public class demo02获取请求头 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //演示获取请求头数据
        //获取所有请求头名称
        Enumeration<String> e = request.getHeaderNames();
        //遍历
        while(e.hasMoreElements()){
            String name = e.nextElement();
            //根据名称获取请求头的值
            String value = request.getHeader(name);
            System.out.println(name+"-----"+value);
        }
        System.out.println("=====================");
        //获取指定请求头(user-agent)数据
        String agent = request.getHeader("user-agent");
        //判断浏览器的版本
        if(agent.contains("Chrome")){
            System.out.println("获取到谷歌浏览器");
        }else if(agent.contains("Firefox")){
            System.out.println("获取到火狐浏览器");
        }
        System.out.println("=====================");
        //获取指定请求头(referer)数据
        //直接用浏览器访问打印为null
        //在web文件夹创建htmla标签为<a href="/虚拟目录/访问路径">referer演示</a>
        //然后访问html文件:http://localhost:8080/虚拟目录/referer.html,通过超链接点击访问地址即可
        //最后打印出:http://localhost:8080/servlet_war_exploded/referer.html
        //也就是html文件访问路径
        String referer = request.getHeader("referer");
        System.out.println(referer);
    }
}
referer的html文件内容
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
<a href="/servlet_war_exploded/demo02">referer演示</a>
</body>
</html>
上面所有代码统一打印出来的结果

在这里插入图片描述

在继承的HttpServlet中的request获取请求体数据的方法

请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
* 步骤:
1. 获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
* 在文件上传知识点后讲解
2. 再从流对象中拿数据

示例java代码(post请求)
@WebServlet("/demo03")
public class demo03获取请求体 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求消息体
        //1.获取字符流
        BufferedReader br = req.getReader();
        //2.读取数据
        String line=null;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }
        //最后开启服务器,访问body.html,点提交后看控制台
    }
}

示例上面代码里的body.html代码(post请求)
<body>
<--action里面为虚拟目录加访问映射名-->
<form action="/xiaoji/demo03" method="post">
	用户名:<input type="text" name="username"><br>
	密码:<input type="text" name="password"><br>
	<input type="submit" value="提交"><br>
</form>>
</body>
访问body.html以后,表单填写账号密码,点击提交以后的效果图

在这里插入图片描述

其他功能:
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
			1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=123
			2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game
			3. Enumeration<String> getParameterNames():获取所有请求的参数名称
			4. Map<String,String[]> getParameterMap():获取所有参数的map集合
			当两个请求业务逻辑相同时,可以使用this.doPost(request,response)
直接调用另一个请求的方法。
			5.中文乱码问题:
				* get方式:tomcat 8 已经将get方式乱码问题解决了
				* post方式:会乱码
					* 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
		""
		请求转发:一种在服务器内部的资源跳转方式
			1. 步骤:
				1-1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path),
				1-2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 
					如:
							另一个资源的访问路径为xiaoji
							RequestDispatcher xiaoji=request.getRequestDispatcher("/xiaoji")
							xiaoji.forward(request,response)
							通过以上两行代码就能完成转发操作(可以用链式编程,比较建议)
			2. 特点:
				2-1. 浏览器地址栏路径不发生变化
				2-2. 只能转发到当前服务器内部资源中。
				2-3. 转发是一次请求
				3. 共享数据:
			3-1. 域对象:一个有作用范围的对象,可以在范围内共享数据
			3-2. request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
			3-3. 方法:
				3-3-1. void setAttribute(String name,Object obj):存储数据
				3-3-2. Object getAttitude(String name):通过键获取值
				3-3-3. void removeAttribute(String name):通过键移除键值对
		4. 获取ServletContext:
			4-1. ServletContext getServletContext()

response

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

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

相关文章

隔离系列 宽电压输入 正负高电压稳压输出 高压稳压电源模块

特点 效率高达 80%以上1*2英寸标准封装电源正负双输出稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上应用 HRA 1~40W系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36VDC标准&…

使用SAS,Stata,HLM,R,SPSS和Mplus的多层线性模型HLM

简介 最近我们被客户要求撰写关于多层线性模型的研究报告&#xff0c;包括一些图形和统计输出。本文档用于比较六个不同统计软件程序&#xff08;SAS&#xff0c;Stata&#xff0c;HLM&#xff0c;R&#xff0c;SPSS和Mplus&#xff09;的两级多层&#xff08;也称分层或层次&…

8年软件测试开发薪水被应届生倒挂,32岁的我裸辞了...

今年 32 岁&#xff0c;我从公司离职了&#xff0c;是裸辞。 前段时间&#xff0c;我有一件事情一直憋在心里很难受&#xff0c;想了很久也没找到合适的人倾诉&#xff0c;就借着今天写出来。 我一个十几年测试经验&#xff0c;八年 软件测试 经验的职场老人&#xff0c;我慢…

Docker运行MySQL容器

目录 一、宿主机与容器之间的文件拷贝 1.利用MySQL镜像安装MySQL服务 2.容器中怎么上传项目&#xff08;文件&#xff09; 3.从容器中拷贝文件到宿主机 4.从宿主机拷贝文件到容器 二、数据卷 三、数据卷容器 四、Dockerfile 本次目标&#xff1a; 数据卷Dockerfile …

C++初阶作业 Stackqueue 作业题一

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;实现几道Stack和queue的作业题 Stack queue作业题最小栈问题栈的压入弹出序列逆波兰表达式问题总结最小栈问题 它问题的题目描述是这…

Kafka极客 - 13 Kafka 中的高水位和 Leader Epoch 机制

文章目录1. 什么是高水位&#xff1f;2. 高水位的作用3. 高水位更新机制1. Leader 副本高水位更新机制2. Follower 副本高水位更新机制4. 副本同步机制解析5. Leader Epoch你可能听说过高水位&#xff08;High Watermark&#xff09;&#xff0c;但不一定耳闻过 Leader Epoch。…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【03】前端开发基础知识:ES6_Vue

持续学习&持续更新中… 学习态度&#xff1a;守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【03】前端技术栈类比ES6简介什么是ECMAScriptES6新特性let、const解构表达式字符串扩展字符串模板函数优化对象优化map、reducePromise&#xff08;异步编排&#xff…

第十四届蓝桥杯集训——JavaC组第十一篇——switch

第十四届蓝桥杯集训——JavaC组第十一篇——switch 目录 第十四届蓝桥杯集训——JavaC组第十一篇——switch swtich概述 switch语法 default作用 switch基础示例&#xff1a; String类型switch示例 switch枚举判断 巧用break 石头剪刀布 测试代码&#xff1a; swtich概…

安卓计算机毕设——无线点餐系统

1 绪 论 1.1 研究的背景及意义 民以食为天。餐饮业是一种个性化、多样化的服务产业&#xff0c;餐饮传统的点菜方式是纯人工操作&#xff0c;由服务员记录顾客点的菜&#xff0c;在具体工作中容易出现以下问题&#xff1a;手写单据字迹潦草从而导致上错菜、传菜分单出错现象严…

pytest学习和使用-fixture如何使用?

1 引入 和setup、teardown的区别是&#xff1a;fixture可自定义测试用例的前置条件&#xff1b; setup、teardown针对整个脚本全局生效&#xff0c;可实现在执行用例前后加入一些操作&#xff1b; setup、teardown不能做到灵活使用&#xff0c;比如用例A先登陆&#xff0c;用…

【毕业设计】微信失物招领小程序 失物招领微信小程序

一、前言 生活中&#xff0c;很多人都有丢失物品的经历&#xff0c;随着互联网的快速发展&#xff0c;你可以在各种地方信息平台来发布丢失说明。但是这些信息往往会随着平台的发布量被刷掉&#xff0c;想要找回丢失的东西还是很困难的。只需要打开微信即可使用失物招领小程序…

软件测试丨基于Junit4,利用xUnit框架让你的测试用例可维护性大幅提升

xUnit是一系列测试框架的统称&#xff0c;最开始来源于一个叫做Smalltalk的SUnit框架。 现在各种面向对象的语言&#xff0c;如Java、Python的鼻祖就是Smalltalk&#xff0c;后来这些语言都借助了Sunit框架的理念&#xff0c;有很多通用的规范和特征&#xff0c;也就统称为xUn…

C. Hossam and Trainees(欧拉筛 + 分解质因数)

Problem - C - Codeforces 胡萨姆有n名学员。他给第i个学员分配了一个号码。 如果存在一个整数x (x≥2)&#xff0c;使得x能整除ai, x能整除aj&#xff0c;则第i个和第j个(i≠j)练习者被称为成功练习者。 胡萨姆想知道是否有一对成功的学员。 胡萨姆现在很累了&#xff0c;所以…

推荐一个平台,JNPF开发平台3.4.5版本更新升级,企业级的低代码开发平台

JNPF快速开发框架是一个可复用的设计构件&#xff0c;使用JNPF的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发&#xff1b; 简单来讲&#xff0c;软件开发框架可以理解为我们盖楼房时&#xff0c;用梁柱子承重墙做起来的钢筋混凝土结构框架。而实现的软件功…

R语言基于协方差的结构方程拟合的卡方检验

在评估结构方程模型的拟合&#xff0c;很常见的应用是研究χ2进行测试&#xff0c;因为在给定足够大的样本量的情况下&#xff0c;它几乎总会检测出模型与数据之间的统计上的显着差异。因为&#xff0c;我们的模型几乎总是数据的近似值。如果我们的模型的协方差矩阵实际上匹配抽…

【云计算与大数据技术】分布式数据库NoSQL中KV、列式、图、文档数据库的讲解(图文解释 超详细)

一、NoSQL数据库概述 NoSQL泛指非关系型数据库&#xff0c;相对于传统关系型数据库&#xff0c;NoSQL有着更复杂的分类&#xff0c;包括KV数据库&#xff0c;文档数据库&#xff0c;列式数据库以及图数据库等等&#xff0c;这些类型的数据库能够更好的适应复杂类型的海量数据存…

QT点云显示--基于QOpenGLWidget和QOpenGLFunctions实现

一、实现功能 1、网格显示 2、坐标轴显示 3、鼠标操作旋转、平移、缩放 4、点云显示 之前写了一篇基于QGLWidget实现&#xff0c;此版本的功能接口基本保持一致&#xff0c;方便对比 QT点云显示--基于QGLWidget实现_Jason~shen的博客-CSDN博客1、网格显示2、坐标轴显示3、…

操作系统学习笔记_2 中断和系统调用;进程和线程

中断 一开始的计算机只是简单的串行执行程序。 现在的操作系统不仅可以并发执行程序&#xff0c;而且收到中断指令时&#xff0c;CPU 会切换到内核模式&#xff0c;中断当前程序的执行&#xff0c;按中断指令调整程序执行顺序&#xff0c;然后恢复到用户态继续执行。 中断分…

docker容器安装与使用

目录 1. 什么是docker 2. docker的核心组件 3. docker的安装 3.1 安装的先决条件 3.2.1 ubuntu安装docker 3.2.2 CentOS安装docker 3.3 配置镜像加速器 4. 镜像常用操作 4.1 搜索镜像 4.3 查看宿主机中的镜像 4.3 删除镜像 5. 容器常用命令 5.1 运行容器 5.2 使用…

【算法】斐波那契数列通项公式

特征方程和通项公式 如果数列ana_nan​的递推公式&#xff1a;anc1an−1c2an−2a_nc_1a_{n-1}c_2a_{n-2}an​c1​an−1​c2​an−2​------(1) 根据待定系数法&#xff0c;假设an−xan−1y(an−1−xan−2)a_n-xa_{n-1}y(a_{n-1}-xa_{n-2})an​−xan−1​y(an−1​−xan−2​)…