使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

news/2024/5/16 0:00:22/文章来源:https://blog.csdn.net/weixin_33881050/article/details/86329602
原文:使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

摘要 讲解在IntelliJ IDEA中,如何进行Mysql数据库的配置

目录[-]

文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。六、数据库配置1、创建Mysql数据库2、IntelliJ IDEA导入数据库3、配置数据库更新:

转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生

注:在阅读本文前,请先阅读:

使用IntelliJ IDEA开发SpringMVC网站(一)开发环境

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo

文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。

六、数据库配置

      下面,就要通过一个简单的例子,来介绍SpringMVC如何集成Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节的讲解,更加深刻地认识Controller是如何进行请求处理的,相信看完这一章节,你就可以开始你的开发工作了。

准备工作:

    在src\main\java中新建两个包:com.gaussic.model、com.gaussic.repository,将在后面用上,如下图所示:

140541_vzfm_2287879.png

1、创建Mysql数据库

      本文的讲解使用Mysql数据库,如果使用其它数据库的读者,可以去网上参考其他的配置教程,在此不做太多的叙述。数据库是一个底层的东西,底层的细节对上层的抽象并没有太大的影响,因此,只要配置好数据库,本章的内容仍然是适用于所有数据库的(貌似如此)。

      假设我们现在要建立一个小小的博客系统,其数据库ER图如下所示(当然这只是一个小小的例子,真实的博客系统比这要复杂的多):

165825_C5z3_2287879.png

    新建一个数据库springdemo,在数据库中,有两张表:

    (1)用户表user:用户登录信息,主键id设为自增

    (2)博文表blog:储存用户发表的博文,主键id设为自增,其中有一个外键user_id链接到user表。

    详细表结构如下图所示:

154242_uNGE_2287879.png

165707_Xx0o_2287879.png

使用MySQL Workbench添加外键流程:

154625_EKjj_2287879.png

170158_DzeJ_2287879.png

注意:在添加外键时,应该根据需求设置,例如右边红框中的Foreign Key Options,默认在Delete时是NO ACTION,说明在删除一个用户时,如果数据库中存在该用户的文章,那么就无法删除该用户,也无法删除该用户的所有文章,而如果将该选项改为CASCADE,那么删除该用户,就会同时删除该用户所有的文章。通常后者是不太可取的,因为如果发生了删除用户的误操作,很有可能该用户的内容被连带删除,且不可逆,这也是实现真实系统时需要考虑的原因之一。

2、IntelliJ IDEA导入数据库

    对于此前所接触的一些常用的框架中,一张数据表往往对应一个Java Bean。在SpringMVC中,这个Java Bean相当于model。那么,这个类是否需要自己来写呢?不需要,利用IntelliJ IDEA可以帮我们自动的生成这些JavaBean。

    首先,右键项目,选择Add Framework Support:

161733_veHn_2287879.png

下拉选择JavaEE Persistence,右边provider选择Hibernate:

191503_1Qcl_2287879.png

    在这一步结束后,我们可以发现,在resources里面生成了persistence.xml配置文件,左边栏出现了一个Persistence标题(若没有请点击左下角那个灰框):

191743_X28m_2287879.png

    persistemce.xml具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><persistence-unit name="NewPersistenceUnit"><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><property name="hibernate.connection.url" value=""/><property name="hibernate.connection.driver_class" value=""/><property name="hibernate.connection.username" value=""/><property name="hibernate.connection.password" value=""/><property name="hibernate.archive.autodetection" value="class"/><property name="hibernate.show_sql" value="true"/><property name="hibernate.format_sql" value="true"/><property name="hbm2ddl.auto" value="update"/></properties></persistence-unit>
</persistence>

    我们先不着急填写这个配置文件。点开左边栏的Persistence,显示如下图所示:

191844_e9cw_2287879.png

右键项目名,选择Generate Persistence Mapping,再选择By Database Schema:

191911_tyeY_2287879.png

出现如下界面,其主要需要配置的地方如下图红框所示:

163428_RxJL_2287879.png

    点击Choose Data Source右边的三个点选择数据源,在弹出的界面左上角选择“+”,选择Mysql:

163618_u1DC_2287879.png

