当前位置: 首页 > news >正文

ServletContext介绍

文章目录

  • 1、ServletContext对象介绍
    • 1_方法介绍
    • 2_用例分析
  • 2、ServletContainerInitializer
    • 1_整体结构
    • 2_工作原理
    • 3_使用案例
  • 3、Spring案例源码分析
    • 1_注册DispatcherServlet
    • 2_注册配置类
    • 3_SpringServletContainerInitializer
  • 4_总结


ServletContext 表示上下文对象,属于接口,代表整个 Web 项目,可以使用定义的方法与 S e r v l e t Servlet Servlet容器进行通信。例如,获取文件的MIME类型、分发请求或写入日志文件。

能够共享数据的对象:

  1. request:只能在一次请求一次响应中进行数据的共享 ===》请求转发
  2. session:只能在一次会话过程中,可以有多次请求和响应
  3. ServletContext:只要项目存在就可以共享数据,多次会话,多次请求和响应都可以共享数据:操作整个项目的配置文件

范围大小ServletContext > session > request


1、ServletContext对象介绍


t o m c a t tomcat tomcat 服务器启动的时候,会为每个 Web 项目创建一个唯一的 S e r v l e t C o n t e x t ServletContext ServletContext 对象,该对象代表当前整个 Web 应用项目。

该对象不仅封装了当前 Web 应用的所有信息,而且实现了多个 s e r v l e t servlet servlet 的数据共享。

S e r v l e t C o n t e x t ServletContext ServletContext 中可以存放共享数据, S e r v l e t C o n t e x t ServletContext ServletContext 对象是真正的一个全局对象,凡是 Web 容器中的 S e r v l e t Servlet Servlet 都可以访问。

在每个项目中可以有多个 S e r v l e t Servlet Servlet 程序,每个 S e r v l e t Servlet Servlet 程序都是独立的。当前这个项目的配置信息,必须使用描述这个项目的 S e r v l e t C o n t e x t ServletContext ServletContext 对象获取。


1_方法介绍

在这里插入图片描述

方法名描述
setAttribute(String name, Object object) S e r v l e t C o n t e x t ServletContext ServletContext中存数据
getAttribute(String name) S e r v l e t C o n t e x t ServletContext ServletContext中取数据
removeAttribute(name) S e r v l e t C o n t e x t ServletContext ServletContext中移除数据
String getRealPath(String path)返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)
getMimeType(fileName)获取服务器中文件类型.txt text/plain .html text/html
getResourceAsStream(String path)获取某个资源的输入流
getRequestDispatcher(String path)返回一个 RequestDispatcher 对象,
可以使用它将请求转发到指定资源,或者在响应中包含资源。

S e r v l e t C o n t e x t ServletContext ServletContext 对象: t o m c a t tomcat tomcat为每一个 Web 项目单独创建的一个上下文(知上知下贯穿全文)对象。有如下功能:

  1. 可以在多个 s e r v l e t servlet servlet 之间共享数据

    • 存放:setAttribute()

    • 获得:getAttribute()

    • 删除:removeAttribute()

  2. 可以获得当前 Web 项目中的指定资源(文件)

    String path = getRealPath( String string);
    
  3. 将请求从一个 s e r v l e t servlet servlet 转发到服务器上的另一个资源。

    RequestDispatcher requestDispatcher = getRequestDispatcher("/1.jpg");
    requestDispatcher.forward(req,res);
    
  4. 将指定资源的内容包含到当前的响应中。

    requestDispatcher.include(req,res);
    
  5. 读取 Web 应用中的资源文件

    InputStream resourceStream = context.getResourceAsStream("/WEB-INF/config.properties");
    

S e r v l e t C o n t e x t ServletContext ServletContext 还提供了如下方法动态注册 S e r v l e t Servlet Servlet F i l t e r Filter Filter L i s t e n e r Listener Listener以及及初始化参数信息:

