Java高手速成 | JSP MVC模式项目案例

news2024/9/25 3:19:01

MVC模式的核心思想是有效地组合“视图”“模型”和“控制器”。在JSP 技术中,视图是一个或多个JSP页面,其作用主要是向控制器提交必要的数据和为模型提供数据显示;模型是一个或多个Javabean对象,用于存储数据;控制器是一个或多个servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到Javabean中,然后servlet使用重定向方式请求视图中的某个JSP页面更新显示。

在MVC模式中,模型也可以由控制器负责创建和初始化。

01、等差、等比级数和

1.项目目的

掌握MVC模式三部分的设计。使用request bean存储数据,使用servlet处理数据,并将有关数据存储到request bean,使用JSP页面显示requestbean数据。

2.项目要求

(1)编写一个创建bean的类,该类可以储存等差(等比)级数的首项、公差(公比)和等差(等比)级数的和。

(2)编写一个JSP页面inputNumber.jsp。该页面提供form表单,该form表单提供用户输入等差(等比)级数的首和公差(公比)。用户单击名字“求等差级数和”的提交键或名字“求等比级数和”的提交键请求名字是computSum的servlet。

(3)编写创建servlet的Servlet类,该类创建的servlet根据有户提交的数据,负责创建一个request bean。如果用户单击的是“求等差级数和”(“求等比级数和”)的提交键,servlet计算等差(等比)级数的和,并将结果存储到request bean,并请求inputNumber.jsp页面显示等差(等比)级数的和。

(4)在Tomcat服务器的webapps目录下新建一个名字是ch7_priatice_one的Web服务目录。把JSP页面保存到ch7_priatice_one中。在ch7_priatice_one下建立子目录WEB-INF(字母大写),然后在WEB-INF下再建立子目录classes,将创建servlet和bean的类的Java源文件按着包名保存在classes的相应子目录中。

(5)向ch7_priatice_one\WEB\INF\下的部署文件web.xml添加servlet和servlet-mapping标记,部署servlet的名字和访问servlet的url-pattern。

(6)用浏览器访问JSP页面inputNumber.jsp。

3.参考代码

代码仅供参考,参考代码运行效果如图7.5。

1.   bean(模型)

用命令行进入save\data的父目录classes,编译Series_Bean.java:

classes>javac  save\data\Series_Bean.java

Series_Bean.java:

 


package save.data;
public classSeries_Bean{
   double firstItem;  //级数首项。
   double var;        //公差或公比。
   int number;        //求和项数。
   double sum;       //求和结果。
   String name="";   //级数类别。
   public void setFirstItem(double a){
      firstItem=a;
   }
   public double getFirstItem(){
      return firstItem;
   }
   public void setVar(double b){
      var=b;
   }
   public double getVar(){
      return var;
   }
   public void setNumber(int n){
      number=n;
   }
   public double getNumber(){
      return number;
   }
   public void setSum(double s){
      sum=s;
   }
   public double getSum(){
      return sum;
   }
   public void setName(String na){
      name=na;
   }
   public String getName(){
     return name;
   }
}

2.  JSP页面(视图)

inputNumber.jsp提供form表单,该form表单提供用户输入等差(等比)级数的首和公差(公比)。用户单击名字“求等差级数和”的提交键或名字“求等比级数和”的提交键请求名字是computSum的servlet。

inputNumber.jsp(效果如图7.5所示)


<%@ pagecontentType="text/html" %>
<%@ page pageEncoding= "utf-8" %>
<jsp:useBeanid="seriesData" class ="save.data.Series_Bean"
scope="request"/>
<style>
   #tom{
      font-family:宋体;font-size:28;color:blue
   }
</style>
<HTML><bodybgcolor=#FFBBFF>
<formaction="computeSum" id = tom method="post" >
等差级数求和:
  <br>输入首项:<input type=text id=tom name="firstItem" size=4>
      输入公差(公比):<inputtype=text id=tom name="var" size=4>
      求和项数:<input type=text id=tom name="number" size=4>
  <input type=submit name ="submit" id = tom value="提交(求等差级数和)"/>
  <input type=submit name = "submit"id = tom value="提交(求等比级数和)">
