Servlet概念理解和具体实现

news2024/11/16 0:30:22

目录

1、C/S架构和B/S架构

(1)C/S架构

(2)B/S架构

(3)B/S架构的技术原理

(4)CS/BS区别

(5)B/S技术的工作原理

(6)什么是URL 

(7)Tomcat介绍

(8)Web项目的目录结构

2、Servlet概念理解和具体实现

(1)什么是Servlet

(2)Servlet与JSP的关系

(3)Servlet和用户、tomcat、客户端、eclipse等集成开发环境、浏览器之间的关系。

(4)初始Servlet

(5)Servlet搭建框架

(6)Servlet体系结构

(7) Servlet接口

(8)GenericServlet抽象类

(9)HttpServlet抽象类

(10)ServletConfig接口

(11)ServletContext接口

(12)请求、响应相关接口

(13)ServletRequest接口

(14)HttpServletRequest接口

(15)HttpSession接口

(16)ServletResponse接口 

(17)HttpServletResponse接口 

(18)使用Servlet实现控制器 

(19)Servlet的生命周期


1、C/S架构和B/S架构

(1)C/S架构

        Client/Server (客户机/服务器) 结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。例如qq、无畏契约、墨迹天气等等这种软件都是C/S架构

(2)B/S架构

        Browser/Server (浏览器/服务器) 结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现。例如百度、谷歌、淘宝网等等这种网页就是B/S架构

(3)B/S架构的技术原理

        B/S 架构通过 请求 / 响应 的模式进行交互。

(4)CS/BS区别
B/S架构C/S架构
软件安装浏览器需要专门的客户端应用
升级维护客户端零维护客户端需要单独维护升级
平台相关与操作系统平台的关系最小化对客户端操作系统一般有限制
性能安全在响应速度和安全性上 需要花费更多设计成本能充分发挥客户端处理能力, 客户端响应快
(5)B/S技术的工作原理

        B/S架构采用 请求/响应 模式进行交互

(6)什么是URL 
  • Uniform Resource Locator统一资源定位符
  • URL的组成

(7)Tomcat介绍

(8)Web项目的目录结构
目录说明
/Web应用的根目录,该目录下所有文件 在客户端都可以访问(JSP、HTML等)
/WEB-INF存放应用使用的各种资源,该目录及其 子目录对客户端都是不可以访问
/WEB-INF/classes存放Web项目的所有的class文件
/WEB-INF/lib存放Web应用使用的JAR文件

        创建、部署和发布项目:

        部署Web项目:

        配置访问页面:通过配置文件web.xml修改访问起始页

2、Servlet概念理解和具体实现

(1)什么是Servlet

        Servlet是在服务器端运行的Java程序可以接收客户端请求并做出响应

        Servlet可以动态生成HTML内容对客户端进行响应。

(2)Servlet与JSP的关系

        Servlet与JSP都可以动态生成HTML内容,二者之间是否存在什么联系?