方法名描述
addServlet(String servletName, Servlet servlet)动态注册 S e r v l e t Servlet Servlet
addFilter(String filterName, Filter filter)动态注册 F i l t e r Filter Filter
addListener(String className)动态注册 L i s t e n e r Listener Listener
setInitParameter(String name, String value)Web 应用设置初始化参数。

2_用例分析

需求1:如何获取上下文 S e r v l e t C o n t e x t ServletContext ServletContext 对象。

  • 使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();
  • 通过实现 ServletContextListener 来获取(详见监听器博文)。

代码如下:

/*获取上下文ServletContext对象:使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();
*/
ServletContext servletContext = getServletContext();

需求2:如何获取服务器中每个文件的路径 ?例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。

@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = getServletContext();//如何获取服务器中每个文件的路径。// 例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。String realPath = servletContext.getRealPath("/1.jpg");/*输出结果:realPath = 	E:\WorkAndClass\maven_war_pro\src\main\webapp\1.jpg说明:我们的项目在发布的时候会被打成一个war包,这个war包下的class文件会被放在tomcat下被运行。所以这里获取的真实路径是这个war包下的1.jpg所在的路径。*/System.out.println("realPath = " + realPath);}
}

需求3:获取当前项目下的1.jpg在服务器中的文件类型。

/*需求3:获取当前项目下的1.jpg在服务器中的文件类型。getMimeType("1.jpg");这里书写获取文件类型的文件名和后缀名即可
*/
String mimeType = servletContext.getMimeType("1.jpg");
System.out.println("mimeType = " + mimeType);//mimeType = image/jpeg

需求4:请求转发,将发往ServletContextDemoServlet的请求转发到MyServlet中。

RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/MyServlet");
requestDispatcher.forward(request, response);

注意:对于方法 getMimeType("1.jpg");这里书写获取文件类型的文件名和后缀名即可


2、ServletContainerInitializer


S e r v l e t 3.0 Servlet 3.0 Servlet3.0 规范中,ServletContainerInitializer 接口被引入,用于替代传统的 web.xml 配置方式,允许开发者在 S e r v l e t Servlet Servlet 容器启动时动态地进行 S e r v l e t Servlet Servlet F i l t e r Filter Filter L i s t e n e r Listener Listener 的注册与初始化配置。

这种通过编程来实现应用初始化过程的方式具有很大的灵活性,尤其是在现代基于注解和 Java 配置的 Web 应用中,减少了对 web.xml 配置文件的依赖,提供了更强的动态配置能力。


1_整体结构

该接口只有一个方法:

public interface ServletContainerInitializer {public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}
  • Set<Class<?>> c:此参数表示与当前 Web 应用相关联的所有类。

    通常,这些类会通过类路径扫描来识别。

    开发者可以利用这个参数进行自定义的初始化逻辑,比如扫描特定的注解。

  • ServletContext ctx:这是 S e r v l e t C o n t e x t ServletContext ServletContext 对象,不再重复介绍。


2_工作原理

ServletContainerInitializer 接口通过反射机制(SPI机制)在 Web 容器启动时进行实例化。

Web 容器(如 T o m c a t Tomcat Tomcat)启动时,它会扫描所有部署的应用程序,查找是否有 META-INF/services/javax.servlet.ServletContainerInitializer 文件,该文件中会包含一个实现类的全限定名。

如果这个文件存在,Web 容器启动时会加载其中列出的所有 ServletContainerInitializer 实现类,并调用它们的 onStartup() 方法来初始化 Web 应用。

onStartup() 方法中,可以通过 S e r v l e t C o n t e x t ServletContext ServletContext 来进行 S e r v l e t Servlet Servlet F i l t e r Filter Filter L i s t e n e r Listener Listener 等组件的注册。


3_使用案例

1、编写 ServletContainerInitializer 实现类

