Servlet学习日志

news2025/1/13 9:50:48

Hello Web

Web

World Wide Web 全球广域网->也称为万维网 是一种基于超文本和HTTP协议的分布式应用架构
HTML(HyperText Mark-up Language):用于链接网络上的信息
HTTP协议(HyperText Transfer Protocol):规定了服务端与客户端通信的规则

万维网:WWW是World Wide Web的简称

C/S: Client/Server 客户端与服务端交互的应用程序

B/S: Browser/Server 浏览器与服务器交互的web应用程序–>网站

c/s与b/s区别:
C/S需要客户拥有特定的客户端,比如你的app,你在app中的每次操作会被当作请求发送至服务器进行处理,服务器再做出对应的响应给你。
优点:响应速度快(客户端与服务端直接进行交互)、安全性高
缺点:宕机 、升级更新、运行工作全部由服务器完成、服务器运行压力较大
B/S只需要客户拥有浏览器即可访问,永远保持最新状态,避免了停机更新的时段。
优点: 客户无需升级,只需更新服务器即可。可以通过一定权限实现多客户访问,交互性较强
缺点:访问速度较慢、安全性没有C/S高

动态Web与静态Web

静态Web:所有的用户访问到的网页界面相同,如html、css、JavaScript
动态Web:不同客户访问同一网页得到的界面各不相同 如:servlet/JSP、PHP

Maven和TomCat

Tomcat

TomCat是阿帕奇Apache基金组织发行的开源、免费的服务器软件,属于中小型Java EE 服务器
安装与配置遍布全网 安装网址: http://tomcat.apache.org/

Maven

简单来讲:Maven用于在web开发中导入jar包使用,省去了导入大量jar包的步骤
官网:https://maven.apache.org/

一些依赖和配置:

阿里云镜像:

<mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
</mirrors>

servlet依赖&jsp依赖

javax.servlet-api
<!-- servlet依赖如下 -->
<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
<!-- ----------------------------------- -->
jsp-api
<!-- jsp依赖如下 -->
<dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>
<!-- mysql驱动配置 -->
<dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.0.31</version>
    </dependency>

Hello Servlet

Servlet:sun公司提供的一门开发动态Web的技术

  • Java提供了一个接口Servlet用于开发,我们通常把实现了Servlet接口的类称之为一个servlet
  • 开发web需要我们编写一个servlet实现类、将开发好的Java类部署到web服务器中

此处提到一个artifacts(可以理解为一个工件、构件) 我们开发完成的Java项目需要部署在服务器上,artifacts的作用就是将Java项目打成一个文件包(常见如war包、exploded包)
在IDEA中: 选中你的项目模块—>open Module Settings–>

在这里插入图片描述可以看到我们每个web项目模块都会生成这样的artifacts部署文件包,下面我们看TomCat的操作:在这里插入图片描述我们需要再tomCat上选择要运行的web项目文件包才能再服务器上部署:在这里插入图片描述同一时刻不建议将多个文件包选中(可能会造成包之间的冲突导致报错):在这里插入图片描述

ServletContext

用法一:共享数据

可以用于多个servlet之间通信(不通过数据持久化就可以实现)

// -- 设定servlet
this.getServletContext().setAttribute("键key","值value")

// -- 获取servlet
String value = this.getServletContext().getAttribute("键key")

用法二:获取初始化参数

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取servletContext容器  2. 根据初始化参数名获取该参数
        String url = req.getServletContext().getInitParameter("url");
        // 3. 写出
        resp.getWriter().println("url:"+url);
    }

<!-- 配置一些web程序初始化参数 -->
  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
  </context-param>
<!-- 注册servlet -->
  <servlet>
    <servlet-name>demo01</servlet-name>
    <servlet-class>gec.ServletDemo01</servlet-class>
  </servlet>
<!-- 映射servlet路径 -->
  <servlet-mapping>
    <servlet-name>demo01</servlet-name>
    <url-pattern>/demo01</url-pattern>
  </servlet-mapping>

