当前位置: 首页 > news >正文

JavaWeb三大组件之Servlet

1. Servlet

一、Servlet介绍

1、概念

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

2、实现过程

1.客户端发送请求至服务器端;

2.服务器将请求信息发送至 Servlet;

3.Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

4.服务器将响应返回给客户端。

3、生命周期

1.客户端请求该 Servlet;

2.加载 Servlet 类到内存;

3.实例化并调用init()方法初始化该 Servlet;

4.service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。

二、Request对象(获取请求信息)

2.1获取相应消息数据

2.2 获取请求参数

String getParameter(String name):根据参数名称获取参数值  
String[] getParameterValues(String name):根据参数名称获取参数值的数组
Enumeration<String> getParameterNames():获取所有请求的参数名称Map<String,String[]> getParameterMap():获取所有参数的map集合

2.3请求转发

1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

2.4 共享数据

void setAttribute(String name,Object obj):存储数据Object getAttitude(String name):通过键获取值void removeAttribute(String name):通过键移除键值对

post乱码解决

在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

三、Response对象(设置响应消息)

3.1 设置响应消息

3.2 重定向

方法:response.sendRedirect("路径");

特点:1. 地址栏发生变化

2. 重定向可以访问其他站点(服务器)的资源

3. 重定向是两次请求。不能使用request对象来共享数据

重定向与转发的区别

forward:一般用于用户登陆的时候,根据角色转发到相应的模块。

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等。

四、综合案例

4.1新建项目步骤

4.2 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.beiyou</groupId><artifactId>servlet</artifactId><version>1.0-SNAPSHOT</version><name>servlet</name><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><junit.version>5.8.1</junit.version></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins></build>
</project>

4.3 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><servlet-name>HelloServlet</servlet-name><servlet-class>com.beiyou.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello-servlet</url-pattern></servlet-mapping>
</web-app>

4.4 HelloServlet.java

package com.beiyou.servlet;import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;//@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {private String message;public void init() {message = "Hello World!";}public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {//response.setContentType("text/html");response.setHeader("Content-Type","text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1> Servlet 你好,这是您要的麻婆豆腐 </h1>");out.println("</body></html>");}public void destroy() {}
}

4.5 乱码-解决

中文乱码

解决ide控制台乱码

五、使用注解

@WebServlet(name = "helloServlet", value = "/hello-servlet")

1.1 使用JSP页面

1、编写a.jsp页面

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><!DOCTYPE html>
<html>
<head><title>JSP - Hello World</title>
</head>
<body>
<h1><%= "潘周聃1写死" %>
</h1>
<hr/>
<h1><%Object value = request.getAttribute("name");out.println(value);%>
</h1>
<hr/>
<h1>${requestScope.name}
</h1>
<hr/>
<h1>id: ${requestScope.user.id}
</h1>
<h1>姓名: ${requestScope.user.name}
</h1></body>
</html>

request和requestScope的区别_xiangwang2016的博客-CSDN博客_requestscope

EL表达式中,param和requestScope的区别在看param和requestScope之前,不妨先了解下在java下request的情况:1. request对象通常用来接收客户端提交到服务端的数据,如:在servlet或者action中可以用request.getParameter()的方法获取获取参数内容;2. requestScope通常是在servlet或者ac...

https://blog.csdn.net/xiangwang2016/article/details/85119692