</form>
<table border=1 id =tom>
   <tr>
    <th> 级数的首项</th>
    <th> <jsp:getPropertyname="seriesData" property="name"/></th>
    <th> 所求项数</th>
    <th> 求和结果</th>
   </tr>
    <td><jsp:getPropertyname="seriesData" property="firstItem"/></td>
    <td><jsp:getPropertyname="seriesData" property="var"/></td>
    <td><jsp:getPropertyname="seriesData" property="number"/></td>
    <td><jsp:getPropertyname="seriesData" property="sum"/></td>
   </tr>
</table>
</body></HTML>

 

3.   servlet(控制器)

ComputeSum_Servlet负责创建名字是computeSum的servlet。名字为computeSum的servlet控制器负责计算等差或等比级数的和,并将结果存放在id是seriesData的request bean中,然后用重定向的方法,请求inputNumber.jsp显示request bean中的数据。

用命令行进入handle\data的父目录classes,编译ComputeSum_Servlet.java:

classes>javac-cp .;servlet-api.jar  handle/data/ComputeSum_Servlet.java

事先将Tomcat安装目录lib子目录中的servlet-api.jar文件复制(不要剪贴)到\ch7_practice_one\WEB-INF\classes中。

注意“.;”和“servlet-api.jar”之间不要有空格,“.;”的作用是保证Java源文件能使用import语句引入当前classes目录中其他自定义包中的类,比如save.data包中的bean类。

ComputeSum_Servlet.java:


package handle.data;
import save.data.*;
import java.io.*;
import javax.servlet.*;
importjavax.servlet.http.*;
public classComputeSum_Servlet extends HttpServlet{
   public void init(ServletConfig config)throws ServletException{
      super.init(config);
   }
   public void service(HttpServletRequestrequest,HttpServletResponse response) throws ServletException,IOException{
      Series_Bean seriesData = newSeries_Bean(); //创建bean。
      request.setCharacterEncoding("utf-8");
      request.setAttribute("seriesData",seriesData);//request bean。
      String mess=request.getParameter("submit");
      String firstItem =request.getParameter("firstItem");//首项。
      String var =request.getParameter("var");//或公比公差。
      String number =request.getParameter("number");//求和项数。
      if(firstItem.length()==0||var.length()==0||number.length() == 0){
           response.sendRedirect("inputNumber.jsp");
            return;
      }
      if(mess.contains("等差")) {
         compute(firstItem,var,number,seriesData,0);
      }
      else if(mess.contains("等比")) {
        compute(firstItem,var,number,seriesData,1);
      }
      //请求inputNumber.jsp显示seriesData中的数据:
      RequestDispatcher dispatcher=
      request.getRequestDispatcher("inputNumber.jsp");
      dispatcher.forward(request,response);
    }

    void compute(String firstItem,Stringvar,String number,Series_Bean seriesData,inttype){
      double a=Double.parseDouble(firstItem);
      double d=Double.parseDouble(var);
      int n=Integer.parseInt(number);
      seriesData.setFirstItem(a); //将数据存储在数据模型seriesData中。
      seriesData.setVar(d);          
      seriesData.setNumber(n);
      double sum=0,item=a;
      int i=1;
      if(type == 0) {
         seriesData.setName("等差级数的公差");
         while(i<=n){       //计算等差数列的和。
            sum=sum+item;
            i++;
            item=item+d; 
         }
         seriesData.setSum(sum);
      }
      else if(type == 1){
         seriesData.setName("等比级数的公比");
         while(i<=n){       //计算等比数列的和。
            sum=sum+item;
            i++;
            item=item*d; 
         }
         seriesData.setSum(sum);
      }
   }
}

4.web.xml(部署文件)

向ch7_practice_one\WEB\INF\下的web.xml添加如下的servlet和servlet-mapping标记,部署的servlet的名字是computeSum,访问servlet的url-pattern是/ computeSum。

web.xml:


<?xmlversion="1.0" encoding="utf-8"?>
<web-app>
    <!-- 以下是web.xml文件新添加的内容 -->
    <servlet>
        <servlet-name>computeSum</servlet-name>
        <servlet-class>handle.data.ComputeSum_Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>computeSum</servlet-name>
        <url-pattern>/computeSum</url-pattern>
    </servlet-mapping>
</web-app>

02、点餐

1.项目目的

掌握MVC模式三部分的设计。使用session bean存储数据,使用servlet处理数据,并将有关数据存储到session bean,使用JSP页面显示sessionbean数据。