用法三:请求转发

// --请求转发
        // --1. 获取请求转发器,并规定好转发的目标位置 /demo01  斜杠代表当前项目  demo01 表示某一个映射后的地址
        // RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo01");
        // --2. 调用forward方法转发  入参req、resp
        // requestDispatcher.forward(req,resp);
        // --3. 简化写法
 req.getRequestDispatcher("/demo01").forward(req,resp);

用法四:读取资源文件

在resources资源包下创建了资源文件( ##.properties文件 )可以通过servletContext+Properties进行读取,如下:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过properties获取文件资源内容
        // --1. 获取流
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        // --2. 创建properties对象
        Properties prop = new Properties();
        // --3. 将流注入属性对象
        prop.load(is);
        // --4. 以键值对形式获取指定路径下资源的内容
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        resp.getWriter().println("username="+username+"\npassword="+password);
    }

注意上述程序中的–> /WEB-INF/classes/db.properties

在这里插入图片描述

HTTPServletResponse–>resp

HTTPServletResponse: 服务器将要给客户端做出的响应
HTTPServletRequest: 服务器接收的客户端的请求

resp方法:

// 向浏览器发送数据
servletOutputstream getOutputstream() throws IOException;
Printwriter getwriter() throws IOException;
//向浏览器发送响应头
// 设置编码方式
void setCharacterEncoding(String var1)// 设置文本长度
void setContentLength(int var1)void setContentLengthLong(long var1);
// 设置文本文件类型  通常为--> text/hrml
void setContentType(String var1)void setDateHeader(String varl,long var2)
void addDateHeader(String var1,long var2)
//  设定头信息 通常 var1代表请求  var2代表操作
void setHeader(String var1,String var2);
void addHeader(String var1,String var2)void setIntHeader(String var1,int var2);
void addIntHeader(String varl,int var2);

下载文件操作

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // -- 下载文件
        // --1. 定义要下载的文件路径
        String realPath = "C:\\Users\\20729\\Desktop\\杂七杂八\\photo\\1.jpg";
        System.out.println("下载路径:"+realPath);
        // --2. 下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\"+1));
        // --3. 设置下载头信息(客户端真正执行下载操作的核心),另浏览器能够支持(Content-Disposition)所下载文件
        resp.setHeader("Content-disposition","attachment;filename"+fileName);
        // --4. 获取下载文件的输入流
        FileInputStream fis = new FileInputStream(realPath);
        // --5. 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        // --6. 通过响应对象获取输出流
        ServletOutputStream os = resp.getOutputStream();
        // --7. 写出文件
        while((len=fis.read(buffer))>0){
            os.write(buffer,0,len);
        }
        // --8. 关闭流
        fis.close();
        os.close();
    }

重定向

// 依旧以登录校验为例
if (username.equals("admin")&&password.equals("123456")){
            // 重定向
    /*
    	resp.sendRedirect("/mvnWeb-02/login.html")实际上是完成了以下两个步骤(按照下面的写法也可以完成重定向):
    	--1. resp.setHeader("Location","/mvnWeb-01/login.html");
    	--2. resp.setStatus(302);
    	302就是指重定向的状态代码,一般开发会用:
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
    */
            resp.sendRedirect("/mvnWeb-02/login.html");
        }else{
            resp.sendRedirect("/mvnWeb-02/index.html");
        }

重定向与请求转发

  1. 两者都可以实现页面跳转
  2. 请求转发时,url地址栏不会发生变化
  3. 重定向时,url地址栏会发生变化

请求转发如图:在这里插入图片描述

A想要请求获取C的资源但是不能直接获取,则A只能向B发送请求,B再请求C,最终返回

重定向如图:在这里插入图片描述

A想要获取C的资源,A本来是向B发送请求,但是A可以直接跳转定向C发送请求

HTTPServletRequest

请求转发

用户登录校验

