Servlet详解

1、Servlet

1、Java支持动态网页的技术:直接编写Java,利用CGI的方式与WebServer沟通

2、servlet在MVC中相当于控制层的作用。

Servlet的作用:

  • CGI:通用网关接口:是从WEB容器中取得数据(内置对象)的能力
  • 创建表单bean、收集表单数据
  • 分析请求,分发请求
  • 根据业务层返回的转向信息,转到视图组件

3、JavaServlet架构

在这里插入图片描述

tomcat启动,创建servlet对象,request和response方法注入到servlet(doGet方法、doPost方法),通过request创建表单bean、收集表单数据,通过response返回到浏览器

4、Servlet的生命周期
在这里插入图片描述

  • create ( 加载、实例化):加载Servlet类,为对象分配空间;配置了loadOnStartup,tomcat一启动就创建;没有配置,在请求servlet的时候创建
  • initilalize(初始化):servlet一创建,就会执行init方法(有参的或者无参的),如果都没有就执行父类的init方法,什么都不做
  • 请求处理:服务阶段。根据请求调用doGet或者doPost方法处理请求
  • 销毁

2、基本语法

1、基本语法

package cn.zte.pxb.servlet ;
//IOException属于java.io包下
import java.io.* ;
// ServletException属于javax.servlet包下
import javax.servlet.* ;
// HttpServletRequest、HttpServletResponse存放在javax.servlet.http包下
// HttpServlet属于javax.servlet.http包下
import javax.servlet.http.* ;
public class SimpleServlet extends HttpServlet
{
	// 表示处理get请求 地址栏、表单。
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{   System.out.println("doGet方法被调用");
		//依赖查找
	    PrintWriter out = resp.getWriter() ;
		out.println("<HTML>") ;
		out.println("<HEAD>") ;
		out.println("<TITLE>THE FIRST SERVLET</TITLE>") ;
		out.println("</HEAD>") ;
		out.println("<BODY>") ;
		out.println("<H1>Hello World!!!</H1>") ;
		out.println("</BODY>") ;
		out.println("</HTML>") ;
		out.close() ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{System.out.println("doPost方法被调用");
		this.doGet(req,resp) ;
	}
} 

  • 也是组件,和JavaBean一样,需要包声明package cn.zte.pxb.servlet ;
  • 导入三个包
//IOException属于java.io包下
import java.io.* ;
// ServletException属于javax.servlet包下
import javax.servlet.* ;
// HttpServletRequest、HttpServletResponse存放在javax.servlet.http包下
// HttpServlet属于javax.servlet.http包下
import javax.servlet.http.* ;
  • 继承HttpServlet类
  • 复写doGet或doPost方法

2、部署Servlet

  • 因为要编译SimpleServlet需要JavaEE的包(javax.servlet.http),而我们使用javac编译是没有这个包的。
  • JavaEE用到的jar包在tomcat下有。将tomcat/lib中的关于servlet的包servlet-api.jar复制一份到jdk/jre/lib/ext下,这里是jdk放添加的扩展jar包的目录 。这样之后,我们就可以用javac来编译Servlet了
  • 将SimpleServlet放到web-inf下的class目录下,进行打包编译-- javac -d . SimpleServle.java

3、配置servlet ,在web.xml中进行配置


  <servlet>
	<servlet-name>simple</servlet-name>
	<servlet-class>cn.zte.pxb.servlet.SimpleServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
	<servlet-name>simple</servlet-name>
	<url-pattern>/demo</url-pattern>
  </servlet-mapping>

servlet-name : Servlet的名称

servlet-class : 字节码文件所在的包名(加上自己的文件名)

load-on-startup : 设置是否tomcat一启动就加载该servlet。设置数值是加载这个Servlet的优先级

servlet-mapping :设置请求这个Servlet的映射地址

请求地址:http://localhost:8080/test/demo