(3)Servlet和用户、tomcat、客户端、eclipse等集成开发环境、浏览器之间的关系。

        1. 用户 (User)

        用户是使用浏览器访问Web应用的终端用户。他们通过浏览器输入URL或点击链接来请求Web资源。

        2. 浏览器 (Browser)

        浏览器是用户与Web应用交互的工具。浏览器发送HTTP请求给服务器并接收HTTP响应来展示网页内容

        3. 客户端 (Client)

        客户端通常指用户的设备和浏览器的组合,负责发起请求并接收和展示来自服务器的响应

        4. 服务器 (Server)

        服务器是一台计算机或一组计算机,负责接收来自客户端的请求,处理这些请求,并发送响应回客户端。在Web应用中,服务器通常指的是运行Web服务器软件的机器。

        5. Tomcat

        Tomcat是一个开源的Java Servlet容器,它是Java EE(Enterprise Edition)的一部分,也是开源 Java EE 应用服务器,负责运行Java Servlet和JSP(JavaServer Pages)应用,也提供了一个 Servlet 和 JSP 容器。Tomcat接受客户端的HTTP请求,将这些请求转发给合适的Servlet处理,并将Servlet的响应返回给客户端。

        6. Servlet

        Servlet是运行在服务器端小型Java程序,负责处理客户端的请求并生成动态Web内容。Servlet由Tomcat容器管理和运行,能够通过处理表单提交、与数据库交互等方式生成动态响应。

        7. Tomcat和Servlet的关系

        Tomcat 可以运行 Servlet,处理与 Servlet 相关的请求和响应。

        8. Tomcat 和浏览器的连接

        当用户在浏览器中输入某网站的地址或点击链接时,浏览器会向服务器发送请求。这个请求如果是在 Tomcat 服务器上,Tomcat 将负责处理这个请求,执行相应的 Servlet,然后发送响应回浏览器。

        9. Eclipse 与这三个元素的关系

        Eclipse 是一个功能强大的集成开发环境(IDE),被广泛用于开发 Java 应用程序,包括 Servlet。开发人员使用 Eclipse 来创建、编译和调试 Servlet 应用程序,这些应用在 Tomcat 这样的 Web 应用服务器上运行。Eclipse 提供了用于配置 Servlet 和 Web 应用的工具和库。eclipse等集成开发环境工具提供的java代码

        10. 用户点击浏览器之间的操作

  • 用户通过浏览器服务器(如Tomcat)发送HTTP请求。
  • 浏览器(客户端的一部分)接收用户输入的URL并发送HTTP请求到服务器
  • 服务器(在本例中是Tomcat)接收请求并将其交给相应的Servlet处理。
  • Servlet处理请求,执行必要的业务逻辑(如访问数据库、处理数据等),生成响应内容。
  • TomcatServlet的响应封装成HTTP响应,发送回浏览器
  • 浏览器接收HTTP响应并将内容展示给用户

(4)初始Servlet

(5)Servlet搭建框架

        在view视图层(控制层)中写的是servlet代码,用来接收tomcat的请求和响应。request代表的请求(拿用户的数据)、response代表的响应(反馈给用户)。

        每个Servlet都有一个映射的URL路径,用于将一个Servlet类映射到一个URL路径。具体来说,@WebServlet("/bbb")告诉Servlet容器,当请求的URL路径为/bbb时,应该将请求发送到对应的Servlet类进行处理

@WebServlet("/bbb")

        首先,这段代码是一个Java Servlet的doGet方法实现,它处理HTTP GET请求HttpServletRequest 对象代表客户端请求,HttpServletResponse对象用于生成响应。

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

        设置响应字符集:这两行代码设置响应的字符编码为UTF-8,并指定内容类型为HTML。 

response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");

        获取数据库会话和输出流:方法获取MyBatis的SqlSession对象,用于与数据库交互。 

SqlSession sqlSession = DaoUtil.getSqlSession();

        用于向客户端输出响应内容。 

PrintWriter out = response.getWriter();

        获取请求参数:request.getParameter(String name)是HttpServletRequest对象的方法,用于获取请求参数的值。参数name是请求参数的名称。从HTTP请求中获取名为keyname的参数值。 如果请求中包含这个参数,返回其值并赋给变量keyname。

String keyname = request.getParameter("keyname");

        查询学生信息:如果keyname参数不为空,则执行模糊查询;否则查询所有学生信息。

StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> slist = null;
if(keyname != null && !keyname.isEmpty()) {
	slist = stuMapper.findStudentLikeSname(keyname);
}else {
	slist = stuMapper.findAllStudent();
}

        生成HTML响应:生成HTML页面,包括表单和学生信息表格。表格中的每一行显示一个学生的信息,并提供删除和修改链接。

