JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生

  • 官网文档
  • 为什么会出现Servlet
  • 什么是Servlet
  • Servlet在JavaWeb项目位置
  • Servlet基本使用
    • Servlet开发方式说明
    • 快速入门- 手动开发 servlet
    • 浏览器请求Servlet UML分析
    • Servlet生命周期
    • GET和POST请求分发处理
    • 通过继承HttpServlet开发Servlet
    • IDEA配置Servlet
    • Servlet注意事项和细节
  • Servlet注解方式
    • 快速入门
      • 注解详解
      • initParams
    • Servlet urlPattern 配置
      • 精准匹配
      • 目录匹配
      • 扩展名匹配
      • 任意匹配
      • 注解注意事项

在这里插入图片描述

官网文档

官网文档: https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html

离线文档
JAVA_EE_api_中英文对照版

●Servlet和Tomcat的关系: 一句话, Tomcat支持Servlet
在这里插入图片描述

为什么会出现Servlet

1.提出需求: 请用你现有的html css javascript, 开发网站, 比如可以让用户留言/购物/支付, 你能搞定吗?

2.引入我们动态网页(能和用户交互)技术 ⇒ Servlet

3.对Java Web技术体系的流程图改造说明(细化).[整体的概念]
在这里插入图片描述

什么是Servlet

Servlet在开发动态WEB工程中, 得到广泛的应用. 掌握好Servlet非常重要, Servlet(基石)是SpringMVC的基础

Servlet(java 服务器小程序), 它的特点:
1.它是由服务器端调用和执行的(一句话: 是Tomcat解析和执行)
2.它使用java语言编写的, 本质就是Java
3.它是按照Servlet规范开发的(除了tomcat->Servlet weblogic->Servlet)
4.功能强大, 可以完成几乎所有的网站功能(在以前, 老程序员, 使用Servlet开发网站) 技术栈要求高, 内卷(硬起来)

Servlet在JavaWeb项目位置

在这里插入图片描述

Servlet基本使用

Servlet开发方式说明

1.servlet3.0前使用web.xml, servlet3.0版本以后(包括3.0)支持注解, 同时支持web.xml配置

2.如何查看servlet版本[如图]
在这里插入图片描述

3.讲解SpringBoot时, 我们用注解方式, 从ssm, springboot后面全部使用注解

4.这里专门讲servlet, 为让大家更清晰地知道servlet使用原理, 我们用配置方式(说明, 原生的Servlet在项目中使用很少)

5.不管使用哪种方式, 本质都一样

快速入门- 手动开发 servlet

需求说明
1.开发一个HelloServlet
2.当浏览器 访问 http://localhost:8080/web应用名/helloServlet时, 后台输出 hi HelloServlet

●具体步骤
1.编写类HelloServlet去实现Servlet接口
2.实现service方法, 处理请求, 并响应数据
3.在web.xml中去配置servlet程序的访问地址

1.创建servlet Java Web工程, 并配置好Tomcat. IDEA开发部署JavaWeb工程

2.添加servlet-api.jar(在tomcat/lib下) 到工程, 因为servlet.jar 不是jdk自带的, 要引入

3.在src目录 com.zzw.servlet包下新建HelloServlet.java, 并实现Servlet接口

package com.zzw.servlet;import javax.servlet.*;
import java.io.IOException;/*** @author 赵志伟* @version 1.0* 1.开发一个Servlet需要实现Servlet接口* 2.实现Servlet接口的五个方法*/
@SuppressWarnings({"all"})
public class HelloServlet implements Servlet {private int count;/*** 1.初始化 servlet* 2.当创建HelloServlet实例时, 会调用init方法* 3.该方法只会被调用一次** @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init() 被调用");}/*** 返回ServletConfig 也就是返回Servlet的配置** @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 1.service方法处理浏览器的请求(包括get和post)* 2.当浏览器每次请求Servlet时,就会调用一次service方法* 3.当tomcat调用该方法时,会把http请求的数据封装成实现了ServletRequest接口的request对象* 4.通过servletRequest对象,可以得到用户提交的数据* 5.servletResponse对象可以用于返回数据给tomcat->浏览器** @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest,ServletResponse servletResponse) throws ServletException, IOException {//如果count的值在不停地累积, 说明HelloServlet是单例的System.out.println("hi HelloServlet~, count=" + count++);}/*** 返回servlet的信息,使用较少* @return*/@Overridepublic String getServletInfo() {return null;}/*** 1.该方法是在servlet被销毁时,调用* 2.只会调用一次*/@Overridepublic void destroy() {}
}