2.项目要求

(1)编写一个创建bean的类,该类可以储存餐单相关的数据,例如菜名,价格等信息。

(2)编写一个JSP页面inputMenu.jsp。该页面提供1个form表单,该表单提供用户输入餐单信息。用户单击名字“添加到餐单”的提交键请求名字是addMenu的servlet。

(3)编写创建servlet的Servlet类,该类创建的servlet根据有户提交的餐单数据,解析出餐单的消费总额,并将餐单中消费分项按价格排序,并将这些信息存放到session bean中。servlet请求showMenu.jsp页面显示session bean中的数据。

(4)编写showMenu.jsp页面,该页面显示或删除session bean中的数据(显示餐单,同时也可以删除餐单中的某道菜)。

(5)在Tomcat服务器的webapps目录下(比如,D:\apache-tomcat-9.0.26\webapps)新建名字是ch7_priatice_two的Web服务目录。把JSP页面保存到ch7_priatice_two中。在ch7_priatice_two下建立子目录WEB-INF(字母大写),然后在WEB-INF下再建立子目录classes,将创建servlet和bean的类的Java源文件按着包名保存在classes的相应子目录中。

(6)向ch7_priatice_two\WEB\INF\下的部署文件web.xml添加servlet和servlet-mapping标记,部署servlet的名字和访问servlet的url-pattern。

(7)用浏览器访问JSP页面inputMenu.jsp。

3.参考代码

代码仅供参考,参考代码运行效果如图7.6。

1.     bean(模型)

创建session bean需要使用MenuBean类, Food类是MenuBean类需要的一个类。

用命令行进入save\data的父目录classes,编译Food.java和MenuBean.java:

classes>javac  save\data\Food.java

classes>javac  save\data\MenuBean.java

Food.java


package save.data;
public class Foodimplements Comparable<Food>{
    String foodName ;   //食物名称。
    double price;       //价格。
    public void setFoodName(String name){
        foodName = name;
    }

    public String getFoodName(){
        return foodName;
    }

    public void setPrice(double d){
        price = d;
    }

    public double getPrice(){
        return price;
    }

    public int compareTo(Food food){ //Food对象按价格比较大小。
        return(int)(food.getPrice()*1000-price*1000);
    }
}

 MenuBean.java


package save.data;
importjava.util.ArrayList;
importjava.util.Collections;
public class MenuBean {
    String time ; //点餐时间。
    String totalPrice; //餐单总额。
    ArrayList<Food> foodList;//存放Food对象的ArrayList。
    public MenuBean(){
        foodList = new ArrayList<Food>();
    }

    public void addFood(Food food){
        foodList.add(food);
        Collections.sort(foodList);//排序foodList。
    }

    public void removeFood(int index){
        if(index>=0){
           foodList.remove(index);
           Collections.sort(foodList);//排序foodList。
        }
    }

    public String getFoodName(int index) {//返回某个Food的名字。
        returnfoodList.get(index).getFoodName();
    }

    public double getPrice(int index) {   //返回某个Food的价格。
        return foodList.get(index).getPrice();
    }

    public int size() {
        return foodList.size();
    }

    public void setTime(String time){
        this.time = time; 
    }

    public String getTime(){
        return time; 
    }

    public String getTotalPrice(){
        double sum = 0;
        for(Food food:foodList){
          sum += food.getPrice();
        }

        totalPrice =String.format("%.2f",sum);//保留2位小数。
        return totalPrice;
    }
}

 

2.  JSP页面(视图)

inputMenu.jsp提供form表单,该form表单提供用户输入某道菜的名字和价格。用户单击名字“添加到餐单”的提交键请求名字是addMenu的servlet。showMenu.jsp负责显示session bean中的数据,以及删除sessionbean中的某个数据(即删除某道菜)。

inputMenu.jsp(效果如图7.6(a)所示)


<%@ pagecontentType="text/html" %>
<%@ page pageEncoding= "utf-8" %>
<jsp:useBeanid="menu" class ="save.data.MenuBean"scope="session"/>
<style>
   #textStyle{
      font-family:宋体;font-size:36;color:blue
   }