  • tomcat一启动,加载web.xml文件,因为配置了loadOnStartup,所以一启动就会加载对应的字节码文件 ,即创建这个SimpleServlet对象(会进行初始化调用init())。
  • 通过请求地址,先在test对应的虚拟目录下找demo文件,没有找到,接着在WEB-INF下查找,根据映射地址找到的是SimpleServlet这个对象
  • 因为是get请求,调用doGet方法,request和response立马注入到doGet方法中。(Servlet容器内部实现,从源码可以看到,HttpServletRequest的实现类中,会调用getMethod()方法,从而判断出get方法或post方法,再分发到doGet方法或者doPost方法去处理
  • 执行完后返回到浏览器显示结果

3、配置Servlet

1、完整的Servlet


 package cn.zte.pxb.servlet ;
 import java.io.* ;
 import javax.servlet.* ;
 import javax.servlet.http.* ;

 public class LifeCycleServlet extends HttpServlet
 {
	// 初始化
	public void init(ServletConfig config) throws ServletException
	{
		System.out.println("** Servlet 初始化 ...") ;
	}
	// 表示处理get请求
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		System.out.println("** Servlet doGet处理 ...") ;
	}
	// 处理post请求
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{   this.doGet(req,resp);
		//System.out.println("** Servlet doPost处理 ...") ;
	}
	// 销毁
	public void destroy()
	{
		System.out.println("** Servlet 销毁 ...") ;
	}
 } 

  • 复写了四个方法,分别是

public void init() :servlet对象一创建,就会执行init()方法,ServletConfig封装着配置文件里的初始参数信息会注入到init方法里头。可以通过config获取初始参数。至于是不是tomcat一启动就创建Servlet,要看有没有加上loadOnStartup配置。

public void doGet() : 处理get请求的方法

public void doPost() : 处理post请求的方法

public void destory() : 销毁Servlet。关闭服务器后,Servlet销毁

2、使用配置文件:在web.xml配置Servelt


  <servlet>
	<servlet-name>life</servlet-name>
	<servlet-class>cn.zte.pxb.servlet.LifeCycleServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
	<servlet-name>life</servlet-name>
	<url-pattern>/life</url-pattern>
  </servlet-mapping>

3、servlet的注解开发 :使用注解来配置Servlet

@WebServlet(urlPatterns = "/hello",loadOnStartup = 1)
public class HelloServlet extends HttpServlet{
  public void init(ServletConfig config)throws ServletException{
    
  }
  public void doGet(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletException{
    
  }
  public void doPost(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletException{
    
  }
  public void destory(){
    
  }
}

@WebServlet(urlPatterns = “/hello”,loadOnStartup = 1)

配置映射地址,是否在启动就创建servlet

4、关于初始化Servlet


package cn.zte.pxb.servlet ;

import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class LifeCycleServlet1 extends HttpServlet
{
	// 初始化
	 public void init() throws ServletException
	{
		System.out.println("** Servlet使用 init() 初始化 ...") ;
	}
	 
	// 初始化
	 
	public void init(ServletConfig config) throws ServletException
	{
		System.out.println("** Servlet 使用 init(ServletConfig config)初始化 ...") ;
	} 
	 
	 
}

/*
  <servlet>
	<servlet-name>life</servlet-name>
	<servlet-class>cn.zte.pxb.servlet.LifeCycleServlet1</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>

   
*/
  • 这个Servlet只进行初始化,不处理任何请求(没有doGet和doPost,只有init)
  • 不需要配置servlet-mapping,因为不需要处理请求;但是一定要配置loadOnStartup,tomcat一启动就创建初始化Servlet,调用init方法。如果不配置loadOnStartup,而它又不处理请求,那永远都得不到初始化。
  • 一个有参的初始化方法和一个无参的初始化方法。初始化tomcat会调用有参的初始化方法。只写一个就只调用写的那个。

5、配置初始参数

在web.xml中配置初始化参数,在tomcat启动时创建Servlet对象,调用init方法,ServlteConfig封装初始化参数注入init方法。


 package cn.mldn.lxh.servlet ;
 
 import java.io.* ;
 import javax.servlet.* ;
 import javax.servlet.http.* ;

 public class InitParameterServlet extends HttpServlet
 {       private String usename=null;
         private String password=null;
		 //private int  count=0;

	// 初始化
	// 要取得初始化参数,必须使用以下初始化方法
	public void init(ServletConfig config) throws ServletException
	{    
		// config对象中有取得初始化参数的方法:getInitParameter("参数名称")
        this.usename= config.getInitParameter("usename") ;
		this.password = config.getInitParameter("password") ;
		String dd = config.getInitParameter("DBDRIVER") ;
        //this.count=2;
		System.out.println("usename => "+this.usename) ;
		System.out.println("password => "+this.password) ;
		System.out.println("DBDRIVER => "+dd) ;
	}

	// 表示处理get请求
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		  System.out.println("** Servlet doGet处理 ...") ;
	      System.out.println("usename="+this.usename) ;
	      System.out.println("password="+this.password) ;
         //System.out.println("password="+this.count-1) ;
	}
	// 处理post请求
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		// System.out.println("** Servlet doPost处理 ...") ;
	}
	// 销毁
	public void destroy()
	{
		// System.out.println("** Servlet 销毁 ...") ;
	}
}

配置xml