String html = "<!DOCTYPE html>\r\n"
        + "<html>\r\n"
        + "    <head>\r\n"
        + "        <meta charset=\"utf-8\">\r\n"
        + "        <title></title>\r\n"
        + "        <link rel=\"stylesheet\" type=\"text/css\" href=\"\"/>\r\n"
        + "    </head>\r\n"
        + "    <body>\r\n"
        + "       <a href=\"addstu\">添加学生</a> " + request.getParameter("stuno")
        + "       <form action=\"bbb\" method=\"get\">"
        + "       <input type=\"text\" name=\"keyname\" value=\"" + (keyname == null ? "" : keyname) + "\" />"
        + "       <input type=\"submit\" value=\"查询\" />"
        + "       </form>"
        + "       <table border=\"1\">\r\n"
        + "            <tr>\r\n"
        + "                <th>编号</th>\r\n"
        + "                <th>姓名</th>\r\n"
        + "                <th>生日</th>\r\n"
        + "                <th>性别</th>\r\n"
        + "                <th>班级</th>\r\n"
        + "            </tr>\r\n";

for (int i = 0; i < slist.size(); i++) {
    html += "            <tr>\r\n"
        + "                <td>" + slist.get(i).getSid() + "</td>\r\n"
        + "                <td>" + slist.get(i).getSname() + "</td>\r\n"
        + "                <td>" + slist.get(i).getBirthday() + "</td>\r\n"
        + "                <td>" + slist.get(i).getSsex() + "</td>\r\n"
        + "                <td>" + slist.get(i).getClassid() + "</td>\r\n"
        + "                <td><a href=\"delstu?stuno=" + slist.get(i).getSid() + "\">删除</a>"
        + "                    <a href=\"editstu?stuno=" + slist.get(i).getSid() + "\">修改</a>"
        + "                </td>\r\n"
        + "            </tr>\r\n";
}
html += "        </table>\r\n"
        + "    </body>\r\n"
        + "</html>";

        输出HTML响应并关闭资源:将生成的HTML内容输出到客户端并关闭输出流。最后,关闭数据库会话以释放资源。

out.print(html);
out.close();
DaoUtil.closeResource(sqlSession);

        剩增删改查还有模糊查询的代码如下(由于太多我就把删除的代码展示出来):

        删除

@WebServlet("/delstu")
public class DeleteStudentServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String sid = request.getParameter("stuno");
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		
		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
		int ret = stuMapper.delStudent(Integer.parseInt(sid));
		
		if(ret > 0) {
			sqlSession.commit();
//			response.sendRedirect("bbb");
			// 转发
			request.getRequestDispatcher("bbb").forward(request, response);
		}else {
			sqlSession.rollback();
		}

		DaoUtil.closeResource(sqlSession);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

        其中的request.getRequestDispatcher("bbb").forward(request, response)是用于在服务器端将请求转发到另一个资源(如另一个Servlet、JSP页面或HTML文件)。

        request.getRequestDispatcher("bbb"):从request对象中获取一个RequestDispatcher对象。这个对象是一个路径为"bbb"的请求分派器。路径可以是相对路径或绝对路径,根据实际应用程序的配置。这里的"bbb"可以指向一个Servlet、JSP页面或其他资源。

        forward(request, response):调用RequestDispatcher对象的forward方法,将当前请求和响应对象转发到目标资源。在这种情况下,客户端不会察觉到请求的转发,因为URL不会改变。请求和响应对象会被传递到新的资源,这样新的资源可以使用原始请求中的所有信息。

(6)Servlet体系结构

(7) Servlet接口

        定义了所有Servlet需要实现的方法:

(8)GenericServlet抽象类

 

(9)HttpServlet抽象类

        继承自GenericServlet,处理HTTP协议的请求和响应:

(10)ServletConfig接口

        在Servlet初始化过程中获取配置信息,一个Servlet只有一个ServletConfig对象:

(11)ServletContext接口

        获取Web应用上下文,与Servlet容器进行通信:

(12)请求、响应相关接口

(13)ServletRequest接口

(14)HttpServletRequest接口

        除了继承ServletRequest接口中的方法,还增加了一些用于读取 HTTP请求信息的方法:

(15)HttpSession接口

(16)ServletResponse接口 

(17)HttpServletResponse接口 

(18)使用Servlet实现控制器 

 (19)Servlet的生命周期

        生命周期的各个阶段

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

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