</style>
<HTML><bodybgcolor=#ffccff>
<formaction="addMenu" id= textStyle method=post>
输入餐单(每次输入一个消费项目):<br>
名称:<inputtype=text name='foodName' id =textStyle value ='剁椒鱼头' size = 8 />
价格:<inputtype=text name='price' id =textStyle value ='26.9' size = 8 />
<br><inputtype=submit id=textStyle value="添加到餐单">
</form>
</body></HTML>

 showMenu.jsp(效果如图7.6(b)所示)


<%@ pagecontentType="text/html" %>
<%@ page pageEncoding= "utf-8" %>
<jsp:useBeanid="menu" class ="save.data.MenuBean"scope="session"/>
<style>
   #tom{
      font-family:宋体;font-size:26;color:blue
   }
</style>

<HTML><bodybgcolor=pink>
<table border=1>
   <tr><th id=tom>序号</th><th id=tom>食物名称</th><th id=tom>价格</th>
   <% request.setCharacterEncoding("utf-8");
    String index = request.getParameter("删除");
    if(index!=null){
      menu.removeFood(Integer.parseInt(index));
    }

    for(int i=0;i<menu.size();i++){
        out.print("<tr>");
        out.print("<tdid=tom>"+(i+1)+"</td>");
        out.print("<tdid=tom>"+menu.getFoodName(i)+"</td>");
        out.print("<tdid=tom>"+menu.getPrice(i)+"</td>");
        out.print("<td ><formaction ="+"showMenu.jsp"+" method=post>");
        out.print("<input type = hiddenname = 删除 value ="+i+" />");
        out.print("<input type =submit  value = 删除该食物 />");
        out.print("</form></td>");
        out.print("</tr>");
    }
%> </table>

<p id = tom>
餐单总额(共有<%=menu.size()%>道食物): 
<jsp:getPropertyname="menu" property="totalPrice" /><br>
点餐时间:
<jsp:getProperty  name="menu"property="time" /></p>
<a id =tomhref="inputMenu.jsp">继续点餐</a>
</body></HTML>

3.     servlet(控制器)

HandleMenu_Servlet负责创建名字是addMenu的servlet。名字为addMenu的servlet控制器负责创建id是menu的session bean,并将Food对象存储到session bean中,然后将用户重定向到showMenu.jsp页面查看餐单。

用命令行进入handle\data的父目录classes,编译HandleMenu_Servlet.java:

classes>javac-cp .;servlet-api.jar  handle/data/HandleMenu_Servlet.java

事先将Tomcat安装目录lib子目录中的servlet-api.jar文件复制(不要剪贴)到\ch7_practice_one\WEB-INF\classes中。

注意“.;”和“servlet-api.jar”之间不要有空格,“.;”的作用是保证Java源文件能使用import语句引入当前classes目录中其他自定义包中的类,比如save.data包中的bean类。

HandleMenu_Servlet.java