在如下界面填写主机、端口号、数据库名、用户名、密码,如果驱动丢失点击下面的Download可以下载驱动,点击 Test Connection可以测试数据库是否连接成功:

163808_eb51_2287879.png

    在以上界面配置完成后,点OK,第一次使用需要Setup Master Password:

    164622_rs6v_2287879.png

    回到如下页面,package填写model包(1),勾选Prefer primitive type使用原始数据类型(2),勾选Show default relationships以显示所有数据库关系(3),再点击刷新按钮(4),将会找到数据库中的两个表,勾选两个数据表(5),再勾选Generate Column Defination以生成每一列的描述信息(6)。选中blog表然后点击“+”号按钮,添加外键关系(7)。

205813_NmEP_2287879.png

210658_pKKH_2287879.png

    点击OK后,在Database Schema Mapping中可以发现多出了两个关系,如图所示:

210911_nFZM_2287879.png

   再点击OK,稍后,打开model包,可以看到生成了两个Java Bean,在SpringMVC中称为两个实体,它们对应了数据库的两张表:

170744_KzXw_2287879.png

BlogEntity如下所示(注意把java.sql.Date改为java.util.Date):

package com.gaussic.model;import javax.persistence.*;
import java.util.Date;/*** Created by dzkan on 2016/3/8.*/
@Entity
@Table(name = "blog", schema = "springdemo", catalog = "")
public class BlogEntity {private int id;private String title;private String content;private Date pubDate;private UserEntity userByUserId;@Id@Column(name = "id", nullable = false)public int getId() {return id;}public void setId(int id) {this.id = id;}@Basic@Column(name = "title", nullable = false, length = 100)public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}@Basic@Column(name = "content", nullable = true, length = 255)public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Basic@Column(name = "pub_date", nullable = false)public Date getPubDate() {return pubDate;}public void setPubDate(Date pubDate) {this.pubDate = pubDate;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;BlogEntity that = (BlogEntity) o;if (id != that.id) return false;if (title != null ? !title.equals(that.title) : that.title != null) return false;if (content != null ? !content.equals(that.content) : that.content != null) return false;if (pubDate != null ? !pubDate.equals(that.pubDate) : that.pubDate != null) return false;return true;}@Overridepublic int hashCode() {int result = id;result = 31 * result + (title != null ? title.hashCode() : 0);result = 31 * result + (content != null ? content.hashCode() : 0);result = 31 * result + (pubDate != null ? pubDate.hashCode() : 0);return result;}@ManyToOne@JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)public UserEntity getUserByUserId() {return userByUserId;}public void setUserByUserId(UserEntity userByUserId) {this.userByUserId = userByUserId;}
}

    再看UserEntity:

package com.gaussic.model;import javax.persistence.*;
import java.util.Collection;/*** Created by dzkan on 2016/3/8.*/
@Entity
@Table(name = "user", schema = "springdemo", catalog = "")
public class UserEntity {private int id;private String nickname;private String password;private String firstName;private String lastName;private Collection<BlogEntity> blogsById;@Id@Column(name = "id", nullable = false)public int getId() {return id;}public void setId(int id) {this.id = id;}@Basic@Column(name = "nickname", nullable = false, length = 45)public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}@Basic@Column(name = "password", nullable = false, length = 45)public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Basic@Column(name = "first_name", nullable = true, length = 45)public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}@Basic@Column(name = "last_name", nullable = true, length = 45)public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserEntity that = (UserEntity) o;if (id != that.id) return false;if (nickname != null ? !nickname.equals(that.nickname) : that.nickname != null) return false;if (password != null ? !password.equals(that.password) : that.password != null) return false;if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) return false;if (lastName != null ? !lastName.equals(that.lastName) : that.lastName != null) return false;return true;}@Overridepublic int hashCode() {int result = id;result = 31 * result + (nickname != null ? nickname.hashCode() : 0);result = 31 * result + (password != null ? password.hashCode() : 0);result = 31 * result + (firstName != null ? firstName.hashCode() : 0);result = 31 * result + (lastName != null ? lastName.hashCode() : 0);return result;}@OneToMany(mappedBy = "userByUserId")public Collection<BlogEntity> getBlogsById() {return blogsById;}public void setBlogsById(Collection<BlogEntity> blogsById) {this.blogsById = blogsById;}
}