相关文章

华杉研发九学习日记24 线程同步 死锁 线程通信 线程池 Callable接口

华杉研发九学习日记24 java多线程 一&#xff0c;线程同步 1.1 线程同步问题 多个线程同时操作一个全局数据或静态数据时可能会造成数据冲突 解决&#xff1a; synchronized同步代码块synchronized同步方法使用锁对象加锁解锁 // 火车站卖车票 -- 100张 public class…

Django ASGI服务

1. ASGI简介 在Django中, ASGI(Asynchronous Server Gateway Interface)的引入使得Django应用能够支持异步编程. 从Django 3.0开始, Django就增加了对ASGI的支持, 但直到Django 3.1才正式推荐在生产环境中使用ASGI. ASGI是一个用于Python的异步Web服务器的标准接口, 它允许你运…

图解RocketMQ之消息如何存储

大家好&#xff0c;我是苍何。 人一辈子最值得炫耀的不应该是你的财富有多少&#xff08;虽然这话说得有点违心&#xff0c;呵呵&#xff09;&#xff0c;而是你的学习能力。技术更新迭代的速度非常快&#xff0c;那作为程序员&#xff0c;我们就应该拥有一颗拥抱变化的心&…

西安交通大学先进动力与新能源发展峰会举行

8月3日&#xff0c;西安交通大学第十届先进动力与新能源发展峰会暨西安交大先进动力校友会2024年年会在深圳举行。西安交通大学党委常委、副校长单智伟&#xff0c;南方科技大学清洁能源研究院院长、创新创业学院院长、澳大利亚国家工程院外籍院士刘科&#xff0c;西安交通大学…

抑制电机噪声的又一神器 -- 三线共模电感

概述 针对电机产品&#xff0c;尤其是三相无刷电机&#xff0c;如图1&#xff0c;其噪声源主要是电机的开关驱动模块&#xff08;具体可参阅另一篇文章“”&#xff09;&#xff0c;而一般的等效天线即为连接电机与驱动板的电机线&#xff08;等效天线、四分之一波长的理论解释…

R18 NTN中的Satellite switch with re-sync过程

更多精彩内容,请阅知识星球合集链接。该链接收录了目前知识星球所有内容,涵盖了5G相关领域的绝大多数知识点;主要以协议原文截图后进行解释讲解外加实网log对照为主,辅以星友问答等等精华内容。 合集链接如下(不用登录飞书即可查看):Docs 如果您对3GPP spec阅读有困扰; 如…

HTTPS 比 HTTP 更安全吗?这两种协议有什么区别?

在互联网的通讯过程中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全HTTP&#xff09;是两种最基本、最重要的通讯协议&#xff0c;它们在网络中都扮演着重要的角色。然而近年来&#xff0c;随着网络安全问题的日益突出&#xff0c;HTTPS的安…

测试人员怎么通过浏览器开发工具 Performance 分析性能

在现代Web开发中&#xff0c;性能优化是一个永恒的话题。对于测试人员来说&#xff0c;如何有效地使用浏览器开发工具中的Performance面板&#xff0c;进行性能分析和调优&#xff0c;是一项必备技能。本文将带你深入了解浏览器开发工具Performance面板的使用方法及其在性能测试…

OrangePi AIpro学习2 —— 配置昇腾DVPP环境

目录 一、clone需要运行的软件 二、运行corp程序 2.1 解决缺少sample_common.sh 2.2 解决缺少INSTALL_DIR环境变量 2.3 运行程序 三、测试其他程序 3.1 程序目录 3.2 程序注意事项 3.3 如何找出报错原因 一、clone需要运行的软件 1. 软件地址 samples: CANN Samples…

Docker 设置代理

Docker 设置代理 创建配置文件 sudo mkdir -p /etc/systemd/system/docker.service.d sudo touch /etc/systemd/system/docker.service.d/proxy.conf sudo vim /etc/systemd/system/docker.service.d/proxy.conf 编辑代理配置 #输入以下内容&#xff0c;其中代理改成自己的…

