SpringBoot起飞系列-Web开发(五)

2023-11-04

一、前言

从今天你开始我们就开始进行我们的web开发,之前的一篇用SpringBoot起飞系列-使用idea搭建环境(二)已经说明了我们如何进行开发,当然这是搭建起步,接下来我们就开始进行详细的开发,包括springboot中各种starters的使用,真正的使用到的功能都是我们实际项目中能用到的。

这里要提到的时,springboot的开发是分模块化的,每个模块可以对应一个starter,例如:web开发模块就对应spring-boot-starter-web,除此之外还有访问数据库的模块、Redis模块等等,我们需要什么样的功能就去引入什么模块,这样我们的项目管理起来也是十分方便,项目的条理也更加的清晰。

首先我们要搭建一个web项目,所以我们要先选中web模块,这是必须的,之后的模块需要什么我们再逐一引入。

二、SpringBoot的Web开发约定

2.1 配置约定

俗话说,springboot这个框架本身就是用约定大于配置的方式设计的,很多配置都成了我们的约定(默认的配置),我们虽然可以更改,但是还是有必要知道的。下面我们简单介绍一下springboot的自动配置原理,这就是springboot中的约定的实现方法。

首先,springboot会把配置文件中以某个前缀开头的配置映射的bean中去,这样我们的配置就在程序启动的时候成了一个一个bean,使用起来也比较方便,默认情况下springboot会用一个Configuration和一个Properites类来配置,如下:

xxxxAutoConfiguration:帮我们给容器中自动配置组件;
xxxxProperties:配置类来封装配置文件的内容;

每一个的AutoConfiguration对应一个Properties,springboot中所有的配置都是这么实现的。xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;xxxProperties是接受配置的bean。

我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理:

@Configuration   //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties(HttpEncodingProperties.class)  //启动指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中

@ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;    判断当前应用是否是web应用,如果是,当前配置类生效

@ConditionalOnClass(CharacterEncodingFilter.class)  //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)  //判断配置文件中是否存在某个配置  spring.http.encoding.enabled;如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
public class HttpEncodingAutoConfiguration {
  
      //他已经和SpringBoot的配置文件映射了
      private final HttpEncodingProperties properties;
  
   //只有一个有参构造器的情况下,参数的值就会从容器中拿
      public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }
  
    @Bean   //给容器中添加一个组件,这个组件的某些值需要从properties中获取
    @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }

所以说springboot有很多这样的类,我们默认只关注配置的prefix就行了, 这是我们以后要覆盖修改springboot的默认配置所需要的配置key。

2.2 静态资源映射约定

首先我们可以先看一下静态资源的配置类,和我们上边说的是一样的,前缀使用的是spring.resources:

@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties implements ResourceLoaderAware {
  //可以设置和静态资源有关的参数,缓存时间等
}

具体代码就不再贴了,直接说结果吧,如果我们用maven管理下载我们的静态资源包时,比如jquery.js什么的,那么我们的默认访问路径是 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源。

webjars:http://www.webjars.org/,是以jar包的方式引入静态资源。例如我们引入jquery.js库,那么可以再pom.xml中这么写:

<!--引入jquery-webjar-->在访问的时候只需要写webjars下面资源的名称即可
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.3.1</version>
</dependency>

访问地址:localhost:8080/webjars/jquery/3.3.1/jquery.js

如果我们以普通的方式访问我们的静态资源,如html,css,js什么的,所有的访问路径都会从下边的路径里边去找,classpath:指的就是我们的resources文件夹。优先级:/META-INF/resources>resources>static>public。

"classpath:/META-INF/resources/", 
"classpath:/resources/",
"classpath:/static/", 
"classpath:/public/" 
"/":当前项目的根路径

http://localhost:8080/asserts/css/index.css对应static/asserts/css/index.css。

三、模板引擎

3.1 介绍

模板引擎可能这个词听起来很高大上,其实我们之前就接触过,最早的就是jsp,还有现在比较高级的Velocity、Freemarker、Thymeleaf,其实模板引擎这一类的功能大都具有以下特点,我们可以用一张图来解释:

都是数据+表达式,生成html,原理都很简单了,只是我们看哪个写起来比较顺手,功能更加强大了。springboot推荐使用Thymeleaf来作为模板引擎。

3.2 引入Thymeleaf

首先引入依赖:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

然后在resources文件夹下添加templates文件夹,下边添加一个index.html,因为默认配置thymeleaf用的前缀是classpath:/templates,后缀是.html。

然后我们添加一个HomeController,设置为mvc的控制器,用@Controller注解,如果你用了RestController就直接返回字符串了而不是去找视图了。

@Controller
@RequestMapping("/home")
public class HomeController {

    @RequestMapping("/index")
    public String index(ModelMap map) {
        map.put("hello","你好");
        return "index";
    }
}

然后修改index.html模板,写上thymeleaf语法:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>成功!</h1>
    <!--th:text 将div里面的文本内容设置为 -->
    <div th:text="${hello}">这是显示欢迎信息</div>
</body>
</html>

其中xmlns:th="http://www.thymeleaf.org",是导入名称空间,可以让我们编码的时候有thymeleaf语法提示,不得不说这语法和vue是一样的啊。

我们直接访问http://localhost:8080/home/index就可以看到效果了。

3.3 设置默认启动页

当我们访问一个站点域名的时候,可以默认设置跳转到哪一个页面,这也是许多网站最基本的操作。

下边我们添加一个配置类WebConfig,来设置启动页:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    //所有的WebMvcConfigurerAdapter组件都会一起起作用
    @Bean //将组件注册在容器
    public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){
        WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("forward:/home/index");
                registry.addViewController("/index.html").setViewName("forward:/home/index");
            }
        };
        return adapter;
    }
}

上边代码的意思是放我们访问/或者/index.html的时候,默认转发到/home/index路径,我们直接设置home/index的页面就行了。

3.4 Thymeleaf语法

3.4.1 标准表达式

使用${},和ognl表达式一样,也是为了照顾我们jsp的开发习惯。

java代码:

@Controller
@RequestMapping("/home")
public class HomeController {

    @RequestMapping("/index")
    public String index(Map<String,Object> map) {
        map.put("hello","你好啊");
        Person person = new Person();
        person.setName("zhangsan");
        person.setAge(25);
        map.put("person",person);
        return "home/index";
    }
}

html代码:

<body>
    <h1>成功!</h1>
    <!--th:text 将div里面的文本内容设置为 -->
    <div th:text="${hello}">这是显示欢迎信息</div>
    <br>

    <p>姓名:<span th:text="${person.name}"></span></p>
    <p>年龄:<span th:text="${person.age}"></span></p>
</body>

3.4.2 选择变量表达式

选择变量表达式,也叫星号变量表达式,使用th:object属性来绑定对象。

html代码:

<p>==========选择变量表达式===========</p>
<div th:object="${person}">
    <div th:text="*{name}"></div>
    <div th:text="*{age}"></div>
</div>

选择变量表达式使用th:object来表示要选择的对象,然后使用*来代表这个对象,后边的{}里边写对象中的属性。

也可以直接使用*{person.name}来获取数据,不同的是${}是在上细纹的map中获取数据,而*是在选择的对象上获取数据。

<p>==========选择变量表达式===========</p>
<div >
    <div th:text="*{person.name}"></div>
    <div th:text="*{person.age}"></div>
</div>

3.4.3 url表达式

生成一个url地址或者一个路径。可用于<script src="..">、<link href="..">、<a href="..">等。

<p>==========Url表达式===========</p>
<div >
    <!--相对路径-->
    <a th:href="@{'person?name='+${person.name}}" >地址1</a>
    <!--相对于项目的根路径-->
    <a th:href="@{'/person?name='+${person.name}}" >地址2</a>
</div>
<script th:src="@{'/asserts/js/index.js'}"></script>