3、配置数据库

    既然数据库已经导入了,那么前期准备工作基本完成,还需要进行最终的配置。

    首先,打开mvc-dispatcher-servlet.xml,添加下列配置(如果某些地方报错,请选中并按Alt + Insert补全配置):

<!-- 表示JPA Repository所在的包 -->
<jpa:repositories base-package="com.gaussic.repository"/><!-- 链接到persistence.xml -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/>
</bean><!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean><!-- 开启事务管理注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

    讲解:

    (1) jpa:repositories:这一部分涉及到数据库的接口,将在后面详解;

    (2)entityManagerFactory:实体管理器工厂,读取persistence.xml配置;

    (3)transactionManager:事务管理器,利用entityManager进行事务管理;

    (4)tx:annotation-driven:打开事务管理器的注解驱动,可以使用注解的方法操纵数据库。

整体如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--指明 controller 所在包,并扫描其中的注解--><context:component-scan base-package="com.gaussic.controller"/><!-- 静态资源(js、image等)的访问 --><mvc:default-servlet-handler/><!-- 开启注解 --><mvc:annotation-driven/><!--ViewResolver 视图解析器--><!--用于支持Servlet、JSP视图解析--><bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 表示JPA Repository所在的包 --><jpa:repositories base-package="com.gaussic.repository"/><!-- 链接到persistence.xml --><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/></bean><!-- 事务管理 --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean><!-- 开启事务管理注解 --><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

    下面,填充persistence.xml,将persistence-unit的name改为 defaultPersistenceUnit。在下面的文件中,我添加了一些更为详细的配置:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><persistence-unit name="defaultPersistenceUnit"  transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><!-- 使用MySQL方言 --><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/><!-- 数据库连接的URL地址 --><property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/springdemo"/><!-- 数据库连接的驱动 --><property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/><!-- 数据库连接的用户名 --><property name="hibernate.connection.username" value="root"/><!-- 数据库连接的密码 --><property name="hibernate.connection.password" value="111111"/><!-- 显示SQL语句 --><property name="hibernate.show_sql" value="true"/><property name="hibernate.connection.useUnicode" value="true"/><property name="hibernate.connection.characterEncoding" value="UTF-8"/><!-- 在显示SQL语句时格式化语句 --><property name="hibernate.format_sql" value="true"/><property name="hibernate.use_sql_comments" value="false"/><!-- 自动输出schema创建DDL语句 --><property name="hibernate.hbm2ddl.auto" value="update"/><!-- 数据库连接超时后自动重连 --><property name="hibernate.connection.autoReconnect" value="true"/><property name="connection.autoReconnectForPools" value="true"/><property name="connection.is-connection-validation-required" value="true"/></properties></persistence-unit>
</persistence>

    现在,重新启动tomcat,如果没有报错,说明数据库已经配置完成了,接下来就要讲解数据库的相关开发工作。


更新:

      阅读评论发现许多同学的persistence.xml出现了问题,因为出现问题的原因可能有很多,如果没有完全的报错以及代码的话,我这边很难解决问题,一个办法就是在GitHub Issues上面提问并贴出代码,我这边尽量解答。另一个办法就是下载最新的代码运行看有没有什么问题。

       最后一个办法,尝试另外一种配置方法,无需persistence.xml,直接在mvc-dispatcher-servlet.xml中配置数据库,如下所示:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/><property name="packagesToScan" value="com.gaussic.model" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/></property><property name="jpaProperties"><props><prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop><prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/springdemo</prop><prop key="hibernate.connection.username">root</prop><prop key="hibernate.connection.password">111111</prop><prop key="hibernate.show_sql">false</prop><prop key="hibernate.connection.useUnicode">true</prop><prop key="hibernate.connection.characterEncoding">UTF-8</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.use_sql_comments">true</prop><prop key="hibernate.hbm2ddl.auto">validate</prop><prop key="hibernate.connection.autoReconnect">true</prop><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop><prop key="connection.autoReconnectForPools">true</prop><prop key="connection.is-connection-validation-required">true</prop></props></property>