2、Servlet传递参数到jsp页面

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {//通过请求作用域对象HttpServletRequest接口添加共享数据request.setAttribute("name","苍老师");//将数据写入请求作用于对象name(key名称)Map<String,Object> map  = new HashMap<>();map.put("id",1);map.put("name","潘周聃");request.setAttribute("user",map);        //通过请求转发索要a.jsp并写入到响应体中request.getRequestDispatcher("a.jsp").forward(request,response);           }

<body><%Object o= request.getAttribute("name") ;out.println(o);
%>基本类型:${requestScope.name}对象id:${requestScope.user.id}对象name:${requestScope.user.name}
</body>

 

1.2 使用模板引擎

1.引入模板库

 <dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version><scope>compile</scope></dependency><dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>1.2.5</version></dependency>

2. servlet 传递集合

public class User {private int id;private String  name;
}

   request.setAttribute("userLst",userLst);request.getRequestDispatcher("template.jsp").forward(request,response);

3. 页面头加上渲染方式

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<h1>使用模板引擎</h1><table><c:forEach items="${requestScope.userLst}" var="user"><tr><td>${user.id }</td><td>${user.name }</td></tr></c:forEach>
</table>

1.3 使用Post接受表单请求

1.书写表单

<form method="post" action="a"><input type="text" name="id" placeholder="请输入名 "><input type="text" name="name" placeholder="请输入姓 "><input type="submit" value="提交" >
</form>

2.书写doPost

  @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理表单数据req.setCharacterEncoding("UTF-8");String id = req.getParameter("id");String name = req.getParameter("name");//构造一个响应页resp.setHeader("Content-Type","text/html;charset=utf-8");//一旦调用getWriter方法,此时header的内容就不能更改Writer writer = resp.getWriter();writer.write("<html>");writer.write("id: "+id);writer.write("<br/>");writer.write("name: "+name);writer.write("</html>");}

3.Post传输Json数据

3.1 引入fastjson包

   <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version></dependency>

3.2 form表单提交

url:http://localhost:8080/demo/bBody:{"id":5,"name":"zhouxingxing"}

3.3 书写doPost方法

 @Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//读取request body 数据ServletInputStream inputStream = request.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String  jsonStr = "";String  line;while ((line = bufferedReader.readLine()) != null){jsonStr += line;}// 转成对象JSONObject jsonObject = JSONObject.parseObject(jsonStr);JSONObject jsonObject2 = new JSONObject();//正常成功时候返回的格式jsonObject2.put("code",0);jsonObject2.put("data",jsonObject);jsonObject2.put("message","请求成功");//失败的时候返回的格式// jsonObject2.put("code",1);// jsonObject2.put("data",null);// jsonObject2.put("message","连接数据库失败");response.setCharacterEncoding("utf-8");response.setContentType("application/json");response.getWriter().write(String.valueOf(jsonObject2));//        PrintWriter writer = response.getWriter();
//        writer.println("<html>");
//        writer.println("<body>");
//        writer.println("id -> "+jsonObject.getString("id"));
//        writer.println("<br/>");
//        writer.println("name -> "+jsonObject.getString("name"));
//        writer.println("</body>");
//        writer.println("</html>");}

成功:

失败:

 

相关文章:

JavaWeb三大组件之Servlet

1. Servlet 一、Servlet介绍 1、概念 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成…...

C++设计模式学习详解(23种)

C设计模式学习详解 设计模式是软件开发中常见问题的可复用解决方案。它们不是可以直接转换为代码的成品&#xff0c;而是描述解决问题的通用方法。C 中常用的设计模式可以分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。 一、创建型模式 (Creational Patterns) …...

Matlab中实现类属性仅在首次创建类实例时初始化

背景描述: 在自定义类中&#xff0c;需要定义一些属性(标志位)用于触发某些方法&#xff0c;标志位只需要在类对象第一次实例化时赋初值&#xff0c;之后的值需要在特定的地方设置。怎样保证在不同实例中&#xff0c;标志位的值仅在特定的时候改变&#xff0c;其他时候保持不变…...

FLINK SQL动态表连续查询

SQL动态表 在Apache Flink中&#xff0c;动态表是Flink SQL处理流数据的核心概念之一。与静态表&#xff08;如关系数据库中的传统表&#xff09;不同&#xff0c;动态表的内容是随时间不断变化的&#xff0c;因为它们能够反映数据流的最新状态。动态表可以看作是对数据流的一…...

C++ | Leetcode C++题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution { public:string validIPAddress(string queryIP) {if (queryIP.find(.) ! string::npos) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur (i 3 ? queryIP.size() : queryIP.find(., last 1));if (cur st…...

每日学习一个数据结构-图

文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对…...

kali(专业的渗透测试虚拟机)|kali下载链接地址 |kali安装 |kali部署指南

介绍 kali 是Debian开源linux系统体系下的子分支之一 Debian-kali 扩展&#xff1a;Ubuntu也是Debian开源linux系统体系下的子分支之一 Debian-ubuntu 安装kali 2023.03 稳定版 Index of /kali-images/kali-2023.1/ 安装可以参考他的教程&#xff0c; 写的很详细了…...

中国地级市生态韧性数据及城市生态韧性数据(2000-2022年)

一测算方式&#xff1a; 参考C刊《管理学刊》楚尔鸣&#xff08;2023&#xff09;老师的做法&#xff0c;城市生态韧性主要衡量一个城市在面临生态环境系统压力或突发冲击时&#xff0c;约束污染排放、维护生态环境状态和治理能力提升的综合水平。 参考郭海红和刘新民的研究&a…...

应对网络安全挑战:App等保测评的重要性与策略

在全球数字化转型的大潮中&#xff0c;移动应用(App)作为连接人们日常生活与互联网世界的桥梁&#xff0c;其数量与日俱增&#xff0c;功能日趋多样化。与此同时&#xff0c;App背后潜藏的网络安全风险也随之上升&#xff0c;数据泄露、隐私侵犯、恶意软件植入等问题频发&#…...

vue后台管理系统从0到1搭建(4)各组件的搭建

文章目录 vue后台管理系统从0到1搭建&#xff08;4&#xff09;各组件的搭建Main.vue 组件的初构 vue后台管理系统从0到1搭建&#xff08;4&#xff09;各组件的搭建 Main.vue 组件的初构 根据我们的效果来看&#xff0c;分析一下&#xff0c;我们把左边的区域分为一个组件&am…...

LabVIEW开关磁阻电机特性测量系统

基于LabVIEW软件和特定硬件组件的开关磁阻电机&#xff08;SRM&#xff09;特性测量系统&#xff0c;结合多功能数据采集卡&#xff0c;统能够准确地测量并分析SRM的电磁特性&#xff0c;从而支持电机模型的精确建立和性能优化。 项目背景 在工业生产和家用电器领域&#xff0…...

在当前网络环境中查看所有IPv4与Mac地址的方法

在powershell界面中&#xff1a; # 获取并显示所有网络接口的MAC地址和IPv4地址 Get-NetAdapter | Select-Object -Property Name, MacAddress, Status Get-NetAdapter | Get-NetIPAddress -AddressFamily IPv4 | Select-Object -Property InterfaceAlias, IPAddress, PrefixL…...

CSS @规则(At-rules)系列详解___@charset规则使用方法

CSS 规则(At-rules)系列详解 ___charset规则使用方法 本篇目录&#xff1a; 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的&#xff0c;错误的使用方法 零、时光宝盒 &#xff08;https://blog.csd…...

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…...

六自由度平台

力姆泰克六自由度平台 安装方便&#xff0c;维护简单 多重机械电气安全保护 向下翻动查看更多 力姆泰克伺服系统集成 全新革命性结构设计与六轴先进伺服控制原理的结合&#xff0c;力姆泰克公司引进国外的专业技术在国内全新推出 全电动六自由度平台。将完全替代市场上原有的…...

【Node.js 下载及npm安装配置】亲测可用

Node.js 下载及npm安装配置 安装nodejs设置安装angular 安装nodejs 下载适用自己系统的node.js&#xff0c;官网&#xff1a;https://nodejs.cn/download/。默认安装即可。查看是否安装成功&#xff0c;node -v&#xff0c;npm -v &#xff0c;出现版本号即安装成功。 设置 …...

Qt C++设计模式->访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;它将操作与对象结构分离&#xff0c;使得你可以在不改变对象结构的前提下定义作用于这些对象的新操作。访问者模式通过引入一个访问者对象&#xff0c;允许你在不修改类的前提下向已有类添加…...

手机在网状态的详细应用场景有哪些?

手机在网状态的详细应用场景涵盖了多个行业和领域&#xff0c;以下是一些具体的例子&#xff1a; 金融行业 风控审核&#xff1a;银行、贷款公司等金融机构在审批贷款或信用卡时&#xff0c;可以通过查询手机在网状态来验证申请人的手机号码是否真实有效&#xff0c;从而降低欺…...

Linux的kafka安装部署

1.kafka是一个分布式的,去中心化的,高吞吐低延迟,订阅模式的消息队列系统 确保要有jdk与zookeeper安装配置 2.下载kafka安装包 http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.1.tgz 此时可以wget http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.…...

docker部署虚拟机

创建新的容器web02&#xff0c;-v表示目录映射&#xff0c;-p时端口映射&#xff0c;把宿主机目录挂载到容器中 docker run -itd -p 80:80 -v /data/webapps/www/:/usr/share/nginx/html/ --nameweb02 nginx:latest 此时我们在发布网站时只需要放在宿主机的目录里就可以了 解…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...