  <servlet>
	<servlet-name>param</servlet-name>
	<servlet-class>cn.mldn.lxh.servlet.InitParameterServlet</servlet-class>
	<load-on-startup>0</load-on-startup>	
	<init-param>
		<param-name>usename</param-name>
		<param-value>scott</param-value>
	</init-param>
	<init-param>
		<param-name>password</param-name>
		<param-value>tiger</param-value>
	</init-param>
	<init-param>
		<param-name>DBDRIVER</param-name>
		<param-value>oracle.jdbc.driver.OracleDriver</param-value>
	</init-param>
  </servlet>

  <servlet-mapping>
	<servlet-name>param</servlet-name>
	<url-pattern>/init</url-pattern>
  </servlet-mapping>
  • tomcat一启动,扫描web.xml,将配置文件里的参数封装在ServletConfig中。< init-param>
  • 创建Servlet对象,调用init方法初始化,封装了初始参数的ServletConfig会自动注入到init()方法中,可以通过config获取到初始化参数
  • 从config中拿到封装的初始化参数。

this.usename= config.getInitParameter(“usename”) ;

  • 用实例全局变量接收初始化参数,可以提供给这个类的所有方法使用

什么是线程安全?

线程安全问题一般都是由全局变量或者静态变量引起。当两个线程要对同一变量操作,涉及写操作时,就会产生线程问题。

  • init方法是tomcat一启动就会调用,只有这一个线程调用,这一定是线程安全的

  • 而doGet和doPost是多个线程可以同时访问的,所以在doGet、doPost里只是对初始化参数进行读操作 ,而没有写操作,不存在竞争,所以也是线程安全的。

  • 所以说Servlet是保证线程安全的

  • 如果在doGet中要进行参数的写操作(修改),这样就存在多线程竞争一个全局变量的问题,会出现线程不安全的问题。可以将这个方法提取出来,然后加上synchronized,保证线程安全。

  • 在web.xml中配置初始化参数风险很大,一旦标签或者写错就会导致整个tomcat启动报错 。可以将初始化参数存放在properties里,在init方法中,通过输入流将properties里的初始化参数读出来,保存在全局变量里,然后给其他方法使用,如下


 package cn.mldn.lxh.servlet ;
 import java.io.* ;
 import javax.servlet.* ;
 import javax.servlet.http.* ;
 import java.util.Properties;

 public class InitParameterServlet extends HttpServlet
 {       private String username=null;
         private String password=null;