</bean>

          删除persistence.xml,直接修改entityManagerFactory bean为如上图所示。这个方法可以拜托persistence.xml的困扰,但是有一个小小的问题,如果之前没有添加Java EE Persistence这个框架的,文中的Persistence工具栏将不会显示。一个解决办法就是,先修改mvc-dispatcher-servlet,然后再添加Java EE Persistence框架,等能够看到Persistence工具栏后,删除persistence.xml,余下的步骤可以继续操作。

        转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生

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

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

相关文章

织梦手机网站建设 并配置二级域名

现在手机站很流行&#xff0c;如何用织梦程序建手机站并实现数据同步呢&#xff1f;我们都知道通过开发实现数据同步还是比较麻烦的&#xff0c;咱们就来说下利用织梦自动的手机wap浏览是如何实现手机网站建设并配置二级域名的。首先为织梦安装手机wap浏览模块&#xff1a;找到…

如何管理网站后台

2019独角兽企业重金招聘Python工程师标准>>> 网站上传&#xff0c;域名主机申请后&#xff0c;接着就是管理 这里以实验中心网络后台管理为例&#xff1a; 1 概述 实验中心网络平台管理员后台主要包括&#xff1a;系统参数设置&#xff08;网站参数管理、计数器初始…

快速生成apk 自动发布到网站 便于测试

遇到的问题&#xff1a; 开发者生成的apk 需要不断给 测试安装让他们测试。有没有脚本自动将最新apk上传到服务器,让测试自己安装测试呢&#xff1f;mac电脑 怎么自己搭建文件服务器 启动Tomcat功能在这里不在赘述&#xff0c;有不懂的请你多多百度和Google 然后把你的localh…

5首页加载慢_5个 外贸建站谷歌SEO优化技巧

外贸建站谷歌SEO优化技巧 想必是每个外贸建站人员真正关心并且想要熟练掌握的一门学问。同学们可能在很多网站或者博客上看到过相同标题的博客文章&#xff0c;这些文章质量参差不齐内容多种多样&#xff0c;所表达的观点和相关技巧难免会存在一些作者的个人观点。所以当你看了…

获取网站状态码

2019独角兽企业重金招聘Python工程师标准>>> curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" 域名 例子&#xff1a; vim httpstatus.sh #!/bin/bash echo -n "please your domain name: " read domain curl -I -m 10 -o /dev/null -s -w…

大型网站架构系列:缓存在分布式系统中的应用(二)

缓存是分布式系统中的重要组件&#xff0c;主要解决高并发&#xff0c;大数据场景下&#xff0c;热点数据访问的性能问题。提供高性能的数据快速访问。本文是缓存在分布式应用第二篇文章&#xff0c;介绍分布式缓存&#xff0c;Memcache&#xff0c;Redis&#xff0c;本地缓存&…

查看网站上保存的密码

Chrome有个保存账户的功能&#xff0c;点击保存网站账号密码&#xff0c;浏览器下次就记住你的号码了&#xff0c;自己的电脑上这样用很爽&#xff0c;每次点击登录按钮就可以了。但是问题来了&#xff0c;有一天你想在另外一台电脑上登录&#xff0c;忘记密码了。自己电脑上的…

从SEO效果看谷歌百度360搜狗有道bing技术现状

为什么80%的码农都做不了架构师&#xff1f;>>> 从SEO效果看谷歌百度360搜狗有道bing技术现状声音 maybe yes 发表于2015-08-20 16:52 原文链接 : http://blog.lmlphp.com/archives/140/From_the_effect_of_the_SEO_to_see_the_Search_Engine_Company_Google_Baidu…

Mozilla新特性只支持https网站

Mozilla的官方博客2015.4.30正式宣布了淘汰HTTP的方案。其中包括&#xff1a;设定一个日期&#xff0c;所有的新特性将只提供给HTTPS网站&#xff1b;HTTP网站将逐步被禁止访问浏览器功能&#xff0c;尤其是那些与用户安全和隐私相关的功能。Mozilla此举是向Web开发者社区发出一…

关于字符编码 转自廖雪峰的官方网站,至今看到最清晰的讲解