doGet:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // 登录校验
        if (username.equals("admin")&&password.equals("123456")){
            // 请求转发
            req.getRequestDispatcher("/login.html").forward(req,resp);
        }else {
            req.getRequestDispatcher("/index.html").forward(req,resp);
        }
    }

index.html

<form action="/mvnWeb-02/login">
    // 此处action指定的login为servlet映射的地址叫做  login  --> 需要在web.xml配置
  账号:<input type="text" name="username" placeholder="输入账号"><br>
  密码:<input type="password" name="password" placeholder="输入密码"><br>
  <button type="submit" value="登录">登录</button>
</form>

login.html

    <h1>WELCOME TO MY WORLD!</h1>

web.xml

<!-- 注册Demo06 -->
  <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>gec.HttpServletRequestDemo07</servlet-class>
  </servlet>
  <!-- 映射servlet路径Demo05 -->
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

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

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

相关文章

国际海运流程有哪些,国际海运物流哪家比较好

国际海运的优点是运输费划算&#xff0c;并且可以走的货物类目多&#xff0c;合适大物件、大批的长距离运送。进出境运输工具的负责人、进出境物品的所有人或者他们的代理人向海关办理货物、物品或运输工具进出境手续及相关海关事务的过程&#xff0c;包括向海关申报、交验单据…

分析 SpringBoot 底层机制【Tomcat 启动分析 +Spring 容器初始化 +Tomcat 如何关联 Spring 容器 】

目录 一.搭建 SpringBoot 底层机制开发环境 1.pom.xml文件配置 2.springboot主程序MainApp.java 3.启动项目&#xff0c;然后我们准备开始思考 4.开始思考 底层机制分析: 仍然是 我们实现 Spring 容器那一套机制 IO/文件扫描注解反射 集合映射集合映射 二.源码分析: Spri…

DeepLab V2学习笔记

DeepLab V2遇到的相关问题以及解决方法对于DeepLab V1的优化模型总结补充的一个小知识点ASPPLearning rate policy实验结果消融实验实验结果遇到的相关问题以及解决方法 和DeepLab V1中遇到的问题几乎没有什么太大的差别&#xff0c;在文章的引言部分作者提出了在语义分割中遇…

小程序商城拓展中小商户“线上时间”,系统化思维

在数字经济时代初期&#xff0c;新一代信息基础设施建设仍有待完善&#xff0c;在拓展“互联网”应用场景中应不断缩小“数字鸿沟”&#xff0c;逐渐向产业和行业下沉&#xff0c;让互联网巨头和中小微商户共享数字技术的红利&#xff0c;也因此将推动包括传统商户在内的数字化…

政务系统信息网络安全的风险评估

在当今信息时代的大形势下&#xff0c;互联网从普及到飞速发展&#xff0c;政务系统信息网络安全的问题也日益被重视起来。一方面&#xff0c;人们应该了解到政务系统信息网络安全的重要性&#xff1b;另一方面&#xff0c;人们对政务系统信息网络安全风险评估工作有所了解。有…

公厕智能感应皂液盒,无液手机信息提醒

传统式的洗手液一按一压。有时候经常控制不住量&#xff0c;一不小心就容易按多&#xff0c;弄得洗手台乱七八糟&#xff0c;满身也是黏哒哒的&#xff0c;特别让人糟心。刚做完饭&#xff0c;满手油腻&#xff0c;或是刚上完厕所&#xff0c;去按洗手液泵势必会弄脏它。 所以智…

【Python+Appium】开展自动化测试(一)

目录 前言 一&#xff0c;安装JDK&#xff0c;配置JDK环境变量 1&#xff0c;下载jdk 2&#xff0c;安装jdk 3&#xff0c;配置jdk环境变量 二&#xff0c;安装Android SDK&#xff0c;配置Android SDK环境 1&#xff0c;下载Android SDK 2&#xff0c;双击SDK Manager…

【日常记录】解决‘GLIBC_2.34‘ not found,并且gcc制定glibc版本编译

