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>");}

成功:

失败:

 

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

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

相关文章

【Python】JSON操作中的高效小窍门

JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;在各种应用场景中扮演着重要角色。Python 中处理 JSON 数据非常便捷&#xff0c;主要通过内置的 json 模块来实现。 本文将详细介绍如何使用 Python 进行 JSON 数据的操作&am…

AI与物理学的交汇:Hinton与Hopfield获诺贝尔物理学奖

诺贝尔物理学奖颁给了AI&#xff01;机器学习先驱Hinton与Hopfield联手获奖&#xff0c;出乎所有人的意料。 今年的诺贝尔物理学奖颁给了机器学习领域的两位先驱&#xff0c;杰弗里辛顿&#xff08;Geoffrey Hinton&#xff09;和约翰霍普菲尔德&#xff08;John Hopfield&…

CSS计数器

CSS 中的计数器类似于变量&#xff0c;可以实现简单的计数功能&#xff0c;并将结果显示在页面上&#xff0c;在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性&#xff1a; counter-reset&#xff1a;创建或者重置计数器&#xff1b;counter-increment&#xf…

【软件部署安装】OpenOffice转换PDF字体乱码

现象与原因分析 执行fc-list查看系统字体 经分析发现&#xff0c;linux默认不带中文字体&#xff0c;因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径&#xff1a; C:\Windows\Fonts 的中文字体&#xff0c;如扩展名为 TTC 与TT…

力扣题31~40

题31&#xff08;中等&#xff09;&#xff1a; 分析&#xff1a; 其实这题题目比较难懂&#xff0c;题目还是挺简单的 我们可以从后面末尾开始&#xff0c;如果前一个大于后面的&#xff0c;说明后面不用动&#xff0c;如果小于&#xff0c;那就找仅仅大于它的数字放前面&…

Chromium 关闭 Google Chrome 后继续运行后台应用功能分析c++

此功能允许关闭 Google Chrome 后继续运行后台&#xff0c;控制此功能的开关是 // Set to true if background mode is enabled on this browser. //更改此值可以修改默认开启关闭 inline constexpr char kBackgroundModeEnabled[] "background_mode.enabled"; …

案例分享—国外优秀UI设计作品赏析

深色UI界面的优点众多&#xff0c;首先体现在视觉舒适度上。深色背景能减少屏幕高亮面积&#xff0c;降低眼部压力&#xff0c;尤其在夜间或光线不足的环境下&#xff0c;深色模式能显著缓解眼睛疲劳&#xff0c;提供更舒适的使用体验。 深色UI界面在设计上更具高端感和优雅氛围…

用Raspberry Pi Imager重装树莓派系统

今天删东西的时候&#xff0c;无意中把系统文件给remove了&#xff0c;结果树莓派无法正常启动&#xff0c;只能重新安装。 用DiskGenius工具将SD卡彻底清空&#xff0c;并将boot分区和文件分区合并为一&#xff0c;之后再对这个新分区进行了格式化。接下来就是烧录镜像了。以…

自动化测试 | 窗口截图

driver.get_screenshot_as_file 是 Selenium WebDriver 的一个方法&#xff0c;它允许你将当前浏览器窗口&#xff08;或标签页&#xff09;的截图保存为文件。这个方法对于自动化测试中的截图验证非常有用&#xff0c;因为它可以帮助你捕获测试执行过程中的页面状态。 以下是…

布隆过滤器(Bloom Filter)详解

一、引言 在处理大量数据的场景中&#xff0c;我们经常会遇到判断一个元素是否在某个集合中的问题。传统的方法可能是使用 HashMap 等集合将数据保存起来&#xff0c;然后进行比较确定&#xff0c;但在元素很多的情况下&#xff0c;这种方式会非常浪费空间&#xff0c;检索速度…

Map的实现类:TreeMap

1.存储结构&#xff1a;红黑树 2.实现了SortedMap接口&#xff08;是Map的子接口&#xff09;&#xff0c;可以对key自动排序。 3.实例代码&#xff1a;Student类和Demo03 如果出现类转换异常 参考【TreeSet&#xff08;红黑树&#xff09;】 package com.map;import java…

使用Git生成SSH密钥教程(附Git常用命令)

一、为什么使用SSH&#xff1f; 使用 Git 的 SSH&#xff08;安全外壳协议&#xff09;主要有以下几个原因&#xff1a;1. 安全性&#xff1a;SSH 是一种加密的网络协议&#xff0c;用于在网络中安全地运行网络服务。使用 SSH&#xff0c;所有传输的数据都会被加密&#xff0c…

Lory: 推进大型语言模型训练的新篇章

人工智能咨询培训老师叶梓 转载标明出处 随着模型规模的增长&#xff0c;如何有效训练并利用这些模型成为了一个挑战。陈丹琦团队一项新的研究提出了一种创新的预训练方法——Lory&#xff0c;旨在解决大模型在混合专家&#xff08;MoE&#xff09;架构中的可微分性和计算效率…

主机加固的关键要素:服务器防病毒

在数字化浪潮中&#xff0c;网络安全已成为企业不可忽视的一环。尤其是安全运维人员&#xff0c;他们肩负着保护企业数据不受侵害的重任。MCK主机加固解决方案&#xff0c;正是为了应对这一挑战而生。 网络安全的严峻现实 不久前&#xff0c;一家知名企业因勒索病毒攻击而被迫…

2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)

第二步链接&#xff1a; 2024 kali虚拟机安装教程&#xff0c;分两大步骤&#xff0c;图文讲解&#xff08;2&#xff09;-CSDN博客 准备工作 1.kali的iso镜像文件 2.VMware Workstation Pro 虚拟机软件 正式开始 1.创建新的虚拟机&#xff0c;勾选自定义&#xff08;高级…

ssm基于SSM框架的餐馆点餐系统的设计+VUE

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) &#xff0c;f(m)指代至少有m个位置不合法的方案数。 怎么求&#xff1f; 注意到位置为id&#xff0c;权值为v ,不合法的情况&#xff0c;当且仅当 v idk或 v id-k 因此&#xff0c;我们把每一个位置和权值抽象成点 &#xff0c;不合法的情况之间连一…

Docker容器简介及部署方法

1.1 Docker简介 Docker之父Solomon Hykes&#xff1a;Docker就好比传统的货运集装箱 2008 年LXC(LinuX Contiainer)发布&#xff0c;但是没有行业标准&#xff0c;兼容性非常差 docker2013年首次发布&#xff0c;由Docker, Inc开发 1.1.1什么是Docker Docker是管理容器的引…

数据结构-LRU缓存(C语言实现)

遇到困难&#xff0c;不必慌张&#xff0c;正是成长的时候&#xff0c;耐心一点&#xff01; 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…

Java后端面试----某团一面

美团一面 1.介绍一下你的第一个项目 这个就不多说了&#xff0c;主要是根据自己的简历上面的项目进行一个简短的概括使用的技术栈和什么背景解决了什么问题等等。 2.线程安全的类有哪些&#xff0c;平时有使用过哪些&#xff0c;主要解决什么问题 在Java中线程安全的类比如…