	// 初始化
	// 要取得初始化参数,必须使用以下初始化方法
	public void init()
	{    
		try {
			Properties properties = new Properties();
			FileInputStream fileInputStream = new FileInputStream(new File("D:/testweb/WEB-INF/classes/dao.properties"));
			properties.load(fileInputStream);
			fileInputStream.close();
			this.username = properties.getProperty("username");
			this.password = properties.getProperty("password");
			String dd = properties.getProperty("dbDriver") ;
			System.out.println("username => "+this.username) ;
			System.out.println("password => "+this.password) ;
			System.out.println("dbDriver => "+dd) ;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 表示处理get请求
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		
		  System.out.println("** Servlet doGet处理 ...") ;
	      System.out.println("username="+this.username) ;
	      System.out.println("password="+this.password) ;
	}
	// 处理post请求
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		// System.out.println("** Servlet doPost处理 ...") ;
	}
	// 销毁
	public void destroy()
	{
		// System.out.println("** Servlet 销毁 ...") ;
	}
}

4、通过表单访问Servlet

1、通过表单访问Servlet

htm


<form action="formServlet1" method="post">
用户名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>

servlet


package cn.cx.servlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class FormServlet extends HttpServlet
{
	private ServletConfig config = null ;
	public void init(ServletConfig config) throws ServletException 
	{
		this.config= config ;
	}
	// 表示处理get请求
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		  System.out.println("** Servlet doGet处理提交参数 ...") ;
		req.getRequestDispatcher("demo.jsp").forward(req,resp);
		//this.doPost(req,resp) ;
	}
	// 处理post请求
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		//从request中获取参数。request已经自动注入
		String name = req.getParameter("uname") ;
		// 取得一个session对象
		HttpSession session = req.getSession() ;
		session.setAttribute("sname",name) ;
		// 取得application对象-没有config
		// ServletContext app = this.getServletContext() ;
		// 取得application对象-有config
		//ServletContext app = this.config.getServletContext() ;
		// 取得application对象,不通过config拿,直接拿
		ServletContext app=req.getSession().getServletContext();
		app.setAttribute("addr","www.zte.cn") ;
		System.out.println("** Servlet doPost处理提交参数 ...") ;
		System.out.println("name = "+name) ;
		// 重
		 //resp.sendRedirect("demo.jsp") ;
	req.getRequestDispatcher("demo.jsp").forward(req,resp);
	}
};

web.xml配置Servlet


  <servlet>
	<servlet-name>form</servlet-name>
	<servlet-class>cn.cx.servlet.FormServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
	<servlet-name>form</servlet-name>
	<url-pattern>/02_servlet/formServlet1</url-pattern>
  </servlet-mapping>
  
  
   
  • tomcat启动,加载FormServlet对象,进行初始化。

< form action=“formServlet1” method=“post”>

  • 进入表单页面,提交方式为post,虽然这里请求只写了formSerclet1,但真正的请求地址其实是/02_servlet/formServlet1,/02_servlet是访问表单的路径 ,servlet会自动将其当做转发到视图组件的默认地址。
  • req.getRequestDispatcher(“demo.jsp”).forward(req,resp);所以这里跳转到的请求是 /02_servlet/demo.jsp
  • 从哪访问,Servlet就会去哪找视图组件

2、模拟不同用通过相同的表单访问同一个Servlet

模拟三个不同用户访问同一个表单提交信息到同一个servlet。----只需要在web.xml中配置不同的url-pattern。servlet会在对应的url-pattern的路径(也是请求地址)里找到要提交的地址。

<servlet-mapping>
	<servlet-name>form</servlet-name>
	<url-pattern>/a/formServlet1</url-pattern>
  </servlet-mapping> 

  <servlet-mapping>
	<servlet-name>form</servlet-name>
	<url-pattern>/b/formServlet1</url-pattern>
  </servlet-mapping>

 <servlet-mapping>
	<servlet-name>form</servlet-name>
	<url-pattern>/c/formServlet1</url-pattern>
  </servlet-mapping>
  • 提交的都是“formServlet”,但是发送的请求带着他们访问的路径的。转发到的demo.jsp是三个地址的demo.jsp,由他们配置的映射路径决定

  • req.getRequestDispatcher(“demo.jsp”).forward(req,resp); 这里只写了相对路径demo.jsp,servlet会自动到当前请求路径的目录下去寻找demo.jsp

如:对于a用户,访问a页面

a页面的from.htm,form action="formServlet1“ ,提交请求的地址实际是 /a/formServlet1 ,servlet根据请求地址,在servlt-mapping中找到对应的servlet-name,然后执行这个类的doPost方法(是post提交),转发到/a/demo.jsp