package handle.data;
import save.data.Food;
importsave.data.MenuBean;
import java.util.*;
import java.io.*;
importjava.time.LocalTime;
import javax.servlet.*;
importjavax.servlet.http.*;
public classHandleMenu_Servlet extends HttpServlet{
   public void init(ServletConfig config)throws ServletException{
       super.init(config);
   }
   public void service(HttpServletRequestrequest,
   HttpServletResponse response)throws ServletException,IOException{
       request.setCharacterEncoding("utf-8");
       MenuBean menu  = null; //餐单。
       HttpSessionsession=request.getSession(true);
       menu = (MenuBean)session.getAttribute("menu");
       if(menu == null ){//menu不存在就创建menu。
           menu = new MenuBean();
          session.setAttribute("menu",menu);//sesion bean。
       }

       String foodName =request.getParameter("foodName");//食物名称。
       String price =request.getParameter("price");
       Food food = new Food();
       if(foodName.length()==0||price.length()==0){
            response.sendRedirect("inputMenu.jsp");
            return;
       }
       food.setFoodName(foodName);
       food.setPrice(Double.parseDouble(price));
       LocalTime dateTime =LocalTime.now(); 
       String str = dateTime.toString();
       String time=str.substring(0,str.lastIndexOf("."));//不要纳秒。
       menu.setTime(time);
       menu.addFood(food);//添加一道食物。
       response.sendRedirect("showMenu.jsp");//显示餐单。
   }

4.web.xml(部署文件)

向ch7_practice_two\WEB\INF\下的web.xml添加如下的servlet和servlet-mapping标记,部署的servlet的名字是addMenu,访问servlet的url-pattern是/ addMenu。

web.xml


<?xmlversion="1.0" encoding="utf-8"?>
<web-app>
    <!-- 以下是web.xml文件新添加的内容 -->
    <servlet>
        <servlet-name>addMenu</servlet-name>
        <servlet-class>handle.data.HandleMenu_Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>addMenu</servlet-name>
        <url-pattern>/addMenu</url-pattern>
    </servlet-mapping>
</web-app>

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

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

相关文章

LifeCycle源码解析

简介 Lifecycle是Jetpack中的一个生命周期组件&#xff0c;可用来感知其他组件&#xff08;如Activity&#xff0c;Fragment&#xff09;生命周期的变化&#xff0c;从而可以保证我们的一些代码操作控制在合理的生命周期内&#xff1b; 如何使用&#xff1f; 添加以下依赖 …

什么是接口、接口测试、接口自动化测试、你分的清楚吗?

目录 前言&#xff1a; 服务端接口测试介绍 什么是服务端&#xff1f; 什么是接口&#xff1f; 什么是接口测试&#xff1f; 为什么要做接口测试&#xff1f; 如何做接口测试&#xff1f; 接口测试自动化介绍 为什么是接口测试自动化&#xff1f; 为什么要做接口测试自…

什么是动态域名解析?域名怎么解析到内网IP

首先说说什么是域名解析&#xff0c;域名解析就是把域名解析成一个ip地址&#xff0c;我们大多数人都喜欢记忆域名&#xff0c;但是机器只认识IP地址&#xff0c;把这个IP地址对应相关域名&#xff0c;这就叫域名解析。动态域名与动态域名解析是相互关联的关系&#xff0c;通过…

项目图床选择

总结&#xff1a; 非隐私图片&#xff1a;使用Github、七牛云(http)、SM.MS图床、路过图床。隐私图片&#xff1a;使用阿里云OSS、七牛云(https)&#xff08;绑定的域名不能丢&#xff09;。 测试环境&#xff08;日常使用&#xff09;自行选择&#xff1b; 生产环境选择阿里云…

03_PyTorch 模型训练[Dataset 类读取数据集]

PyTorch 读取图片&#xff0c;主要是通过 Dataset 类&#xff0c;所以先简单了解一下 Dataset 类。Dataset 类作为所有的 datasets 的基类存在&#xff0c;所有的 datasets 都需要继承它&#xff0c;类似于 C中的虚基 类。这里重点看 getitem 函数&#xff0c;getitem 接收一个…

微信小程序使用canvas生成分享海报功能复盘

前言 近期需要开发一个微信小程序生成海报分享的功能。在h5一般都会直接采用 html2canvas 或者 dom2image 之类的库直接处理。但是由于小程序不具备传统意义的dom元素&#xff0c;所以也没有办法采用此类工具。 所以就只能一笔一笔的用 canvas 画出来了&#xff0c;下面对实现…

(文末有彩蛋,不看白不看)兑现一下之前答应读者的事

大家过年好呀&#xff01;&#xff08;我&#xff09;明天就要开工上班啦&#xff01;在假期的最后一天踢了会球&#xff0c;简单吃点东西&#xff0c;晚上来兑现答应一位读者的事情。开整&#xff01; 前情提要 这篇文章缘起于「开发者」技术交流群中一位读者遇到的问题&…

《树上的男爵》坚持解释不清的理想是疏离,还是自由?

《树上的男爵》坚持解释不清的理想是疏离&#xff0c;还是自由&#xff1f; 伊塔洛卡尔维诺&#xff0c;意大利作家&#xff0c;后现代主义派。 卡尔维诺为“寓言式奇幻文学的大师”。&#xff08;评论家赫伯特密特甘评&#xff09; 吴正仪 译 许多年来&#xff0c;我为一些连我…

【3】SpringBoot基础

//从事微服务开发工作 SpringBoot提供一种快速使用Spring的方式 1、自动化 2、设置多个starter配置依赖比Maven直接管理更便捷 3、内置服务器 总结&#xff1a;自动配置&#xff0c;起步依赖&#xff0c;辅助功能 2.6.11版本的说明书 Spring Boot Reference Documentation…

第九层(8):STL之set/multiset

文章目录前情回顾set/multiset概念区别构造函数赋值函数大小操作函数交换函数插入函数删除函数查找函数统计函数为什么set不可以插入重复数据pair数组pair数组创建怎么样去改变set容器的排序规则下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一…

智公网:一级消防师要掌握的知识点!

一、建筑物的耐火等级 1、建筑物的耐火等级分为四级&#xff0c;一、二、三、四级。 2、节点缝隙或金属承重构件节点的外露部位&#xff0c;应做防火保护层。 3、民用建筑的耐火等级、层数、长度和面积&#xff0c;一二级最大防火分区的长度250m。多层建筑最大允许建筑面积2…

【gcc/g++/gdb/cmake】命令

文章目录参考资料一、gcc/g/make1 gcc和g的区别2 gcc/g与make区别3 make与cmake区别二、开发环境搭建1 编译器&#xff0c;调试器&#xff0c;CMake安装2 GCC编译器2.1 编译过程2.1.1 -E 预处理-Pre-Processing .i文件2.1.2 -S 编译-Compiling .s文件2.1.3 -C 汇编-Assembling …

软件工程(二)——需求工程、统一建模语言UML

目录 一、需求获取 二、需求分析 1.结构化需求分析 2.面向对象分析方法OOA 三、UML 41视图 四、UML 图 (1)用例图 (2)类图、对象图 (3)顺序图 &#xff08;4&#xff09;活动图 &#xff08;5&#xff09;状态图 &#xff08;6&#xff09;通信图 软件需求指用户对系…

【科研】ET-BERT代码分析

0. 数据集 论文使用的TLS1.3数据集是从 2021 年 3 月到 2021 年 7 月在中国科技网 (CSTNET) 上收集的。 如果要使用自己的数据集的话&#xff0c;需要检查数据格式是否与datasets/cstnet-tls1.3/目录下一致&#xff0c;并且在data_process/目录下指定数据集路径。 用于微调的…

Pomotroid 使用指南:一款高颜值 PC 端番茄时钟

文章首发于个人公众号&#xff1a;「阿拉平平」 番茄工作法作为一套高效易行的时间管理方案&#xff0c;是由意大利人弗朗西斯科西里洛于 1992 年创立的。作者发明的初衷源自于自身严重的拖延症&#xff0c;于是他找来一个厨房用的番茄计时器&#xff0c;调到 10 分钟&#xff…

游戏SDK(二)框架设计

前言 根据上一篇游戏SDK&#xff08;一&#xff09; 客户端整体架构&#xff0c;介绍了游戏SDK 及 游戏SDK的需求分析。根据需求分析&#xff0c;对游戏SDK的设计分为3大块&#xff1a; 客户端&#xff1a;接口统一&#xff0c;做好逻辑转发和处理。具体渠道具体实现&#xf…

【高并发】- 生产级系统搭建 - 4

前言 关于高并发系统中&#xff0c;当前比较热门的还是属于“秒杀”系统&#xff0c;前面章节在整理了“秒杀”系统的相关设计概念后&#xff0c;本章节&#xff0c;来讲解扣减库存相关的业务逻辑。 1 库存的那些事 一般电商网站中&#xff0c;购买流程一般都是这样的&#xff…

多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch

目录&#xff1a;一、Callable接口Callable的用法小结二、ReentrantLockReentrantLock 的用法ReentrantLock 和 synchronized 的区别&#xff1f;为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock&#xff1f;三、信号量 Semaphore如何理解信号量&#xff…

Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

本节内容使用用例基类自定义TestSuitecollect-only的实现testlist的实现用例tags的实现rerun-fails的实现命令行参数的使用更简单的用例编写使用用例基类因为每条用例都需要从excel中读取数据&#xff0c;解析数据&#xff0c;发送请求&#xff0c;断言响应结果&#xff0c;我们…

阿里云ECS学习笔记1

ECS&#xff1a;弹性计算服务。CPU可以热插、内存可变大变小、硬盘可以增加~ 注册&#xff1a; 在企业中&#xff0c;应该以企业的身份进行注册&#xff0c;而不是以个人身份进行注册。 手机号&#xff1a;行政部门专门管理注册的账号资源的&#xff0c;而不使用个人或者老板…