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(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成…...
C++设计模式学习详解(23种)
C设计模式学习详解 设计模式是软件开发中常见问题的可复用解决方案。它们不是可以直接转换为代码的成品,而是描述解决问题的通用方法。C 中常用的设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 一、创建型模式 (Creational Patterns) …...
Matlab中实现类属性仅在首次创建类实例时初始化
背景描述: 在自定义类中,需要定义一些属性(标志位)用于触发某些方法,标志位只需要在类对象第一次实例化时赋初值,之后的值需要在特定的地方设置。怎样保证在不同实例中,标志位的值仅在特定的时候改变,其他时候保持不变…...
FLINK SQL动态表连续查询
SQL动态表 在Apache Flink中,动态表是Flink SQL处理流数据的核心概念之一。与静态表(如关系数据库中的传统表)不同,动态表的内容是随时间不断变化的,因为它们能够反映数据流的最新状态。动态表可以看作是对数据流的一…...
C++ | Leetcode C++题解之第468题验证IP地址
题目: 题解: 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…...
每日学习一个数据结构-图
文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中,图是描述于一组对象的结构,其中某些对象对…...
kali(专业的渗透测试虚拟机)|kali下载链接地址 |kali安装 |kali部署指南
介绍 kali 是Debian开源linux系统体系下的子分支之一 Debian-kali 扩展:Ubuntu也是Debian开源linux系统体系下的子分支之一 Debian-ubuntu 安装kali 2023.03 稳定版 Index of /kali-images/kali-2023.1/ 安装可以参考他的教程, 写的很详细了…...
中国地级市生态韧性数据及城市生态韧性数据(2000-2022年)
一测算方式: 参考C刊《管理学刊》楚尔鸣(2023)老师的做法,城市生态韧性主要衡量一个城市在面临生态环境系统压力或突发冲击时,约束污染排放、维护生态环境状态和治理能力提升的综合水平。 参考郭海红和刘新民的研究&a…...
应对网络安全挑战:App等保测评的重要性与策略
在全球数字化转型的大潮中,移动应用(App)作为连接人们日常生活与互联网世界的桥梁,其数量与日俱增,功能日趋多样化。与此同时,App背后潜藏的网络安全风险也随之上升,数据泄露、隐私侵犯、恶意软件植入等问题频发&#…...
vue后台管理系统从0到1搭建(4)各组件的搭建
文章目录 vue后台管理系统从0到1搭建(4)各组件的搭建Main.vue 组件的初构 vue后台管理系统从0到1搭建(4)各组件的搭建 Main.vue 组件的初构 根据我们的效果来看,分析一下,我们把左边的区域分为一个组件&am…...
LabVIEW开关磁阻电机特性测量系统
基于LabVIEW软件和特定硬件组件的开关磁阻电机(SRM)特性测量系统,结合多功能数据采集卡,统能够准确地测量并分析SRM的电磁特性,从而支持电机模型的精确建立和性能优化。 项目背景 在工业生产和家用电器领域࿰…...
在当前网络环境中查看所有IPv4与Mac地址的方法
在powershell界面中: # 获取并显示所有网络接口的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规则使用方法 本篇目录: 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的,错误的使用方法 零、时光宝盒 (https://blog.csd…...
黑马程序员C++核心编程学习笔记
黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时,将内存大致分为4个区域:代码区,全局区,栈区,堆区 代码区:存放函数体的的二进制代码,操作系统管理。 🔵特点&a…...
六自由度平台
力姆泰克六自由度平台 安装方便,维护简单 多重机械电气安全保护 向下翻动查看更多 力姆泰克伺服系统集成 全新革命性结构设计与六轴先进伺服控制原理的结合,力姆泰克公司引进国外的专业技术在国内全新推出 全电动六自由度平台。将完全替代市场上原有的…...
【Node.js 下载及npm安装配置】亲测可用
Node.js 下载及npm安装配置 安装nodejs设置安装angular 安装nodejs 下载适用自己系统的node.js,官网:https://nodejs.cn/download/。默认安装即可。查看是否安装成功,node -v,npm -v ,出现版本号即安装成功。 设置 …...
Qt C++设计模式->访问者模式
访问者模式(Visitor Pattern)是一种行为型设计模式,它将操作与对象结构分离,使得你可以在不改变对象结构的前提下定义作用于这些对象的新操作。访问者模式通过引入一个访问者对象,允许你在不修改类的前提下向已有类添加…...
手机在网状态的详细应用场景有哪些?
手机在网状态的详细应用场景涵盖了多个行业和领域,以下是一些具体的例子: 金融行业 风控审核:银行、贷款公司等金融机构在审批贷款或信用卡时,可以通过查询手机在网状态来验证申请人的手机号码是否真实有效,从而降低欺…...
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,-v表示目录映射,-p时端口映射,把宿主机目录挂载到容器中 docker run -itd -p 80:80 -v /data/webapps/www/:/usr/share/nginx/html/ --nameweb02 nginx:latest 此时我们在发布网站时只需要放在宿主机的目录里就可以了 解…...
AM62A1-Q1汽车视觉处理器:低功耗、高集成度的车载视觉解决方案
1. 项目概述:为什么我们需要一颗“小而美”的汽车视觉处理器?最近在做一个车载环视和DMS(驾驶员监控系统)的预研项目,客户对成本和功耗卡得非常死,但功能要求却一点没降:需要同时处理1到2路摄像…...
终极指南:5步掌握MPh,让COMSOL仿真效率提升300%
终极指南:5步掌握MPh,让COMSOL仿真效率提升300% 【免费下载链接】MPh Pythonic scripting interface for Comsol Multiphysics 项目地址: https://gitcode.com/gh_mirrors/mp/MPh MPh(Pythonic scripting interface for Comsol Multip…...
FPGA资源省一半?揭秘多相滤波器在抽取/内插中的高效实现结构与Xilinx IP核配置要点
FPGA资源优化实战:多相滤波器在采样率转换中的高效架构与Xilinx IP核深度配置 当信号处理系统面临严苛的资源约束时,工程师们常常需要在性能与成本之间走钢丝。多相滤波器结构就像一位精明的财务顾问,能帮你在FPGA资源预算紧张的情况下&#…...
CNC木质树莓派外壳制作:从设计到加工的全流程实践
1. 项目概述:当数字制造遇上经典木艺 给树莓派找个“家”,这事儿我干过不少。从3D打印的塑料壳到亚克力板拼的“鱼缸”,总觉得差点意思。塑料感太强,亚克力又显得冰冷。直到有一次在工作室里看到一块边角料的硬枫木,纹…...
将自动化脚本打包成自己的app
在移动自动化领域,将编写好的 JS 脚本打包为独立 APK,能保护核心脚本逻辑、定制专属app。本文将从原理、准备、脚本编写、打包配置到测试发布,全方位详解自动化脚本打包成专属 APP 的完整流程。一、定制 APP 核心原理冰狐定制 APP 功能本质是…...
【教育研究者的AI外脑】:NotebookLM如何72小时内重构文献综述工作流?
更多请点击: https://codechina.net 第一章:【教育研究者的AI外脑】:NotebookLM如何72小时内重构文献综述工作流? 教育研究者长期面临文献爆炸与认知过载的双重压力:平均每位博士生需精读300篇中英文文献,…...
B站视频转文字:3分钟掌握高效内容整理新技能
B站视频转文字:3分钟掌握高效内容整理新技能 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理B站视频内容而烦恼吗?每天花费…...
从源头到治理:光伏并网逆变器直流分量抑制技术全解析
1. 光伏并网逆变器直流分量问题概述 第一次在光伏电站现场看到直流分量超标告警时,我盯着监控屏幕愣了半天。作为从业多年的光伏系统工程师,我深知这个看似微小的技术指标背后隐藏着多大的隐患。直流分量就像电网中的"隐形杀手",它…...
OneNote 2016/2019/2021多版本共存?教你管理不同版本的笔记同步与数据源
OneNote多版本共存管理:数据同步与版本控制的终极指南 在数字笔记领域,微软OneNote凭借其灵活的层级结构和多平台同步能力,成为许多知识工作者的核心工具。但鲜为人知的是,当同一台设备上同时运行多个OneNote版本(如UW…...
C51开发中汇编指令定位与内存优化实战
1. 理解C51开发中的汇编指令定位问题在嵌入式开发领域,尤其是使用Keil C51这类经典工具链时,我们经常需要深入理解编译器如何将高级语言转换为机器指令。最近我在调试一个8051项目时,遇到了一个典型问题:如何准确确定C源代码对应的…...
