其实Servlet很简单,掌握了编程思想,解决问题才是硬道理

VSCode + ESP-IDF 项目搭建及配置 VSCode 搭建 ESP-IDF 开发环境 阅读详情

Servlet入门

今日目标

1. 创建servlet
    xml
    anno(注解)
    
2. servlet执行原理

3. servlet生命周期

4. servlet体系结构

一 Servlet概述

  • servlet= server+applet 运行在服务器端的java小程序。

  • Servlet是一个接口(规范),一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口

作用

接收请求,处理业务,响应结果

二 Servlet快速入门

目标:编写一个普通的java类,通过浏览器可以访问

#编写步骤
    1. 定义一个类,实现Servlet接口,重写所有的抽象方法(特别是service方法)
    2. 配置web.xml文件

2.1 代码编写

① 创建web项目

② 编写普通java类,实现servlet接口

重写抽象方法(service方法)

package com.itheima01.servlet;

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

/*
*  ctrl+i(implements) : 提示重写所有抽象方法
*   ctrl+ enter: 万能提示
* */
public class MyServlet implements Servlet {

    /*
    * servletRequest : 请求
    * servletResponse : 响应
    * */
    @Override
    public void service(ServletRequest servletRequest,
                        ServletResponse servletResponse) throws ServletException, IOException {

        System.out.println("接收到请求"); //控制台打印
        //网页上显示出来,不要写中文,会乱码
        servletResponse.getWriter().print("hello servlet");//响应给浏览器
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

③ 配置web.xml

配置servlet网络访问路径

<?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_3_1.xsd"
         version="3.1">

    <!--
        1. servlet和servlet-mapping标签里都有servlet-name子标签
            内部文本可以随意命名,但是必须一致
        2.  servlet-class标签: 写Servlet实现类的全限定名(包名+类名)
        3. url-pattern : 指定的是该Servlet的虚拟路径
    -->
    <servlet>
        <servlet-name>MyServlet01</servlet-name>
        <servlet-class>com.itheima01.servlet.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet01</servlet-name>
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>
</web-app>

④ 部署web项目

⑤ 启动测试

2.2 执行原理

三 Servlet相关API

3.1 生命周期方法

3.1.1 思想介绍

  • 生命周期:指的是一个对象从生(创建)到死(销毁)的一个过程

// 1. servlet对象创建时,调用此方法
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法 (每次访问都会调用一次)
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();

* 创建
    1)默认情况下
        用户第一次访问时,创建servlet,执行init方法
    2)修改创建时机
        <load-on-startup></load-onstartup>
            正数:5-N  【服务器启动时,创建】
                补充:Tomcat的web.xml里有1,4 所以推荐5-n 
            负数(默认值):-1 【用户第一次访问时,创建】
    
* 运行(提供服务)
        用户每次访问时,都执行service方法

* 销毁
        服务器正常关闭时,销毁servlet,执行destroy方法

3.1.2 代码演示

① LifeServlet

package com.itheima02.life;

import javax.servlet.*;
import java.io.IOException;
/*
    # 观察
    1. 第一次访问LifeServlet
        init
        service

    2. 再次访问LifeServlet
        service

    3. 关闭tomcat之前
        destroy

   # Servlet中的API
   1. 生命周期方法(lifecycle)
        对象从创建到销毁的整个过程

      1). init : 初始化
            a. 默认情况下,浏览器第一次访问时调用
            b. 适合执行初始化相关的操作: 加载初始配置
      2). service : 服务
            a. 浏览器每次访问,都会执行一次
            b. 处理业务
      3). destroy
            a. tomcat在关闭之前,先执行此方法
            b. 适合释放资源,保存数据

   2. 启动加载
       1). 问题:   init方法默认浏览器第一次访问才调用,
                        如果这时候执行加载数据,为时太晚, 用户体验不好

       2). 解决: tomcat一启动就加载这个Servlet,并且调用init方法
       3). 方式:
                在web.xml的servlet下配置
 */
public class LifeServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("LifeServlet init");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig");
        return null;
    }



    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo");
        return null;
    }


}

② 配置web.xml

<servlet>
        <servlet-name>LifeServlet</servlet-name>
        <servlet-class>com.itheima02.life.LifeServlet</servlet-class>
        <!--
            load-on-startup (写在servlet标签内)
            1. 取值是整数n
            2. 默认 n=-1,表示不启动加载(第一次访问才会被加载)
            3. 当n>=0的时候, 启动加载(数字越小,优先级越高)
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>LifeServlet</servlet-name>
        <url-pattern>/life</url-pattern>
    </servlet-mapping>