2019独角兽企业重金招聘Python工程师标准>>> 因为计算机只能处理数字&#xff0c;如果要处理文本&#xff0c;就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特&#xff08;bit&#xff09;作为一个字节&#xff08;byte&#xff09;&#xff0c…

linux 网站架构的演变

今天我们学习影响互联网最重要服务web服务&#xff08;应用服务&#xff09;。什么是web服务呢&#xff1f;就是我们平常在浏览器输入一个网站的地址&#xff0c;然后能给我们提供服务的就是web服务器。Web服务器的发展历史我就不多说了&#xff0c;我直接说下现在流行的搭建这…

网站如何进行渠道跟踪_开发网站不知道如何进行推广?5个技巧教会你

随着互联网的发展&#xff0c;企业对网站的要求也越来越高。目前&#xff0c;升级营销网站建设已成为企业竞相选择的对象。但是&#xff0c;网站做得好后&#xff0c;推广工作也不容忽视。只有做好推广工作&#xff0c;网站才能取得更好的效果。那么接下来&#xff0c;郑州APP开…

【CURL】模拟登录网站并获取用户信息

模拟登录网站并获取用户信息 前言 这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息。 前后端分离 本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接进行数据操作。 传统模拟登录的方式在页面上找到表单元素,直接进行模拟表单提…

用nodejs写个简单的视频网站[教程]

用nodejs写个简单的视频网站[教程]# 首先你要有nodejs环境和会使用npm,不会自行Google或百度。 ok&#xff01;开始吧&#xff01; 效果示例第一步 用nodejs编写后台: 1.新建项目 2.创建static文件夹(可自行更改) 3.static文件夹下创建videos文件夹(可自行更改) 4.在项目目录创…

大型网站技术学习-3. 容器Docker与kubernetes

大型网站技术基石篇-容器Docker与kubernetes Docker和Kubernetes的关系就如Xen与OpenStack。Docker是一种容器技术&#xff0c;和Hypervisor&#xff08;KVM/Xen这类&#xff09;不同的是&#xff0c;Docker不会提供一整个操作系统&#xff0c;他能提供隔离的程序运行环境。对一…

程序员去交友网站找女友,没想到找到了这个...

1024程序员节&#xff0c;CSDN旗下的码书商店为程序员放个“价”&#xff0c;全场所有书籍8折&#xff0c;电子产品可以拥有大额优惠券&#xff0c;购买前可加文末客服微信领取优惠券哦&#xff0c;不仅如此&#xff0c;可以参加免单活动&#xff0c;加文末微信入群抽奖&#x…

织梦同步静态文件到服务器,静态网站添加到织梦

静态网站添加到织梦 内容精选换一换本文介绍了弹性文件服务SFS各特性版本的功能发布和对应的文档动态&#xff0c;新特性将在各个区域(Region)陆续发布&#xff0c;欢迎体验。开启网页防篡改时&#xff0c;您需为指定的主机分配一个配额&#xff0c;关闭企业主机安全服务或删除…

网站开发流程以及HTML5简介(三)

2019独角兽企业重金招聘Python工程师标准>>> 二、网页的基本结构 网页是由什么组成的&#xff1a; > 内容&#xff1a;如文字&#xff0c;图像等&#xff0c;一般由HTML代码负责实现。什么是HTML&#xff1f;HTML是一种能展示图片&#xff0c;文字&#xff0c;多…

很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天做个demo(续集)...

有些功能部分手机不能使用&#xff0c;网站&#xff0c;通讯录&#xff0c;wifi基本上每个手机都可以使用。&#xff08;浏览器自带的扫描就够了&#xff0c;QQ扫码和微信扫码部分手机不能直接连接wifi&#xff09; 在看之前你可以扫一扫下面几个二维码先看看效果&#xff1a; …

python 比价_爬虫+网站开发实例:电影票比价网

注&#xff1a;一篇去年的旧文&#xff0c;发现没在知乎发过&#xff0c;过来补个档。有个小问题是项目中淘票票的网页反爬提升且变动较多&#xff0c;目前暂不可用了。时常有同学会问我类似的问题&#xff1a;我已经学完了 Python 基础&#xff0c;也照着例子写过一点爬虫代码…