在url-pattern里一定要配置完整的路径名

3、优化

三个用户要配置三个servelt-mapping ,那么如果一百个用户呢?这样配置量太大了,我们可以采用通配符来统一管理

 <servlet-mapping>
	<servlet-name>form</servlet-name>
	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

只要来自后缀为.do的请求都会映射到formServlet1

将a,b,c的表单提交地址改为

<form action="formServlet1.do" method="post">
用户名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>

这样就不用为访问同一个表单同一个servlet去配置多个mapping!

如:

**a表单,提交,请求地址实际为 /a/formServlet.1do ,servlet在web.xml中找到匹配的url-pattern: *.do ,然后映射到formServle1,调用doPost方法,转发到 /a/demo.jsp **

c表单提交没加.do后缀,提交,请求地址为 /b/formServlet1 ,servlet在web.xml没有找到匹配的url-pattern,找不到对应路径,所以返回不了要找的结果,报异常

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码

基于ThinkPHP 5.1&#xff08;LTS版本&#xff09;开发的WMS进销存系统源码 管理员账号密码&#xff1a;admin 一、项目简介 这个系统是一个基于ThinkPHP框架的WMS进销存系统。 二、实现功能 控制台 – 权限管理&#xff08;用户管理、角色管理、节点管理&#xff09; – 订…

Java课题笔记~Maven基础知识

一、什么是Maven&#xff1f; Maven是专门用于管理和构建Java项目的工具。 它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提供了一套依赖管理机制 …

认识 springboot 之 它的配置文件 -2

前言 本篇了解springboot中配置的作用&#xff0c;介绍配置文件的种类&#xff0c;介绍简单使用配置文件&#xff0c;简单的小技巧如何设置注释&#xff0c;开启热部署等等&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&…

查找-多路查找详解篇

多路查找树 多路查找树&#xff08;Multway Search Tree&#xff09;是一种高级的树形数据结构&#xff0c;它 允许每个节点有多个子节点&#xff08;通常大于等于2&#xff09;。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树&#xff08;2-3 Tree&#x…

Vite+Vue3 开发UI组件库并发布到npm

一直对开源UI组件库比较感兴趣&#xff0c;摸索着开发了一套&#xff0c;虽然还只是开始&#xff0c;但是从搭建到发布这套流程基本弄明白了&#xff0c;现在分享给大家&#xff0c;希望对同样感兴趣的同学有所帮助。 目前我的这套名为hasaki-ui的组件库仅有两个组件&#xff0…

FitBot-一款先进的以健康为中心的聊天机器人

在健康意识高涨&#xff0c;追求均衡生活方式成为普遍追求的时代&#xff0c;营养问题无疑是核心支柱。然而&#xff0c;饮食计划的复杂性和大量的营养数据往往成为我们实现这种平衡的障碍。例如糖尿病患者&#xff0c;他们需要持续和准确的营养指导来有效管理血糖水平。如果能…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

Spring事务创建与使用

目录 前言Spring中事务的实现声明式事务Transactional 作⽤范围Transactional 参数说明对于事务不回滚的解决方案 前言 在数据库中我们提到了 事务, 事务的定义为, 将一系列操作封装成一个整体去调用 , 要么一起成功, 要么一起失败 Spring中事务的实现 在Spring中事务的操作…

电动汽车市场的减速,正在让小鹏汽车付出代价

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;由于价格压力上升、竞争加剧和需求减弱&#xff0c;小鹏汽车的交付量出现了明显下滑&#xff0c;6月份的交付量已经同比下降了43%。 &#xff08;2&#xff09;小鹏汽车对2023年…

服务调用---------Ribbon和Feign

目录​​​​​​​ 1、Ribbon 1.1 Ribbon简介 1.2 Ribbon负载均衡 负载均衡原理 负载均衡策略 Ribbon和Nginx的区别 1.3 服务调用和Ribbon负载均衡实现 2、Feign&openFeign 3、Feign支持的配置 日志功能 连接池 feign-api远程包 1、Ribbon 1.1 Ribbon简介 Ribb…