【大小球让球实战】——深度剖析足球大小球数据分析软件,找到一个临界点,把准确率提高到70%?

最近在跟一些圈内朋友聊天&#xff0c;发现每个人都有一套自己的玩球逻辑&#xff0c;比如有些人看亚盘&#xff0c;有些看欧盘&#xff0c;有些玩绝杀&#xff0c;有些看盘口&#xff0c;是否可以自定义的去玩球&#xff1f;结合多年的经验&#xff0c;把分析的过程大概写了一…

ESP32在ESP-IDF环境下禁用看门狗

最近使用了一款ESP32的开发板。但在调试时发现出现许多看门狗复位事件&#xff1a; E (8296) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time: E (8296) task_wdt: - IDLE (CPU 0) E (8296) task_wdt: Tasks curre…

FFmpeg 7.0重大更新

0、维护工作 对于任何成熟的软件&#xff0c;每个版本必然包含大量的bugfix、cleanup。维护工作不会出现在Changelog中&#xff0c;不是吸引眼球的东西&#xff0c;但是人力投入的占比最高&#xff0c;是一个项目长期稳定的保证。 维护工作必须得提两个人&#xff0c;Andreas…

校园超市收银软件的挑战:双系统困境-亿发

在现代零售业中&#xff0c;高效的管理系统是确保业务顺利进行的关键。然而&#xff0c;对于学校直属管理的超市来说&#xff0c;选择合适的收银系统往往是一项挑战。由于缺乏能够同时满足收银和进销存管理需求的高适配性系统&#xff0c;许多学校超市不得不同时使用两套系统&a…

iPhone手机清理软件:让你的设备焕然一新

随着智能手机在我们生活中的地位日益重要&#xff0c;保持设备的最佳性能就显得尤为关键。对于iPhone用户而言&#xff0c;随着时间的推移&#xff0c;手机可能会因累积了过多的缓存文件、重复照片、未使用的应用和各种其他数据而变得缓慢。幸运的是&#xff0c;市面上有多种iP…

可以翻页、互动、留言和弹幕的仿真电子相册制作方法

​在数字化时代&#xff0c;仿真电子相册作为一种结合了翻页、互动、留言和弹幕等多种功能的创意表达形式&#xff0c;正逐渐成为人们记录生活和分享回忆的重要方式。本教程将介绍如何利用FLBOOK这款强大的电子相册制作工具&#xff0c;制作具有这些特性的令人印象深刻的作品。…

ICM-20948芯片详解(6)

接前一篇文章&#xff1a;ICM-20948芯片详解&#xff08;5&#xff09; 五、组件概览及详述 再次给出ICM-20948芯片的内部结构框图&#xff1a; 2. 组件详述 &#xff08;6&#xff09;辅助I2C串行接口 ICM-20948具有用于与外部传感器通信的辅助I2C总线。该总线有两种操作模…

实时采集同花顺要闻直播资讯

采集同花顺要闻直播资讯能实时掌握市场动态、政策变化及企业新闻&#xff0c;对投资者而言&#xff0c;有助于及时做出投资决策&#xff0c;把握市场机会&#xff0c;规避风险。对于研究机构和媒体&#xff0c;它提供一手资料&#xff0c;支持深度分析与报道。 采集网址&#x…

第 8 章 虚拟文件系统(7)

目录 8.5 标准函数 8.5.1 通用读取例程 8.5.2 失效机制 8.5.3 权限检查 8.6 小结 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 8.5 标准函数 大多数文件系统中 file_operations 的 read&#xff0c;write 分别为&#xff1a; do_sync_read&am…

Android开发之事件分发

#来自ウルトラマンゼロ&#xff08;哉阿斯&#xff09; 1 Activity 构成 平常布局展示在ContentView中。 2 事件分发 事件分发的本质其实就是把事件&#xff08;Touch&#xff09;封装成 MotionEvent 类&#xff0c;然后传递给 View 的层级处理。 MotionEvent 事件类型主要有…