web.xml注释时发现前面有空格
在这里插入图片描述
解决方案 Settings->Editor->Code Style->XML, 取消勾选
在这里插入图片描述
IDEA配置快捷键: settings->Keymap
重启(Alt+R)选择重新部署,速度快, 不要选Restart server, 这样会把JDK都重启, 速度很慢
在这里插入图片描述

  1. 在web.xml文件中配置由Tomat访问HelloServlet的路径
<?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"><!--小技巧:web.xml主要用来配置该web应用使用到的Servlet--><!--1.servlet-name: 给Servlet取名(由程序员决定), 这个名字是不能重复取的2.servlet-class:该Servlet的类的全路径, Tomcat在反射生成Servlet时需要使用3.url-pattern: 这个就是访问该Servlet的url地址这时我们可以这样访问:http://localhost:8080/servlet/helloServlet4.url-pattern 访问地址是由程序员决定的5.load-on-startup 表示在tomcat 启动时, 会自动地加载servlet实例小技巧: alt+R -> Redeploy选择重新部署, 速度更快--><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.zzw.servlet.HelloServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/helloServlet</url-pattern></servlet-mapping>
</web-app>

浏览器请求Servlet UML分析

在这里插入图片描述

Servlet生命周期

●主要有三个方法
1.init方法
2.service方法
3.destroy方法

在这里插入图片描述

●初始化阶段

Servlet容器(比如:Tomcat) 加载Servlet, 加载完成后, Servlet容器会创建一个Servlet实例并调用init方法(创建的实例放入HashMap), init方法只会调用一次, Servlet容器在下面的几种情况下会装载Servlet:

在这里插入图片描述
1.Servlet容器(比如: Tomcat)启动时自动装载某些servlet, 实现这个需要在web.xml文件中添加
<load-on-startup>1</load-on-startup> 1表示装载的顺序
2.在Servlet容器启动后, 浏览器首次向Servlet发送请求
3.Servlet重新装载时(比如tomcat 进行redeployredeploy会销毁所有的Servlet实例】), 浏览器再向Servlet发送请求的第1

●处理浏览器请求阶段(service方法)
1.每收到一个http请求, 服务器就会产生一个新的线程处理[线程]
2. 创建一个用于封装HTTP请求消息的ServletRequest对象和一个代表HTTP响应消息的ServletResponse对象
3. 然后调用Servletservice()方法并将请求和响应对象, 作为参数传递进去


●终止阶段(destroy方法)(体现Servlet完整的生命周期)
web应用被终止, 或者Servlet容器终止运行, 或者Servlet类重新装载时, 会调用destroy()方法, 比如重启tomcat, 或者 redeploy web应用

GET和POST请求分发处理

●开发Servlet, 通常编写doGet, doPost方法, 来对表单的getpost请求进行分发处理

●代码演示
1.web路径下新建register.html

<body>
<h1>注册用户</h1>
<form action="http://localhost:8080/servlet3/helloServlet" method="post">u: <input type="text" name="username"/><br/><input type="submit" value="注册用户"/>
</form>
</body>

2.修改HelloServletservice方法完成分发请求