3.1.3 启动加载

# 启动加载
*       1)问题: 发现 init 默认第一次被访问的时候才调用,适合用来初始化项目数据
*           如果项目数据很多, 加载就需要一定的时间,这样就会给第一个用户的体验不好,因为要等比较久
*
*       2)解决: 服务器一启动,就执行init方法
*       
*       3) 实现: 要在web.xml配置

<?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_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>MyServlet_sb</servlet-name>
        <servlet-class>com.itheima01.servlet.MyServlet</servlet-class>
        <load-on-startup>6</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet_sb</servlet-name>
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>

    <!--
       # 启动加载
       1)问题: 发现 init 默认第一次被访问的时候才调用,适合用来初始化项目数据
           如果项目数据很多, 加载就需要一定的时间,这样给第一个用户打来的体验不好,因为要等比较久

       2)解决: 服务器一启动,就执行init方法

       3) 实现: 要在web.xml配置
            1). servlet标签内补充一个子标签 load-on-startup (启动时加载)
            2). 在load-on-startup里写一个非负整数
                n >= 0  , 数字越小,优先级越高 (我们自己写n=5开始写, 0~4被tomcat使用掉了)
                默认n=-1, 表示启动时不加载
    -->
    <servlet>
        <servlet-name>LifecycleServlet</servlet-name>
        <servlet-class>com.itheima02.life.LifecycleServlet</servlet-class>
        <load-on-startup>5</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>LifecycleServlet</servlet-name>
        <url-pattern>/LifecycleServlet</url-pattern>
    </servlet-mapping>
</web-app>

四 Servlet体系结构

快捷键:
    1. ctrl + alt + u : 查看一个类的继承结构图
    2. ctrl + h : 这个类的简化版继承结构(类)

1

4.1 GenericServlet

1. 问题: 
    Servlet中使用频率最高,最重要的方法是service方法(大部分场景)
    但是我们每次编写Servlet实现类,都是直接实现Servlet接口,重写5个抽象方法(太冗余了)

2. 需求: 如果我们以后编写Servlet实现类,只要重写service方法就好了
3. 解决:
        1). 建立一个抽象类GenericServlet, 继承Servlet接口,重写除了service之外的四个抽象方法,空实现 
        2). 以后编写其他Servlet,只要继承 GenericServlet, 这时候就只要重写service方法

4. 发现 : 很巧, 开发包已经有了这个类GenericServlet

① 编写普通java类,继承GenericServlet抽象类

public class GoodServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("GoodServlet被访问");
    }
    
}

② 配置web.xml

    <servlet>
        <servlet-name>GoodServlet</servlet-name>
        <servlet-class>com.itheima03.generic.GoodServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GoodServlet</servlet-name>
        <url-pattern>/goodServlet</url-pattern>
    </servlet-mapping>

4.2 HttpServlet

1. 问题: 
      我们在前端的form表单中,method属性, 学习过有两种常用的请求方式(get/post)
      我们现在的service方法是这样的: 用户发送请求,无论是什么请求方式,都会统一的执行service方法, 我们无法很好的区别是哪一种请求方式
      
2. 需求: 我们如果想确切的知道是哪一种请求方式,必须要先了解HttpServletRequest

3. 解决: 自己封装了一个MyHttpServlet  -> 开发包 HttpServlet

① 编写前端html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

        <a href="http://localhost:8080/day04-servlet/HahaServlet">HahaServlet</a>
        <form action="http://localhost:8080/day04-servlet/HahaServlet" method="post">
            <input type="submit">
        </form>
</body>
</html>

② 编写普通java类,继承HttpServlet抽象类

package com.itheima04.http;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    HttpServlet是GenericServlet的子类

    1. HttpServlet重写了service方法
    2. 在service方法中,根据请求方式(http协议)的不同,将service拆分成不同的方法
         1). 有两种常用的请求方式
                get
                post
         2). 用户发送请求时(用户在浏览器中访问servlet的地址)
                service方法就会执行 (接着就会判断)
                    get请求方式 -> doGet
                    post请求方式 -> doPost

 */
public class HahaServlet extends HttpServlet {

    //这是post请求方式的service方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post请求方式");
    }
    //基本上请求方式默认都是get
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get请求方式");
    }
}