package com.example.sh;import javax.servlet.*;
import java.util.EnumSet;
import java.util.Set;public class MyServletContainerInitializer implements ServletContainerInitializer {@Overridepublic void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {// 通过 ServletContext 注册 ServletServletRegistration.Dynamic myServlet = ctx.addServlet("myServlet", MyServlet.class);// 大于0时web容器启动时立即创建myServlet.setLoadOnStartup(1);// servlet映射路径myServlet.addMapping("/myServlet");// 通过 ServletContext 注册 FilterFilterRegistration.Dynamic myFilter = ctx.addFilter("myFilter", MyFilter.class);//REQUEST请求类型 除此之外还有 异步、转发等。。myFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");// 通过 ServletContext 注册 Listenerctx.addListener(MyListener.class);// 设置 Web 应用的初始化参数ctx.setInitParameter("appVersion", "1.0");}
}

2、注册 ServletContainerInitializer 实现类

META-INF/services/javax.servlet.ServletContainerInitializer 文件中添加如下内容:

com.example.sh.MyServletContainerInitializer

3、Spring案例源码分析


在一个典型的 S p r i n g Spring Spring MVC 应用中, S e r v l e t C o n t e x t ServletContext ServletContext 是一个重要的组件,它代表 Web 应用的上下文,提供了访问应用范围内资源和配置的能力。

DispatcherServlet S p r i n g Spring Spring MVC 的前端控制器,处理所有传入的 HTTP 请求,并负责将请求委派给适当的控制器方法。

在这个过程中, S e r v l e t C o n t e x t ServletContext ServletContext 作为 S p r i n g Spring Spring 容器的核心之一,起到了协调和管理作用。


1_注册DispatcherServlet

S e r v l e t Servlet Servlet容器配置类的继承类 AbstractDispatcherServletInitializer 中也有与ServletContainerInitializer中同名的方法onStartup():

public static final String DEFAULT_SERVLET_NAME = "dispatcher";
@Override
public void onStartup(ServletContext servletContext) throws ServletException {super.onStartup(servletContext);registerDispatcherServlet(servletContext);
}

onStartup()中调用了registerDispatcherServlet方法,从方法名就可以看出,这个方法是用于注册 DispatcherServlet 的方法:

在这里插入图片描述


2_注册配置类

ServletContainerInitializer 的实现类需要通过配置文件来获取类的全限定名进行注册,这在 S p r i n g Spring Spring MVC 中也是一样的。

首先,我们看一下AbstractDispatcherServletInitializer的继承结构:

在这里插入图片描述

发现顶级父类是 WebApplicationInitializer 接口:

package org.springframework.web;import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;public interface WebApplicationInitializer {void onStartup(ServletContext servletContext) throws ServletException;
}

在此接口相关的 jar 包中就可以发现对应的配置文件了,如下图(我的版本较高, S e r v l e t 5.0 Servlet5.0 Servlet5.0 以后把javax.servlet包名改成了jakarta.servlet,所以名称会略有差别):

在这里插入图片描述

文件内容如下:

org.springframework.web.SpringServletContainerInitializer

在这里插入图片描述


3_SpringServletContainerInitializer

经过上述分析,最终找到了一个以 S p r i n g Spring Spring 开头的配置类,那么这个类的作用是什么呢?先看结构:

@HandlesTypes(WebApplicationInitializer.class)//容器可以在启动时扫描并收集所有实现了 WebApplicationInitializer 接口的类
public class SpringServletContainerInitializer implements ServletContainerInitializer {@Overridepublic void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {//略}}

可以看到最重要的一点:它实现了 ServletContainerInitializer 接口,并将自己注册到了配置文件中去。

在这里插入图片描述

因此,在 Web 容器启动时,SpringServletContainerInitializer 会自动调用onStartup方法配置 S p r i n g Spring SpringWeb 环境。

在这里插入图片描述

除了配置 DispatcherServlet 外,它其实还会注册 ContextLoaderListener,用于加载 S p r i n g Spring Spring 的根应用上下文。


4_总结


S e r v l e t C o n t e x t ServletContext ServletContext 表示上下文对象,代表整个web项目, t o m c a t tomcat tomcat 一启动就会创建该接口对象,关闭 t o m c a t tomcat tomcat 就会消失

S e r v l e t C o n t e x t ServletContext ServletContext 属于对象,多次会话,多次请求限制,三个域对象范围:ServletContext > HttpSession > HttpServletRequest

S e r v l e t C o n t e x t ServletContext ServletContext 其他作用:

  • 获取文件真实路径:String getRealPath(String path) 参数 path 如果书写的是相对路径相对的是webapp

  • 获取文件的MIME类型:String getMimeType(String file) 参数 file 只书写文件名 + 后缀名即可,不会判断是否存在。

  • 获取请求分发对象:RequestDispatcher getRequestDispatcher(String path) 参数 path 书写的是资源路径。

  • 动态注册 Web 组件。


相关文章:

ServletContext介绍

文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象&#xff0c;…...

让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片

&#x1f308; 场景概述 java 小伙伴相信都使用 EasyExcel 以及 POI 库实现过 Excel 批量导入、导出功能&#xff0c;但只有部分人实现过 excel 导入带图片数据的场景。这个技术实现手段网上也有很多案例和demo&#xff0c;最常见的就是通过 XSSFPictureData 来实现。但是在 W…...

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…...

深度学习之卷积问题

1 卷积在图像中有什么直观作用 ​ 在卷积神经网络中&#xff0c;卷积常用来提取图像的特征&#xff0c;但不同层次的卷积操作提取到的特征类型是不相同的&#xff0c;特征类型粗分如表1所示。 ​ 表1 卷积提取的特征类型 卷积层次特征类型浅层卷积边缘特征中层卷积局部特征深…...

yum安装zabbix5.0升级php到74的办法

【背景】 公司时不时有扫描漏洞,之前发现了php漏洞,因开启防火墙,限定IP+端口,暂时躲过升级;现在,老话重提,开启了KPI考核,躲是躲不过去的了,升级吧 【难题】 服务器为centos7,因操作系统问题,只能安装zabbix5.0。当时图省力,官网的办法,都是yum安装,很是简便。…...

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…...

当AI遇上时尚:未来的衣橱会由机器人来打理吗?

内容概要 在当今这个快速发展的时代&#xff0c;人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战&#xff0c;许多人在挑选服饰时难以做出决策。然而&#xff0c;随着技术的进步&#xff0c;智能推荐和自…...

【初阶数据结构篇】二叉树OJ题

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…...

Windows系统中Oracle VM VirtualBox的安装

一.背景 公司安排了师带徒&#xff0c;环境搭建问题一直是初级程序员头疼的事情&#xff0c;我记录一下这些基础的内容&#xff0c;方便初学者。大部分开发者的机器还是windows系统&#xff0c;所以写了怎么安装。 二.版本信息及 操作系统&#xff1a;windows11 家庭版…...

go语言使用总结(持续更新)

整理后的内容如下&#xff1a; 1. 先了解函数签名&#xff0c;再了解传入参数以及调用 函数签名是函数的声明部分&#xff0c;包括函数名、参数列表和返回值列表。理解函数签名是理解函数行为的第一步&#xff0c;尤其是在了解参数类型、参数数量和返回值类型等方面。通过了解…...

如何在Android中自定义property

在Android中创建自定义的属性&#xff08;Android property&#xff09;通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤&#xff1a; 1. 定义属性 在Android中&#xff0c;属性是以“属性名称属性值”形式定义的键值对…...

机器学习5_支持向量机_原问题和对偶问题——MOOC

目录 原问题与对偶问题的定义 定义该原问题的对偶问题如下 在定义了函数 的基础上&#xff0c;对偶问题如下&#xff1a; 综合原问题和对偶问题的定义得到&#xff1a; 定理一 对偶差距&#xff08;Duality Gap&#xff09; 强对偶定理&#xff08;Strong Duality Theo…...

索引的细节

目录 什么是线性 搜索算法&#xff1f; 算法&#xff1a;二进制搜索算法 二进制搜索如何工作&#xff1f; 什么是二叉排序树&#xff1f; 构建二叉排序树 什么是AVL树&#xff1f; AVL树的性能分析 什么是线性 搜索算法&#xff1f; 线性搜索是一种非常简单的搜索算法。在…...

LeetCode 540.有序数组中的单一元素

思路一&#xff1a;hash&#xff0c;键存入元素&#xff0c;值存入次数&#xff0c;然后遍历&#xff0c;不是最优解 思路二&#xff1a;二分查找 假设数组为 [1, 1, 2, 2, 3, 4, 4]&#xff0c;其中唯一出现一次的元素是 3。在一个有序数组中&#xff0c;如果没有唯一的元素&…...

【图文】【DIY便签】如何自行编译OPENCV使用动态库

1 去官网下载安装包和源码 下面红色圈中的是源码&#xff0c;绿色圈中的是安装包&#xff1a; 2 配置工具链 安装过程不说了&#xff0c;教程到处都是。编译的话使用CMAKE&#xff0c;配置如下&#xff1a; 上面两个路径分别是&#xff1a; 源码目录编译生成的文件放置的位…...

WordPress文章自动提交Bing搜索引擎:PHP推送脚本教程

随着网站SEO优化的重要性日益增加,将新发布的内容快速提交到搜索引擎显得尤为重要。尤其对于Bing站长平台,自动化推送能让Bing尽快发现和索引我们网站的新内容。本文将详细介绍如何通过PHP脚本自动推送WordPress当天发布的文章至Bing站长平台,确保新文章被Bing及时收录。 前…...

C++题目分享

嗨嗨嗨&#xff0c;我又来更新这个系列了&#xff0c;很久没更新了。让我们看一看有那些有趣的题目&#xff1a; 题目一&#xff1a; 1.以单链表作为存储结构&#xff0c;实现线性表的就地逆置&#xff08;提示&#xff0c;就地逆置&#xff1a;在不使用额外的数据结构或空间…...

【Spring 框架】初识 Spring

文章目录 前言1. 什么是 Spring2. 什么是 Maven3. 第一个 SpringBoot 项目4. 项目讲解结语 前言 在前面我们一起学习了 JavaSE 的基础知识&#xff0c;随着学习的深入&#xff0c;我们也将逐步介绍 JavaEE 的内容&#xff0c;像 Spring 框架&#xff0c;Mybatis 等等。在本篇博…...

链表(Linkedlist)

序言 我们都了解链表是一种数据的存储结构&#xff0c;在Java使用中逻辑与c&#xff0c;c语言数据结构别无二致&#xff0c;但主要由于Java中不存在指针的说法&#xff0c;从而导致在实现过程中的代码不同&#xff0c;所以在学习的过程中我们无需过于担心&#xff0c;逻辑都是…...

信息安全工程师(79)网络安全测评概况

一、定义与目的 网络安全测评是指参照一定的标准规范要求&#xff0c;通过一系列的技术、管理方法&#xff0c;获取评估对象的网络安全状况信息&#xff0c;并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…...

保研考研机试攻略:python笔记(3)

&#x1f428;&#x1f428;&#x1f428;11sort 与 sorted 区别 sort 是应用在 list 上的方法&#xff0c;sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作&#xff0c; 无返回值&#xff0c;而内建函数 sorted 方法返回的…...

刘卫国MATLAB程序设计与应用课后答案PDF第三版

刘卫国《MATLAB程序设计与应用》&#xff08;第三版&#xff09;是对普通高等教育“十一五”国家级规划教材《MATLAB程序设计与应用》(第二版)的一次全面修订。全书总体保持第二版原有体系结构&#xff0c;但根据技术发展和应用的需要扩充了许多新内容。全书强调数学方法、算法…...

【鉴权】Web 会话管理:Cookie、Session 和 Token 深度对比

目录 引言一、Cookie二、Session三、Token (JWT)四、总结对比五、Token、Session 和 Cookie 的选择总结 引言 在现代 Web 开发中&#xff0c;Cookie、Session 和 Token 都是用于用户身份验证和状态管理的常见技术。每种技术有其特定的应用场景和优缺点&#xff0c;理解它们之间…...

ArkTS--应用状态

应用状态 应用状态相关的内容需要使用模拟器或真机调试&#xff0c;在API 11开始也支持preview 1.LocalStorage LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收参数可以在页面内共享数据 1.1 页面内共享数据 import {MyUser} from ../model/MyUser //用户对…...

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化&#xff1a; yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…...

java标准JavaBean类

1. public class test {//属性private String username;private String password;private String email;private String gender;private int age;//快捷键//altinsert//altFninsert//插件PTG1秒生成标准Javabean //插件ptg c//空参public test() {}//全部参数…...

MATLAB界面设计全攻略:从基础入门到高级应用

引言 MATLAB作为一种功能强大的科学计算软件&#xff0c;不仅可以进行各种复杂的数值计算&#xff0c;还可以通过其图形用户界面设计工具&#xff08;GUI&#xff09;为用户提供可视化操作界面。本教程旨在详细介绍MATLAB界面设计的全过程&#xff0c;为初学者提供从入门到精通…...

JavaScript API部分知识点

一、Dom获取&属性操作 &#xff08;一&#xff09;、 Web API 基本认知 1、变量声明 const 声明的值不能更改&#xff0c;而且const声明变量的时候需要里面进行初始化 但是对于引用数据类型&#xff0c;const声明的变量&#xff0c;里面存的不是 值&#xff0c;是 地址…...

钉钉调试微应用整理2

第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…...

C++初级入门(1)

第一部分 基础语法入门 一、基础 1、变量与常量 1、变量 变量存在的意义:方便管理内存空间 2、常量 用于记录程序中不可更改的数据 #define 常量名 常量值 const 数据类型 常量名常量值 ; 2、数据类型 1、整型 short 2字节 int 4字节 long Wi…...

优化网站的公司哪家好/如何去做网络营销

最为.net开发来说&#xff0c;微软的sql server数据库是比较熟悉&#xff0c;而至于MySQL,Oracle以前都有使用&#xff0c;但都是很熟悉&#xff0c;所以.....准备阶段mysql官网https://dev.mysql.com/下载mysql文件注&#xff1a;以上这种下载的是压缩包安装方式&#xff0c;安…...

南京重庆网站建设/新闻联播今日新闻

下面通过一个实例介绍Fragment的使用。实例中的Activity通过两个Fragment将屏幕分为两个部分&#xff0c;左侧为一个显示标题的Fragment&#xff0c;右侧为一个显示内容的Fragment。当点击左侧某个标题时&#xff0c;高亮该标题并在右侧显示该标题对应的内容。具体效果如下&…...

使用经典wordpress编辑器使用手册/合肥网站关键词排名

1.多线程 1.1 线程安全 如果有多个线程在同时运行&#xff0c;而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的&#xff0c;而且其他的变量的值也和预期的是一样的&#xff0c;就是线程安全的。线程安全问题都是由全局变量及静态变量引起的。若…...

上海建设企业网站/百度关键词排名优化

前后端并发问题 前端三秒请求一次接口 前端请求之后后端是调取了一个查询接口&#xff0c;一个存储接口 在多线程情况下&#xff0c; 多线程请求&#xff0c;那么就会同时生成多条数据&#xff0c;这些数据同时存储到了数据库&#xff0c;数据库里的数据创建时间是重复的 重…...

做网站用什么国外的空间比较好/网店怎么推广和宣传

需求&#xff1a; 算两日期时间之间相差的小时数、天数、分、秒 public static long getTimeDifference(Date nowDate,Date endDate) {//毫秒转换 To XXXlong convertToDay 1000 * 24 * 60 * 60;long convertToHour 1000 * 60 * 60;long convertToMin 1000 * 60;long conver…...

我在海贼开发app免费/赣州seo

模板方法模式很常用&#xff0c;其目的是在一个方法中定义一个算法骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法的某些步骤。在标准的模板方法模式实现中&#xff0c;主要是使用继承的方式&#xff0c;来…...