/*** 1.service方法处理浏览器的请求(包括get和post)* 2.当浏览器每次请求Servlet时, 就会调用一次service方法* 3.当tomcat调用该方法时, 会把http请求的数据封装成实现了ServletRequest接口的request对象* 4.通过servletRequest对象, 可以得到用户提交的数据* 5.servletResponse对象可以用于返回数据给tomcat->浏览器** @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/
@Override
public void service(ServletRequest servletRequest,ServletResponse servletResponse) throws ServletException, IOException {//如果count的值在不停地累积, 说明HelloServlet是单例的System.out.println("hi HelloServlet ~~count="+ ++count);//Tomcat每处理一次http请求, 就生成一个新的线程System.out.println("当前线程id=" + Thread.currentThread().getId());//思考->从servletRequest对象来获取请求方式//1.ServletRequest 没有得到提交方式的方法//2.ServletRequest 看看ServletRequest子接口有没有相关方法//3.老师小技巧: ctrl+alt+b 可以看到接口的子接口和实现子类//4.把servletRequest转成 HttpServletRequest引用//5.仍然是Java基础的OOPHttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String method = httpServletRequest.getMethod();System.out.println("method=" + method);//method=GET 大写的if ("GET".equals(method)) {doGet();//用doGet() 处理GET请求} else if ("POST".equals(method)) {doPost();//用doPost() 处理POST请求}
}/*** 用于响应get请求*/
public void doGet() {System.out.println("HelloServlet doGet()...");
}/*** 用于响应post请求*/
public void doPost() {System.out.println("HelloServlet doPost()...");
}

3.测试…

通过继承HttpServlet开发Servlet

HttpServlet介绍
在实际项目中, 都是使用继承 HttpServlet 类来开发 Servlet 程序, 更加方便

HttpServlet类图如下
在这里插入图片描述

Http介绍
1.通过继承HttpServlet开发一个HiServlet
2.当浏览器 访问 http://localhost:8080/web应用名/hiServlet时,后台输出hi HiServlet

●具体的开发步骤
1.编写一个类去继承 HttpServlet
2.根据业务需要重写doGetdoPost 方法
3.到 web.xml 中配置 Servlet程序

1.com.zzw.servlet包下新建HiServlet

public class HiServlet extends HttpServlet {//重写HttpServlet的doGet 和 doPost//alt + insert@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HiServlet doGet()...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HiServlet doPost()...");}
}

2.配置web.xml

<!--配置HiServlet--><servlet><servlet-name>HiServlet</servlet-name><servlet-class>com.zzw.servlet.HiServlet</servlet-class></servlet><servlet-mapping><servlet-name>HiServlet</servlet-name><url-pattern>/hiServlet</url-pattern></servlet-mapping>

IDEA配置Servlet

在WEB-INF目录下的lib文件夹下导入servlet-api.jar包并且Add As Library后右键才有新建Servlet的选项

在这里插入图片描述
在这里插入图片描述
会自动生成Servlet类和web.xml配置

public class OkServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//可以写自己的业务处理代码}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//可以写自己的业务处理代码}

web.xml自动生成以下半截代码, 这里需要手动配置url-pattern
在这里插入图片描述

Servlet注意事项和细节

  1. Servlet是一个供其它Java程序(Servlet)引擎调用的Java类, 不能独立运行
  2. 针对浏览器的多次Servlet请求, 通常情况下, 服务器只会创建一个Servlet实例对象, 也就是说Servlet实例对象一旦创建, 它就会驻留在内存中,存在于Tomcat维护的HashMap中, 为后续的其他请求而服务, 直至web容器退出/或者redeploy该web应用, servlet实例对象才会销毁, 从HashMap中移除
  3. 在Servlet的整个生命周期中,init方法只被调用一次, 而对每次请求都导致Servlet引擎调用一次servlet的service方法
  4. 对于每次访问请求, Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象, 然后将这两个对象作为参数传递给它调用的Servlet的service()方法, service方法再根据请求方式分别调用doGet()方法和doPost()方法
  5. 如果在<servlet>元素中配置了一个<load-on-startup>元素, 那么web应用程序在启动时, 就会装载并创建Servlet的实例对象, 以及调用Servlet实例对象的init()方法

Servlet注解方式

快速入门

省去了在web.xml配置的麻烦