③ 配置web.xml

 <servlet>
        <servlet-name>HahaServlet</servlet-name>
        <servlet-class>com.itheima04.http.HahaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HahaServlet</servlet-name>
        <url-pattern>/HahaServlet</url-pattern>
    </servlet-mapping>

4.3 经验值分享

① 响应状态码405

请求方法没有重写.....

    /*
        注意: 如果我们不重写doGet/doPost方法, 那么父类的doGet/doPost方法会执行(继承)
            给浏览器响应一个错误: 状态码405 (http1.1)
     */

② 响应状态码500

java代码写错了...

1

五 Servlet路径

5.1 url-pattern

作用:将一个请求网络地址和servlet类建立一个映射关系

1

5.1.1 Servlet映射多个url

1

5.1.2 url映射模式【了解】

配置 url地址取值可以是:

1. 精确匹配(掌握) 
        /servletDemo3  
2. 目录匹配 
        /aa/*
3. 后缀匹配 
        *.xxx   例如:*.do

<servlet-mapping>
        <servlet-name>PathServlet</servlet-name>
        <!--
            Servlet的路径(虚拟路径)
            1. 一个Servlet可以配置多个虚拟路径  -> 了解 (在Filter中有用)
            2. 一个Servlet的路径有三种写法
                2.1  精确匹配(掌握)
                        /servletDemo3
                2.2  目录匹配
                        /aa/*
                2.3 后缀匹配
                        *.xxx   例如:*.do

        -->
        <url-pattern>/bbb/ccc</url-pattern>
        <url-pattern>/aa/*</url-pattern>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
<servlet-mapping>
    <servlet-name>PathServlet</servlet-name>
    <url-pattern>/pathServlet03</url-pattern>
</servlet-mapping>

5.2 相对/绝对路径

● 现阶段我们访问资源的方式越来越多,请求路径在编写时难免出现混淆

  1. 浏览器的地址栏 (输入服务器某个资源地址,敲回车会发送请求)
  2. a标签的href属性 (超链接被点击的时候会发送请求)
  3. form表单的action属性 (form中的submit按钮被点击的时候,发送请求)
  4. js的loation.href属性 (只要设置, 触发相应的)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href="http://www.baidu.com">超链接</a> <br>

    <form action="http://www.baidu.com">
        <input type="text" name="username"> <br>
        <input type="submit">
    </form>

    <input type="button" value="按钮" id="myid">
    <script>
        //js
        document.getElementById("myid").onclick = function () {
            //bom对象: window,location地址栏
            location.href = "http://www.baidu.com"
        }
    </script>
</body>
</html>

这里我们复习下路径规则:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <!--
            html页面中,难免书写url

            1. 绝对路径
                a. http://localhost:8080/day01-servlet/PathServlet
                b. /day01-servlet/PathServlet (省略了三要素,前提: 当前页面和所访问的资源必须在同一服务器上)
                        内部资源, 推荐!!!

            2. 相对路径
                1) ../ 是上一级
                2) ./ 是平级,可以省略
        -->
        <a href="http://www.baidu.com">百度</a> <br>
        <a href="http://localhost:8080/day01-servlet/PathServlet">我的PathServlet</a> <br>
        <a href="/day01-servlet/PathServlet">我的PathServlet2</a> <br>

        <a href="http://localhost:8080/day01-servlet/doc/aaa.html">aaa.html绝对路径写法</a>
        <a href="doc/aaa.html">aaa.html相对写法</a>
</body>
</html>

六 Servlet3.0

● 通过注解配置Servlet,简化web.xml配置Servlet复杂性,提高开发效率,几乎所有的框架都在使用注解

① 创建web工程【注解】

1

② 编写普通java类,继承HttpServlet

public class QuickServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("QuickServlet....3.0");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("QuickServlet....3.0");
    }
}

// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
    
}

idea创建web模块的规律

tomcat可以同时运行多个web模块,但是现在一般只运行一个模块

注意: project structure中要设置这两项

5G NR 帧结构 本节主要介绍5G NR中的帧结构[38.211-4.3]。5G帧结构(Frame Structure)为时域结构。其设计比其4G LTE更为灵活,这种灵活性使5G能够根据应用需求(如增强移动宽带eMBB,超高可靠低时延通信URLLC)进行调整,同时支持差异化的应用场景,提高了5G的利用效率与响应能力。具体而言,5G帧结构是基于时隙和OFDM符号设计的,且5G网络能够根据服务需求动态调整各时隙持续时长。 阅读详情

相关推荐

【原创教程】AB上位机FactoryTalk View的使用教程

条形图主要的作用就是根据绑定的变量中数字大小的变化来反映到图形中,随着数字的增加填充的颜色不断上升或随着数字的减小填充的颜色不断下降。绘图功能中常用的功能主要是:数字输入,数字输出,字符输入,字符输出,各种型的的按钮,条状图,各控件,系统自带的图形库。颜色指的是根据PLC变量的变化来改变图形的颜色,可以绑定BOOL量来显示两种颜色,也可以绑定字节,字,双字等来显示多种颜色。打开软件后右键点击画面选项然后点击新建则新建出一个画面,画面画好后点击保存并更改标题后新建的画面则会出现在画面选项的文件夹下。

Qinmingyue13的博客 4612

Java寒假打卡】JavaWeb-Servlet基础

Java寒假打卡】JavaWeb-Servlet基础

qq_44653420的博客 1877

复制幻灯片到另一个PPT编程

请确保将源PPT文件和目标PPT文件的文件名修改为你实际使用的文件名。运行上述代码后,目标PPT将包含源PPT中的所有幻灯片和形状。这里假设源PPT文件名为"source.pptx",目标PPT文件名为"target.pptx"。方法将每个幻灯片的布局添加到目标PPT中。是一个强大的库,可以用于创建、修改和操作PPT文件。要将一个PPT中的幻灯片复制到另一个PPT,可以使用Python的。这段代码遍历源PPT的每个幻灯片,并使用。步骤 3: 打开源PPT和目标PPT。这将保存修改后的目标PPT文件。

ByteSparkX的博客 1297

微信小程序点餐系统 v1.0 性能优化:5项关键指标提升页面渲染速度30%

本文详细介绍了微信小程序点餐系统v1.0的性能优化实战,通过5大核心策略提升页面渲染速度30%。重点包括WXML列表渲染优化、setData的进阶使用、性能监测体系构建、内存优化实战案例以及编译与分包策略,帮助开发者显著提升用户体验和转化率。

weixin_30607029的博客 610

servlet 的原理以及应用,没有多难

大家好,今天分享一下 servlet 的原理 可以看这个(如果从流程的角度上去解释) 或者这个 看的懂哪个看哪个 如果是从代码实现的角度上 servlet的核心就是在服务器端创建用户请求的对象 我在下面使用大白话讲一遍 用户通过浏览器访问网站 首先使用浏览器向网站的服务器发送http 请求 服务器使用servlet引擎来处理请求,然后会选择响应的servlet 来响应这个请求,并且将响应的结果交给浏览器 servlet 引擎访问servlet的过程分为两种情况 第一次访问 ser

weixin_47556601的博客 377

javaservlet难学吗,Servlet还有学习的必要吗?(手工搭建Servlet

前言在初学Java web的时候,就曾听到过这样一种说法:java Web的演变过程大概可以分为4个阶段:jsp + Servlet + jdbcspring + struts2+ hibernate(ssh)spring + SpringMVC + mybatis(ssm)微服务阶段。所以学习 Java web,可以从第3个阶段开始学习,不用再去关注Servlet,那么Servlet是否还有学习...

weixin_30840919的博客 1689

Servlet好麻烦啊,不用怕,SpringMVC来拯救你

SpringMVC相当于是Spring的一个衍生,SpringMVC和Spring一样,也需要用到依赖注入,用到控制反转,需要容器进行配置对象,只不过它在此基础上深层次地封装了Servlet,在此之前我们在做web开发时,都是用Servlet进行开发进行接收参数和响应页面,但是在这过程中我们发现操作会有些复杂,而在SpringMVC出现后,极大方便了我们的web开发与使用,特别是参数接收、文件上传、表单验证等方面。

aljp123的博客 327

怎样学Java才是硬道理

本文摘自:做软件开发大概有6年多了,从事JAVA开发大概4年多,现在在网上总是看到大家在讨论什么架构比什么架构好,什么技术比什么技术强.对这个我想谈谈我的几点看法.第一、我觉得谈架构是需要有资格的.如果你THINK JAVAJAVA核心技术这两本书还有很多你不能理解 那么你最好先把其中的一本看个滚瓜烂熟,再去看其他技术.你SERVLET用得很熟练了么?如果没有,那么 strust你应该先...

weixin_34295316的博客 201

告诉你怎样学Java才是硬道理

做软件开发大概有6年多了,从事JAVA开发大概4年多,现在在网上总是看到大家在讨论什么架构比什么架构好,什么技术比什么技术强.对这个我想谈谈我的几点看法.   第一、我觉得谈架构是需要有资格的。如果你THINK JAVA或JAVA核心技术这两本书还有很多你不能理解 那么你最好先把其中的一本看个滚瓜烂熟,再去看其他技术。你SERVLET用得很熟练了么?如果没有,那么 strust你应该先停

毛毛的狗窝 1919

程序员怎样学Java才是硬道理

怎样学Java才是硬道理? - 从最近的目标开始

小码农 TT 504

牛人告诉你怎样学Java才是硬道理

做软件开发大概有6年多了,从事JAVA开发大概4年多,现在在网上总是看到大家在讨论什么 架构比什么架构好,什么技术比什么技术强.对这个我想谈谈我的几点看法.   第一、我觉得谈架构是需要有资格的。             如果你THINK JAVA或 JAVA核心技术这两本书还有很多你不能理解 那 么你最好先把其中的一本看个滚瓜烂熟,再去看其他技术。你SERVLET用

zhangzhikaixinya的专栏 1168

Servlet学习二

昨天学习了Servlet的一些知识。将这些知识串起来写了一个小代码,加深映象。1.题目要求如下: 在web.xml文件中设置两个WEB应用的初始化参数,user,password。定义一个login.html,里面定义两个请求字段:user,password.发送请求到loginServlet。在创建一个LoginServlet,在其中获取请求的user,password。比对其和web.xml文

yiran9741的博客 346

告诉你怎样学Java才是硬道理(转自chinaitlab)

做软件开发大概有6年多了,从事JAVA开发大概4年多,现在在网上总是看到大家在讨论什么架构比什么架构好,什么技术比什么技术强.对这个我想谈谈我的几点看法.   第一、我觉得谈架构是需要有资格的。如果你THINK JAVA或JAVA核心技术这两本书还有很多你不能理解 那么你最好先把其中的一本看个滚瓜烂熟,再去看其他技术。你SERVLET用得很熟练了么?如果没有,那么 strust你应该先停下来。如果

chenroujie的专栏 792

基础不牢,地动山摇

搞了一年的程序,考,才发现基础才是硬道理.毕业就搞EJB,以为自己真的很牛呢,后来才发现自己的JSP,SERVLET,STRUTS还没真正弄明白呢.咳呀,做人呀,首先要以平常心来对待,骗了自己,骗不了给你钱的人.基础不牢,地动山摇.

新宾二亮子 1530

使用SSH到底是为了快速开发,还是为了标准?

使用SSH到底是为了快速开发,还是为了标准? 使用SSH到底是为了快速开发,还是为了标准? 重点是为了什么,别说两者都有.小点的项目我用JavaBEAN+SERVLET+JSP也能完成,规范可以加上DAO+SERVICE实现,速度也不会太慢.为什么都要用SSH开发呢?   主要是为了快速开发,配制方法,维护方便。“小点的项目我用JavaBEAN+SERVLET+JSP也能完成,规范可...

张飞的IT专栏 143

毕设项目基于多种深度学习算法实现目标意图识别python源码+运行说明+数据集.zip

【项目说明】1、项目代码完整可靠,其难度适中,满足毕设、课设要求,属于易上手的优质项目,资源内基本都有说明文档,依据文档即可运行2、小白下载后,使用时可能会遇到些小问题,若自己解决不了,请私信描述具体问题,我会第一时间回复提供帮助,也可以远程指导3、适用人群:各大计算机相关专业行业的在校学生、高校老师、公司程序员等下载使用4、特别是那种爱钻研学习的学霸,强烈推荐此项目,可以二次开发提升自己5、如果确定自己是个学渣,想拿来作毕设、课设直接用也无妨,但自己还是尽可能弄懂项目!也可以与我交流强调:项目名字和路径不要有中文,解压重命名为英文名字后再运行!项目易上手

ANSI ESD S6.1-2019 中文 用于保护静电放电敏感物品-接地.pdf

ANSI ESD S6.1-2019 中文 用于保护静电放电敏感物品-接地.pdf

上一篇: Java面向对象总结
下一篇: 在企业中UITableView用处太大了,学会如何去封装和优化真的很重要,给您的工作带来很多便利
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值