几乎所有的html属性都能用th:xxx的形式替换,经过thymeleaf解析后会直接替换为原始html属性和值。

3.4.4 内置对象

thymeleaf提供了一些内置对象,可以让我们直接使用,访问一些请求信息。

#request:

${#request.getContextPath()} 

${#request.getAttribute("name")}

#session:

{#session.getAttribute("loginUser")}

{#session.id}

3.4.5 工具对象

工具对象可以帮助我们格式化一样数据,简单的处理一数据。

  • #dates:java.util.Date对象的实用方法,<span th:text="${#dates.format(curDate,'yyyy-MM-dd HH:mm:ss')}"></span>
  • #calendars:和dates类似,但是是java.util.Calendar对象。
  • #numbers:格式化数据对象的实用方法。
  • #strings:字符串对象的实用方法。contains,startsWith,prepending/appending等。
  • #objects:对objects操作的实用方法。
  • #bools:对布尔值求值的实用方法。
  • #arrays:数组的实用方法。
  • #lists:list的实用方法.
  • #sets:set的实用方法.
  • #maps:map的实用方法
  • #aggregates:对数组或集合创建聚合的实用方法。

3.4.6 thymeleaf模板片段与布局页

1. 模板片段:可以让我们引入一个写好的html片段,相当于jsp:include功能了,比如头部和尾部我们都一样就可以复用,也可以引入一个页面当做layout布局页,以后的页面都使用这个模板。

我们可以使用th:fragment来定义一个模板,使用th:insertth:replaceth:include来替换模板。

其中:

  • th:insert 3.0+版本新加的。
  • th:replace 2.0+ 3.0+都可用。
  • th:include 这个在3.0版本已经不建议使用。

这三个命令的语法格式为templatename::[domselector]。

我们先添加模板fragment/footer.html:

<html xmlns:th="http://www.thymeleaf.org">
<body>
    <span th:fragment="copyright">© 2019 <strong>xxx公司</strong></span>
</body>
</html>

home/index.html引用模板:

<!--th:include-->
<div th:include="fragment/footer :: copyright"></div>
<!--th:replace 直接替换-->
<div th:replace="fragment/footer :: copyright"></div>
<!--th:insert 把html插入到内部-->
<div th:insert="fragment/footer :: copyright"></div>

三个命令生成html结构如下,稍微有些不一样:

2. 布局页:设置一个母版页,其他页面以这个页面做为母版,有父类的意思。

首先需要添加布局包依赖:

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
    <version>2.2.2</version>
</dependency>

添加一个layout页面(父页面):

html代码:

<!DOCTYPE html>
<html   xmlns:layout="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <header>这是头部</header>
    <div layout:fragment="content"></div>
    <footer>这是底部</footer>
</body>
</html>

添加一个子页面,以这个_home.html为父页面:

其中:layout:decorator="_layout/_home" 指明布局页的路径,layout:fragment="content",指明要替换布局页中的位置。

html代码:

<!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.w3.org/1999/xhtml" layout:decorator="_layout/_home">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div layout:fragment="content">
        这是child页内容
    </div>
</div>
</body>
</html>

输出:

四、总结

这次介绍了web开发的基本流程、包括静态文件、模板引擎等,我们现在已经做好了web开发的准备工作,接下来就可以进行业务功能的编写了,接下来我们会做一个简单的CRUD来具体了解一下Web的基本流程。

转载于:https://www.cnblogs.com/lookings/p/11590787.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot起飞系列-Web开发(五) 的相关文章

  • 空 URL 哈希导致页面在 js 事件上跳转

    我有一个带有下一个和上一个按钮的照片库 如果我的某个 javascript 方法由于某种原因被破坏 那么当单击其中一个按钮时 它会向 url 添加一个哈希值 即 www google com 我知道可以给散列一个 div id 来跳转到页面
  • 将 NPM 包客户端与 nuxt 结合使用

    我对 nuxt 和 javascript 非常陌生 我正在尝试弄清楚如何在客户端使用我的应用程序的依赖项 我将它们列在我的 nuxt config js 中并使用 npm 安装 我也有一个文件 plugins导入它们的目录 不确定这是否好
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 在Java程序中计算zip文件的md5哈希值

    我有一个 zip 文件 在我的 Java 代码中我想计算 zip 文件的 md5 哈希值 有没有我可以用于此目的的 java 库 一些例子将非常感激 谢谢 几周前我通过这篇文章做到了这一点 http www javalobby org ja
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • 如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它

    我有一个 Spring 3 JPA 2 0 应用程序 在我的 Controller我需要一个初始化的对象 但我有代理 我需要能够以编程方式初始化它 我需要类似的功能org hibernate Hibernate initialize Obj
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • Jar Manifest 文件的使用混乱

    我正在阅读使用 jar 工具打包 java 应用程序 我注意到 META INF 目录下创建了一个清单文件 对于一个简单的应用程序来说 感觉它没有任何作用 我在 stackoverflow 上搜索以了解 Manifest 文件的用法 我碰到
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • 如何在jpa中共享EntityManagerFactory

    我是 jpa 的新手 这是场景 我正在开发一个 Web 应用程序 其中 多个用户可以登录 当 user1 注销时 我正在使用下面的代码 public static void closeEntityManagerFactory if enti
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • 错误:创建 React Native 项目版本 0.59.9 时找不到 template.config.js

    当我尝试创建 React Native 项目版本 0 59 9 时 出现以下错误 错误错误 无法在 react native 模板中找到 var folders zc h93bvpb573q24 5ynvgkn1wc0000gn T rnc
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • 在测试期间调用预定方法[重复]

    这个问题在这里已经有答案了 我正在使用 Maven 开发 SpringBoot 应用程序 我有一个班级 Component有方法的注释m与 Scheduled initialDelay 1000 fixedDelay 5000 注解 这里f
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓
  • 错误:运算符不存在:整数 = 字符变化,使用 Postgres 8.2

    我有一个用旧版本的 Eclipse Ganymede 如果我没记错的话 开发的 Java EE Web 应用程序 我最近迁移到 Kubuntu 12 04 LTS 并将应用程序迁移到 Eclipse Kepler 我从 Eclipse 网站

随机推荐

  • javaScript基础面试题 ---宏任务微任务

    宏任务微任务 一 为什么JS是单线程语言 二 JS是单线程 怎样执行异步代码 1 JS是单线程语言 2 JS代码执行流程 同步执行完 再进行事件循环 微任务 宏任务 3 清空所有的微任务 再执行宏任务 4 微任务 Promise then
  • 安装MinGW-w64

    1 下载mingw工具 Windows系统下安装配置 MinGW w64 开发环境 https blog csdn net u010429831 article details 106766165 MinGW w64 下载链接 https
  • 常见的Java报错和原因

    一 常见的java异常分类 Throwable类有两个直接子类 1 Exception 出现的问题是可以被捕获的 2 Error 系统错误 通常由JVM处理 二 被捕获的异常分类 1 Check异常 派生自Exception的异常类 必须被
  • C语言的指针

    C语言的指针 一 指针的优先级 括号 的优先级最高 其次是数组 然后是剩余的 最后是类型 指针p与优先级高的先结合 对于比较复杂的指针 结合后就视为一个整体temp 然后再与剩下的结合进行分析 int p p是一个普通的int型变量 p先与
  • kafka安装和简单测试

    Kafka的安装和简单实例测试 厦大数据库实验室博客 ps 上边文章的kafka版本有点老 是0 10 1 0版本的 最新的kafka版本启动和创建topic等命令有所改变 核心概念 下面介绍Kafka相关概念 以便运行下面实例的同时 更好
  • 电脑xinput1_3.dll丢失的解决方法?哪个解决方法更简单

    最近在打开软件或者游戏的时候 电脑提示xinput1 3 dll文件丢失的错误 这个问题导致我无法运行某些游戏和应用程序 通过一番尝试和研究 我找到了一些修复xinput1 3 dll文件丢失的方法 并在此分享给大家 首先 我了解到xinp
  • 基于MATLAB的针对LSTM的时间序列分析预测,可进行多步预测,其中训练结果,测试结果,迭代过程,预测结果如图。模型已调试完毕,替换自己的数据可直接运行。

    基于MATLAB的针对LSTM的时间序列分析预测 可进行多步预测 其中训练结果 测试结果 迭代过程 预测结果如图 模型已调试完毕 替换自己的数据可直接运行 哔哩哔哩工房 bilibili com https gf bilibili com
  • 生成子集——二进制法

    我的个人博客 逐步前行STEP 用二进制位的0和1表示集合中是否存在该元素 要生成0n的子集 先生成0n的二进制序列 这些序列的0 1位正好可以对应一个子集中全集在该位置上的元素是否存在 将其作为子集中存在的元素的标记 输出对应元素 inc
  • 京东自动登录

    京东自动登录 注 本文所做操作皆以京东web为例 包含 xpath splinter ocr 遇到的坑 1 登录页面通过查看网页元素 能看到账户 密码唯一id 但是执行 browser fill loginname name 填写账户密码
  • MATLAB quantreg 分数位回归 初步使用探究

    打开 quantreg m函数 在注释部分有以下说明 Quantile Regression USAGE p stats quantreg x y tau order nboot INPUTS x y data that is fitted
  • 汽车EE架构:5大域介绍

    参考链接 1 汽车域控制器 上 动力域控制器 底盘域控制器 智能座舱域控制器 知乎 动力域控制器 底盘域控制器 智能座舱域控制器 2 汽车域控制器分类 下 自动驾驶域控制器 车身域控制器 知乎 自动驾驶域控制器 车身域控制器 目录 域控制器
  • Springboot定时任务简单demo

    1 创建一个Springboot项目 2 添加依赖
  • docker容器中的mysql忘记密码怎么办?

    docker容器中的mysql忘记密码怎么办 1 查看mysql在docker中运行的containerID docker ps 此处amber这里获取的containerID为 eb540a56a527 2 进入正在运行的mysql容器并
  • OLED透明屏 原装:突破创新的高品质显示技术

    OLED透明屏 原装作为一项高品质的显示技术 正以其独特的透明度和卓越的画质引起广泛关注 根据最新的市场报告和行业动态 本文将通过介绍OLED透明屏 原装的特点和优势 应用领域 技术原理以及购买原装产品的重要性等方面内容 为读者提供全面了解
  • MaterialDesign

    http blog csdn net column details sunzxyongmaterial html
  • Tomcat9-默认登录名密码

    在tomcat启动完成后 在浏览器中输入http localhost 8080 进入tomcat默认页 那么tomcat的默认登录名和密码是什么呢 我是通过免安装的方式启动的tomcat 所以没有手动配置过用户名及密码 那如何配置呢 点击
  • Python学习笔记(五)————列表相关

    目录 1 列表定义语法 2 列表索引 列表操作 3 查找某元素的下标 4 修改特定位置 索引 的元素值 5 插入元素 6 追加元素 7 删除元素 8 清空列表内容 9 统计某元素在列表内的数量 10 总结 列表特点 1 列表定义语法 列表内
  • yolo5 [Errno 32] Broken pipe OSError: [WinError 1455] 页面文件太小,无法完成操作

    错误代码 File D Users Administrator miniconda3 lib runpy py line 85 in run code exec code run globals File E project weilan
  • npm安装vue

    安装vue cli 脚手架命令 npm install g vue cli 适用于vue cli 2 0 npm install g vue cli 适用于vue cli 3 0 一 初次安装 vue cli 3 0 步骤 1 全局安装vu
  • SpringBoot起飞系列-Web开发(五)

    一 前言 从今天你开始我们就开始进行我们的web开发 之前的一篇用SpringBoot起飞系列 使用idea搭建环境 二 已经说明了我们如何进行开发 当然这是搭建起步 接下来我们就开始进行详细的开发 包括springboot中各种start