方法外不能使用.var

/*** 显示方法之间的分割线 Editor->General->Appearance->Show method separators* 1.@WebServlet是一个注解* 2.@WebServlet的源码* 3.urlPatterns 对应web.xml中的 <url-Pattern></url-Pattern>*   {"/ok1", "/ok2"} 可以给OkServlet配置多个 urlPattern*   相当于这个@WebServlet(urlPatterns={"/ok1", "/ok2"}) 代替了web.xml的配置* 4.浏览器可以这样访问OkServlet: http://localhost:8080/servlet/ok1 或者 http://localhost:8080/servlet/ok2*/
@WebServlet(urlPatterns = {"/ok1", "/ok2"})
public class OkServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("annotation doGet method");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("annotation doPost method");}
}

@WebServlet注解源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented => 在javadoc工具生成记录
public @interface WebServlet {String name() default "";String[] value() default {};String[] urlPatterns() default {};int loadOnStartup() default -1;WebInitParam[] initParams() default {};boolean asyncSupported() default false;String smallIcon() default "";String largeIcon() default "";String description() default "";String displayName() default "";
}

注解详解

在这里插入图片描述

说明: 注解是对包进行扫描, 如果发现某个类是用@WebServlet, 就说明该类是Servlet, 然后读取urlPatterns, 看看请求的资源和urlPatterns的参数是否一致

●模拟代码