小荣的日常记录 &#x1f525;系列专栏&#xff1a;日常记录 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月21日&#x1f334; &#x1f36d;作者水平很有限&#xff0c;如果发现错…

DETR训练自己数据集心得

对QKV的理解&#xff0c;先废一下话... 计算流程参考&#xff1a;https://zhuanlan.zhihu.com/p/82312421 给定一组query&#xff0c;和当前输入样本input&#xff08;每个样本都有各自的key&#xff09;&#xff0c;经过空间变化后input→query。 计算query和key之间的相关…

深度学习与总结JVM专辑(二):垃圾回收基础(图文+代码)

垃圾回收基础概念什么是垃圾回收为什么要进行垃圾回收垃圾什么是垃圾你是垃圾吗&#xff1f;让我用算法来测测你。引用计数算法可达性分析算法对象引用对象&#xff0c;真的死了吗方法区回收废弃常量无用类垃圾回收算法回收类型分代收集理论标记清除算法&#xff08;Mark-Sweep…

【Hack The Box】linux练习-- Irked

HTB 学习笔记 【Hack The Box】linux练习-- Irked &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

[附源码]计算机毕业设计JAVA基于ssm的电子网上商城

[附源码]计算机毕业设计JAVA基于ssm的电子网上商城 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

基于FPGA的PID控制器开发与实现

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 效果预览: 目录 一、理论基础 二、核心程序 三、测试结果

数据结构与算法之顺序表详解

标题&#xff1a;猜数字小游戏 作者&#xff1a;Ggggggtm 寄语&#xff1a;与其忙着诉苦&#xff0c;不如低头赶路&#xff0c;奋路前行&#xff0c;终将遇到一番好风景 文章目录&#xff1a; 一、顺序表的概念与结构 1、线性表的解释 2、顺序表概念解释 二、顺序表的思路及代码…

ERP系统三种部署方式的区别

ERP系统被认为是一种 "企业应用程序"&#xff0c;指的是为满足企业的软件需求和提高业务绩效而设计的软件。今天有许多不同的ERP系统可供使用&#xff0c;其范围很广&#xff0c;取决于企业的规模、功能和需求。ERP系统的类型根据其部署方式划分&#xff0c;包括云ER…

二、Redis分布式锁

一、什么是分布式锁 分布式锁是一种跨进程的&#xff0c;跨机器节点的一种互斥锁。保证在多个机器节点对共享资源访问的一个排他性。 分布式与单机情况下最大的不同在于分布式锁是多进程的而单机锁是单进程多线程的。 二、为什么需要分布式锁 与分布式锁相对就的是单机锁&…

BHQ-1 amine,1308657-79-5,BHQ染料通过FRET和静态猝灭的组合工作

英文名称&#xff1a;BHQ-1 amine 中文名称&#xff1a;BHQ-1 氨基 CAS&#xff1a;1308657-79-5 外观&#xff1a;深紫色粉末 分子式&#xff1a;C25H29N7O3 分子量&#xff1a;475.55 结构式&#xff1a; 溶解性&#xff1a;溶于大部分有机溶剂&#xff0c;溶于水 储存…

luffy-(13)

内容概览 支付宝支付介绍支付宝支付二次封装订单相关表设计生成订单接口支付前端支付宝回调接口 支付宝支付介绍 """ 项目中有需要在线支付功能,可以使用支付宝支付(沙箱环境)微信支付(需要有备案过的域名)云闪付我们的项目以支付宝支付为例支付流程使用官方…

【动手学深度学习】关于“softmax回归的简单实现”报错的解决办法(含源代码)

目录&#xff1a;关于“softmax回归的简单实现”报错的解决办法一、前言二、实现步骤2.1 导包2.2 初始化模型参数2.3 重新审视Softmax的实现2.4 优化算法2.5 训练2.6 源代码三、问题出现四、问题的解决五、再跑代码六、改正后的函数源代码一、前言 在之前的学习中&#xff0c;…

题库系统(公众号免费调用)

题库系统(公众号免费调用) 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff0…