【Vue3+Ts+Vite】配置滚动条样式

一、先看效果 二、直接上代码 <template><div class"main-container"><h1 v-for"index in 50" :key"index">这是home页面</h1></div> </template> <style lang"scss" scoped> .main-conta…

【AI底层逻辑】——篇章5(下):机器学习算法之聚类降维时间序列

续上&#xff1a; 目录 4、聚类 5、降维 6、时间序列 三、无完美算法 往期精彩&#xff1a; 4、聚类 聚类即把相似的东西归在一起&#xff0c;与分类不同的是&#xff0c;聚类要处理的是没有标签的数据集&#xff0c;它根据样本数据的分布特性自动进行归类。 人在认知是…

Flutter 最佳实践和编码准则

Flutter 最佳实践和编码准则 视频 前言 最佳实践是一套既定的准则&#xff0c;可以提高代码质量、可读性和可靠性。它们确保遵循行业标准&#xff0c;鼓励一致性&#xff0c;并促进开发人员之间的合作。通过遵循最佳实践&#xff0c;代码变得更容易理解、修改和调试&#xff…

基于光子实验的指数级加速的量子同态加密理论

前言 量子计算机不仅有望在某些重要任务上超越经典计算机&#xff0c;而且还能保护计算的隐私。例如&#xff0c;盲量子计算协议支持安全委托量子计算&#xff0c;其中客户端可以保护其数据和算法的隐私&#xff0c;不受分配来运行计算的量子服务器的影响。然而&#xff0c;这…

​《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(9)-Fiddler如何设置捕获Https会话​

1.简介 由于近几年来各大网站越来越注重安全性都改成了https协议&#xff0c;不像前十几年前直接是http协议直接裸奔在互联网。还有的小伙伴或者童鞋们按照上一篇宏哥的配置都配置好了&#xff0c;想大展身手抓一下百度的包&#xff0c;结果一试傻眼了&#xff0c;竟然毛都没有…

Selenium+Java环境搭建(测试系列6)

目录 前言&#xff1a; 1.浏览器 1.1下载Chrome浏览器 1.2查看Chrome浏览器版本 1.3下载Chrome浏览器的驱动 2.配置系统环境变量path 3.验证是否成功 4.出现的问题 结束语&#xff1a; 前言&#xff1a; 这节中小编给大家讲解一下有关于Selenium Java环境的搭建&…

数据结构: 线性表(顺序表实现)

文章目录 1. 线性表的定义2. 线性表的顺序表示:顺序表2.1 概念及结构2.2 接口实现2.2.1 顺序表初始化 (SeqListInit)2.2.2 顺序表尾插 (SeqListPushBack)2.2.3 顺序表打印 (SeqListPrint)2.2.6 顺序表销毁 (SeqListDestroy)2.2.5 顺序表尾删 (SeqListPopBack)2.2.6 顺序表头插 …

晋级榜单揭晓!华秋第九届硬创大赛-华南分赛区路演成功举办

7月21日&#xff0c;第十五届深创赛福田预选赛区暨华秋第九届硬创大赛华南分赛区决赛路演活动在深圳华强科创广场成功举办。活动由深圳华秋电子有限公司&#xff08;以下简称 华秋 &#xff09;、深圳市福田区新一代信息技术产业链党委、深圳新一代产业园、微纳研究院、华强科创…

【嵌入式学习笔记】嵌入式入门1——GPIO

1.什么是GPIO General Purpose Input Output&#xff0c;即通用输入输出端口&#xff0c;简称GPIO&#xff0c;作用是负责采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出。 2.STM32 GPIO简介 2.1.GPIO特点 不同型号&#xff0c;IO口数量可能不一样&#x…

中小学分班查询系统0成本制作方法公布了,人人可用

传统的学生分班查询平台通常需要进行专业的技术开发&#xff0c;以实现学生查询和查看分班信息的功能。这个过程涉及到软件开发、数据库设计、系统集成等多个环节&#xff0c;需要有一支专业的技术团队来完成。 然而&#xff0c;这样的技术开发和维护过程需要耗费大量的经济成…