/*** @author 赵志伟* @version 1.0* 模拟Tomcat是如何通过注解@WebServlet(urlPatterns={"/ok1", "/ok2"})来装载一个Servlet的*/
@SuppressWarnings({"all"})
public class TestAnnotationServlet {private static final HashMap<String, HttpServlet> hm = new HashMap<>();public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {//1.首先要得到扫描的包 路径 IO, 进而得到类的全路径String path = "com.zzw.servlet.annotation.OkServlet";//2.得到OkServlet的Class对象Class<?> aClass = Class.forName(path);//3.根据class对象得到对应的注解WebServlet annotation = aClass.getAnnotation(WebServlet.class);String[] urlPatterns = annotation.urlPatterns();for (String urlPattern : urlPatterns) {System.out.println("urlPattern=" + urlPattern);}//如果匹配url, 如果是第一次, tomcat就会创建一个OkServlet实例, 放入到HashMap中Object instance = aClass.newInstance();System.out.println("instance=" + instance);//OkServlet实例hm.put("OkServlet", (HttpServlet) instance);System.out.println(hm);}
}

initParams

@WebServlet(urlPatterns = {"/ok1", "/ok2"}, initParams = {@WebInitParam(name = "zzw", value = "123"), @WebInitParam(name = "xx", value = "yy")})
public class OkServlet extends HttpServlet {}

等同于

<servlet><servlet-name>OkServlet</servlet-name><servlet-class>com.zzw.servlet.OkServlet</servlet-class><init-param><param-name>zzw</param-name><param-value>123</param-value></init-param><init-param><param-name>xx</param-name><param-value>yy</param-value></init-param></servlet>

Servlet urlPattern 配置

精准匹配

@WebServlet(urlPatterns = {"/ok1/aa/bb", "/ok2"}

目录匹配

@WebServlet(urlPatterns = {"/ok1/*", "/ok2"})
http://localhost:8888/servlet/ok1
http://localhost:8888/servlet/ok1/aa
http://localhost:8888/servlet/ok1/aa/bb/cc

扩展名匹配

@WebServlet(urlPatterns = {"*.action", "/ok2"}
http://localhost:8888/servlet/zzw.action
http://localhost:8888/servlet/zzw.521.action

3.2不能带斜杠

@WebServlet(urlPatterns = {"/*.action", "/ok2"},这样是错误的

任意匹配

@WebServlet(urlPatterns = {"/", "/ok2"}
或者
@WebServlet(urlPatterns = {"/*", "/ok2"}
http://localhost:8888/servlet/aa/bb/cc
http://localhost:8888/servlet/zzw.521.action

注解注意事项

shortcuts: ctrl+alt+⬅ 回到上次访问的窗口

1.当Servlet配置了"/", 会覆盖掉tomcat的DefaultServlet, 当其它的的url-pattern都匹配不上时, 就会走这个默认的Servlet, 这样可以拦截到其它请求中的静态资源

这个默认的Servlet是处理静态资源的, 一旦拦截, 静态资源则不能处理

 <!-- The default servlet for all web applications, that serves static     --><!-- resources.  It processes all requests that are not mapped to other   --><!-- servlets with servlet mappings (defined either here or in your own   --><!-- web.xml file). --><servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

2.当Servlet配置了"/*", 表示可以匹配任意访问路径

3.建议不要使用/ 和 /*, 尽量使用精准匹配

4.优先级遵守: 精确路径 > 目录路径 > 扩展名路径 > /* > / > DefaultServlet(访问静态资源)

访问:http://localhost:8888/servlet/ok1/aa
@WebServlet(urlPatterns = {"/ok1/aa"}//优先
@WebServlet(urlPatterns = {"/ok1/*"}

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

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

相关文章

【Python/Pytorch - 网络模型】-- 高阶SVD算法

文章目录 文章目录 00 写在前面01 基于Python版本的高阶SVD算代码02 HOSVD 的步骤 00 写在前面 高阶奇异值分解&#xff08;Higher-Order SVD&#xff0c;HOSVD&#xff09;是一种将传统的奇异值分解&#xff08;SVD&#xff09;扩展到高阶张量的方法。它能够将一个高阶张量分…

【AI编译器】triton学习:矩阵乘优化

Matrix Multiplication 主要内容&#xff1a; 块级矩阵乘法 多维指针算术 重新编排程序以提升L2缓存命 自动性能调整 Motivations 矩阵乘法是当今高性能计算系统的一个关键组件&#xff0c;在大多数情况下被用于构建硬件。由于该操作特别复杂&#xff0c;因此通常由软件提…

mprpc框架的配置文件加载

目录 1.回顾测试 2.mprpc框架的配置文件加载 2.1 mprpcconfig.h 2.2 完善mprpcapplication.h 2.3 完善mprpcapplication.cc 2.4 mprpcconfig.cc 2.5 test.conf 2.6 测试运行 ​3.扩展问题 1.回顾测试 我们先把之前的项目代码工程编译好&#xff0c;然后进入bin里面&am…

GPOPS-II教程(2): 可复用火箭再入大气层最优轨迹规划问题

问题描述 考虑一类可复用火箭再入大气层最优轨迹规划问题&#xff0c;其动力学方程为 { r ˙ v sin ⁡ γ , θ ˙ v cos ⁡ γ sin ⁡ ψ r cos ⁡ ϕ , ϕ ˙ v cos ⁡ γ cos ⁡ ψ r , v ˙ − F d m − F g sin ⁡ γ , γ ˙ F l cos ⁡ σ m v − ( F g v − v r …

高考填报志愿(选专业),为什么要尊重孩子的选择 ?

没有哪一位父母不希望自己的孩子能够考到理想的大学&#xff0c;甚至光宗耀祖&#xff0c;然而一些比较专制的家长&#xff0c;往往在孩子填报志愿的时候表现出很强的控制欲&#xff0c;希望将自己的意愿强加于孩子身上&#xff0c;并没有考虑到他们的兴趣是什么。其实&#xf…

【IM 服务】新用户为什么刚注册就能收到通知?为什么能接收注册前的通知?

功能说明&#xff1a; 默认新注册的用户可以接收到注册前 7 天内的广播消息。您可以从控制台免费基础功能页面关闭该服务。 开通方式&#xff1a; 访问开发者后台 免费基础功能 1页面&#xff0c;确认应用名称与环境&#xff08;开发 /生产 &#xff09;正确无误后&#xff0c…

springboot+vue+mybatis门窗管理系统+PPT+论文+讲解+售后

如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于仓库信息管理方…

Java-day01--基础知识

1、计算机基础知识&#xff1a; 计算机主要是由硬件和软件组成&#xff0c;软件指的是特定顺序的计算机指令&#xff0c;硬件主要可以看成是系统软件和应用软件等。 目前java主流分成三种&#xff1a;javase&#xff08;标准版&#xff09;、javame&#xff08;小型版&#x…

优化了自制的浏览器主页的全屏功能

第一次修改 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>全屏功能</title><style>…

数据分析必备:一步步教你如何用matplotlib做数据可视化(12)

1、Matplotlib 3D线框图 线框图采用值网格并将其投影到指定的三维表面上&#xff0c;并且可以使得到的三维形式非常容易可视化。plot_wireframe()函数用于此目的 import matplotlib.pyplot as plt import numpy as np import math import seaborn as sns plt.rcParams[font.s…

数据结构-----【链表:基础】

链表基础 1、链表的理论基础 1&#xff09;基础&#xff1a; 链表&#xff1a;通过指针串联在一起的线性结构&#xff0c;每个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个指针…

在flask中加载mnist模型,并预测图片

一、在tensorflow中新建及保存模型 启动Jupyter Notebook 新建Notebook 生成 mnist_model.h5 模型的代码 import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import…

机器人控制系列教程之运动规划(2)

简介 在笛卡尔坐标空间中轨迹规划时&#xff0c;首先用位置矢量和旋转矩阵表示所有相应的机器人节点&#xff0c;其次在所有路径段插值计算相对的位置矢量和旋转矩阵&#xff0c;依次得出笛卡尔坐标空间中的轨迹序列通过求解运动学逆问题得到相应关节位置参数。 优点&#xf…

评测|贪吃小猫疯狂长肉,让它停不下嘴的希喂、鲜朗、帕特真实调研

我发现很多铲屎官存在一个误区&#xff0c;认为“进口即是高贵”&#xff0c;过度信赖进口产品。一见到进口宠物粮就冲动购买&#xff0c;甚至对国产品牌持贬低态度&#xff0c;贴上“质量不佳”、“不符合标准”等标签。 为了更深入地了解这一现象&#xff0c;我深入研究了主食…

【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

问题 这个问题出现在使用URP管线时&#xff0c;我试图用Shader实现血条的制作&#xff0c;并用RenderTexture将视图渲染到RawImage上。 但是渲染结果出现了问题&#xff1a; 可以看到液体边缘的渲染出现了错误&#xff0c;原因不明 在StackFlow上查找后找到了类似的问题&…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17&#xff1a;下载地址&#xff0c;在下图中红色框部分进行下载 2、双击安装&#xff0c;基本都是下一步直到完成。 3、设置系统环境变量&#xff1a;参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行&#xff1a;j…

第三十篇——等价性:如何从等价信息里找答案?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 知道了等价性的逻辑&#xff0c;通过等价性去衡量事物&#xff0c;像是给…

Linux配置网卡详细教程

这个网卡配置然后头痛了两天&#xff0c;看了很多篇关于这方面的文章&#xff0c;但是都没让我成功&#xff0c;可惜工亏不负有心人&#xff0c;然后终于学会了下面此方法 实现完成的效果&#xff1a; 永久修改网卡IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEther…

node带参数命令

不带参数命令示例&#xff1a; node /www/wwwroot/server 带参数命令示例&#xff1a; node /www/wwwroot/server arg1 arg2 arg3 在启动页进行参数处理&#xff1a; // 获取启动参数(除去前2个默认参数&#xff0c;示例&#xff1a;node /www/wwwroot/server arg1 arg2 …

西门子840dsl机床仿真软件配置opcua说明

需要的安装包如下&#xff0c;可在百度网盘中下载 主软件包&#xff1a;sinutrain-v4.7-ed4&#xff08;也可在官网中下载最新版本&#xff09; 用户文件&#xff1a;UserDataBase 授权sinutrain&#xff1a;Sim_EKB_Install_2021_06_22 链接&#xff1a;https://pan.baidu.c…