赞
踩
个人寄语:开发注重原理架构,算法注重逻辑思维
关于为什么要学习SSM框架,存在着哪些优势,这是需要我们在开发过程中去慢慢体会的。
Spring是一个分层的一站式轻量级开源框架,采用经典的MVC三层结构模式,即表现层,业务层,持久层。
表现层负责页面数据显示,页面跳转调度等,后面单独介绍解决该层的SpringMVC框架。
业务层负责业务处理,功能逻辑和事务控制,核心机制包括IOC控制反转,AOP面向切面编程和事务控制等。
持久层负责数据存取封装和与数据库交互,对应的解决方案包括JDBC模板,ORM(对象关系映射框架)等。
体系结构
在Spring的体系结构中,可以看到Spring集成了很多模块,主要包括核心容器,数据访问/集成,Web,AOP,工具,消息测试模块等。核心容器中Core,Bean模块提供了Spring最基础的功能,EL模块即表达式语言提供了在运行期间查询和操作对象图的强大功能,包括使用Bean的ID引用Bean,调用方法和访问对象的属性,进行逻辑关系运算,正则表达式匹配和集合操作等特性。
Spring三大核心
IOC(控制反转):即将对象的创建权交给Spring工厂管理
DI(依赖注入):在Spring创建Bean对象时,动态的将依赖对象注入Bean组件,可通过注解和配置的方式实现
AOP(面向切面编程):采取横向抽取机制,取代了传统纵向继承体系复杂性代码的编写方式;基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,对目标对象进行功能增强,包括前置,后置,环绕,最终等增强方式。
Spring的优势
通过Spring的IOC特性,将对象之间的依赖交给Spring控制,方便解耦,简化了开发
通过Spring的AOP特性,对重复模块进行集中抽取,实现事务,日志,权限的控制,这种抽取封装机制是java开发的核心
提供了对其它大量优秀框架的集成支持
接下来简单介绍基础部分
IOC容器
Spring由容器创建对象,将它们连接在一起,来进行管理;控制反转就是将new实例对象工作交由Spring容器来执行。
实现一个最简易创建的流程:编写接口和实现类;在配置文件中将该类交由Spring管理,配置相应的bean实例(使用Spring创建对象,在Spring中这些都称为bean);加载配置文件,获取上下文对象,然后通过该对象的getBean方法来传入对应bean的id获得实例对象;
IOC创建对象方式
默认使用无参构造创建对象
使用有参构造创建对象可通过constructor-arg标签来传入,其中name属性代表参数名,value表示传入的参数值,或者用ref代表对象引用
DI依赖注入
前面已经介绍过有参构造注入,这里主要介绍通过set方法注入这里注入的数据类型包括普通类型,引用类型和数组类型(list,map,set等);在实体类中定义注入的属性,然后重写set方法,通过property标签注入,其中name代表属性的名字,value可表示普通属性值,里面有其它类型的一些子标签可实现不同类型数据的注入扩展方式注入,即通过p,c命名空间的方式注入,需要导入相关的头部约束和命名空间,然后再bean标签中增加p:,c:属性
Bean的作用域
包括singleton单例模式和prototype原型模式
两者创建时机不同,其中singleton在加载配置容器配置文件的时候就会被创建,而prototype在每次调用getbean方法的时候才被创建
注解实现自动装配
首先通过<context:annotation-config/>开启注解支持
然后通过@Autuwired和@Qualifer实现相应属性的自动装配,这两个注解可通过@Resource替代,其中前者查找顺序先按类型,后按名字,后者先按名字,再按类型,使用@Resource需要导入相应的jar包
使用注解开发:
@Component(作用在类上,表明该类由Spring容器管理,等价于我们配置的bean),标注一个普通的Spring Bean类)
@Repository (标注一个DAO组件类)
@Service(标注一个业务逻辑组件类)
@Controller(标注一个控制器组件类)
上面三种注解可用@Component替代
@Autowired(使用在字段上根据类型依赖注入)
@Qualifier(结合@Autowired一起使用根据名称进行依赖注入)
@Resource(相当于@Autowired+@Qualifier,按名称注入)
@Value(实现属性值注入)
@Scope(作用域注解,其中value属性由两种取值,包括singleton和prototype)
@PostConstruct(使用在方法上标注该方法时Bean的初始化方法)
@PreDestroy(使用在方法上标注该方法时Bean的销毁方法)
@Configuration(代表这是一个配置类,等价于之前的beans.xml,会注册到容器中)
@ComponentScan(用于指定Spring在初始化容器时要扫描的包)
@Bean(注册一个bean,相当于之前的bean标签,其中方法名相对于标签中的id,
返回值相对于标签中的class,会将返回结果存储到Spring容器中)
@PropertySource(用于加载.properties文件的配置)
@Import(用于导入其它配置类)
使用spring来实现AOP
首先导入jar包,在此集成第三方框架Aspectj
编写切面类对目标方法进行增强,可通过XML方式或注解的方式实现
AOP思想是Spring的核心,它能够将那些与业务无关,却为业务模块所共同调用的逻辑和相关业务封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性
注解实现的相关介绍:
@Aspect:作用是把当前类标识为一个切面供容器读取
@Pointcut:Pointcut是织入Advice的触发条件,可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,所以我们可通过方法名方式为此表达式命名
@Before:前置增强,在连接点方法前调用
@Around:环绕增强,可确保方法执行前后的通知可以运行
@After:最终增强,不管是抛出异常或者正常退出都会执行
@AfterReturning:后置增强,方法正常退出时执行
@AfterThrowing:异常抛出增强
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和普通Java对象映射成数据库中的记录
MyBatis的特点
支持自定义SQL,存储过程,高级映射
实现自动对SQL的参数设置
实现自动对结果集进行解析和封装
通过XML或者注解进行配置和映射,大大减少代码量
数据源的连接信息通过配置文件进行配置
MyBatis的优势
数据库的操作采用xml文件配置,解除了sql和代码的耦合
提供映射标签,支持对象和数据库ORM字段关系的映射,支持对象关系映射标签,支持对象关系的组建
提供了XML标签,支持动态SQL
MyBatis整体架构
配置文件:全局配置文件mybatis-config.xml,其作用是配置数据源,引入映射文件Mapper.xml,映射文件的作用是配置SQL语句,参数,结果集封装类型等
SqlSessionFactory:作为MyBatis关键对象,该对象实例可通过SqlSessionFactoryBuilder对象类获得,其作用是获取SqlSession对象;实例方式可通过加载配置文件获取输入流对象,然后通过SqlSessionFactoryBuilder传入获取到的输入流对象对象得到SqlSessionFactory实例
SqlSession:它是应用程序和持久层之间执行交互操作的单线程对象,完全包括以数据库为背景的所有执行SQL操作的方法,其底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句
映射器:映射器是一些绑定映射语句的接口,接口的实例是从SqlSession中获得的;一个语句既可以通过XML定义,也可以通过注解定义;即使用XML映射器和接口映射器(就是注解在Java接口方法上编写SQL语句)
MyBatis简易开发步骤:
1:创建相应数据库和表
2:创建maven项目并导入相关依赖(至少需要添加mybatis,mysql,junit依赖)
3:创建实体类和DAO的接口
4:创建MyBatis核心配置文件(配置数据库环境和导入映射文件)
5:创建映射配置文件
6:编写测试类进行测试
说明:
映射配置文件的mapper标签的namespace属性必须是映射文件(接口)的全限定名
映射配置文件的操作配置id属性的取值是dao接口的方法名
无需再写dao的实现类,只是一个接口,在映射配置文件中写sql语句来对数据库进行操作
MyBatis测试过程:
1:读取配置文件
2:创建SqlSessionFactory工厂
3:使用该工厂创建SqlSession对象
4:用创建的SqlSession来创建Dao接口的代理对象
5:使用代理对象来执行相应方法
6:释放资源
使用注解来替换XML配置:直接在Java接口方法上编写Sql语句注解来完成映射
MyBatis配置文件
properties(属性):这些属性可以在外部进行配置,并可以进行动态替换
settings(设置):这些配置影响着MyBatis的运行时行为
typeAliases(类型别名):类型别名可为Java类型设置一个缩写名字,它仅用于XML配置,意在降低冗余的全限定类名书写
typeHandlers(类型处理器):MyBatis在设置预处理语句中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型
objectFactory(对象工厂):每次MyBatis创建结果对象的新实例时,它都会使用一个对象工厂实例来完成实例化工作。默认的为无参构造实例化目标类,也可通过存在的参数映射来调用带有参数的构造方法
environments(环境配置):MyBatis可以配置成适应多种环境,这种机制有助于将SQL映射应用于多种数据库中
mappers(映射器):告诉MyBatis到哪里去找映射文件,可以使用相对于类路径的资源应用,或完全限定资源定位符或类名和包名等
动态SQL
动态SQL就是根据不同的条件生成不同的SQL语句,是MyBatis的强大特性之一,在使用JDBC的过程中,根据条件进行SQL的拼接很麻烦且容易出错,MyBatis动态SQL的出现,解决了这个问题。
其通过if,choose,when,otherwise,trim,where,set,foreach标签,可组合成非常灵活的SQL语句根据不同需求来设计不同的动态SQL,具体可以参考官网的例子
if,where
当根据条件查询包含where子句一部分时,常使用if来做判断拼接生成不同的SQL来达到不同的业务需求,其常和where标签套用,解决多或少and的问题,使用where标签可以将多余的and去掉,缺少的补上
set
跟上面的where标签作用相似,如果在进行更新操作的时候,会存在末尾逗号多余的问题,使用set标签可以智能的去掉末尾的逗号
choose,when,other
相当于switch语句,寻找满足的一个条件;choose使用第一个值为true的子句,如果没有条件为true,则使用otherwise内的子句
trim
trim标签和where标签类似,但是trim提供了在添加前缀/后缀或删除前缀/后缀方面更加具有灵活性
foreach
能实现对一个集合的遍历,通常在构建IN条件语句的时候,即存在多个选择的时候
SQL片段(抽取公共的部分)
在MyBatis中通过使用SQL片段可以提高代码的重用性
MVC是一种软件架构思想,即将软件按照模型,视图,控制器来分;SpringMVC是Spring的一个子项目;SpringMVC分离了控制器,模型对象,过滤器以及处理程序对象的角色,是Spring为表示层开发提供的一套完备的解决方案。
SpringMVC的优势
SpringMVC是使用了MVC设计思想的轻量级web框架,对web层进行解耦,使开发更简洁,与Spring无缝衔接
灵活的数据验证,格式化,数据绑定机制
SpringMVC通过一套MVC注解,让POJO(普通Java对象)成为处理请求的控制器,无需任何接口,同时,SpringMVC还支持RESTFul风格的URL请求(RESTFul是设计风格,不是标准);此外,SpringMVC在数据绑定,视图解析,静态资源文件处理,框架设计,扩展性,灵活性方面都具有很大优势
SpringMVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,负责职责的分派,与Spring IOC容器无缝集成
SpringMVC核心组件
DispatacherServlet:前端控制器,负责调度其它组件的执行,可降低不同组件之间的耦合性
Handler:处理器,完成具体的业务逻辑;由DispatcherServlet把用户请求转发到Handler,再由Handler对具体用户请求进行处理
HandlerMapping:处理器映射器,DispatcherServlet是通过HandlerMapping将请求映射到不同的Handler
HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口
HanderExecutionChain:处理器执行链,包括两部分内容,Handler和HandlerInterceptor
HandlerAdapter:处理器适配器,它可以完成执行业务逻辑之前的一些预处理,数据类型转换,封装等。DispatcherServlet通过HandlerAdapter调用不同的Handler。
ModelAndView:装载了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
ViewResolver:视图解析器,DispatcherServlet通过它将逻辑视图转换成物理视图,最终将渲染结果响应给客户端
SpringMVC框架流程
1:客户端发送请求被DispatcherServlet接收
2:根据HandlerMapping映射到Handler
3:创建Handler和HandlerInterceptor
4:Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
5:DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
6:返回一个ModelAndView对象给DispatcherServlet
7:DispatcherServlet将获取的ModelAndView对象传给ViewResolver,将逻辑视图解析为物理视图View
8:ViewResolver返回一个View给DispatcherServlet
9:DispatcherServlet根据View进行视图渲染
10:DispatcherServlet将渲染后的视图响应给客户端
创建一个最简单的MVC程序的完整步骤(这里使用XML配置方式):
1:创建普通的maven项目
2:添加Web支持
3:导入SpringMVC的依赖
4:配置web.xml,注册DispatcherServlet(前端控制器)
5:编写SpringMVC的配置文件
6:添加处理器,添加处理器适配器,添加视图解析器
7:编写业务逻辑Controller
8:将编写的逻辑代码相关类交给SpringIOC容器管理,注册bean
9:写相应跳转的jsp页面
10:添加lib依赖,配置tomcat服务器启动测试
使用注解开发
@Controller注解类型用于声明Spring类的实例是一个控制器
Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能够找到控制器,需要再配置文件中声明组件扫描
还需要在Springmvc配置文件中设置支持注解驱动和和静态资源处理
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法,可用于类或方法上,其中用于类上表示类中所有的响应请求的方法都是以该地址作为父路径
RestFul风格
RestFul只是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
RestFul架构是对MVC架构改进后所形成的一种架构,通过使用事先定义好的接口和不同的服务联系起来;在RestFul架构中,浏览器使用post,delete,put,get四种请求方式分别对指定的URL资源进行增删改查操作
转发和重定向
转发是将用户对当前处理的请求转发给另一个视图获取处理请求,以前的request中存放的信息不会实效
重定向是将用户从当前处理请求定向到另一个视图或处理请求,以前的请求中存放的信息全部失效
二者区别:
1:重定向实际上产生了两次请求,转发只有一次请求
2:重定向时浏览器上的网址改变,转发时浏览器上的网址不变
3:重定向时的网址可以时任何网址,转发的网址必须时本站点的网址
在Springmvc框架中,控制器类中处理方法的return语句默认就是转发实现,只不过实现的是转发到视图
在Springmvc框架中,不管是转发或重定向,都需要符合视图解析器的配置,如果直接转发到一个不需要DispatcherServlet的资源则需要使用mvc:rescources配置
Contorller中可以方便的通过forward,redirect前缀来达到转发到其它资源的目的
配置环境:node.js,npm(node包管理器),vue-cli,webpack
开发工具:推荐使用webstorm或vscode
注:安装配置及出现的问题请自行百度;
使用webpack创建Vue模板项目,并了解目录结构
其中src目录是我们主要开发的目录,其余部分可做简要了解
1:build:构建脚本目录
build.js:生产环境构建脚本
check-version.js:检查npm,node.js版本
utils.js:构建相关工具方法
vue-loader.conf.js:配置css加载器以及编译css之后自动添加前缀
webpack.base.conf.js:webpack基本配置
webpack.dev.conf.js:webpack开发环境配置
webpack.prod.conf.js:webpack生产环境配置
2:config:项目配置
dev.env.js:开发环境变量
index.js:项目配置文件
prod.env.js:成产环境变量
test.env.js:测试环境变量
3:node_modules:npm加载项目的依赖模块
4:src:项目开发源码目录
main.js:项目核心文件
App.vue:根组件
components:公共组件目录
assets:资源目录,这里的资源会被webpack构建,用于存放一些图片
router:路由配置
5:static:静态资源目录,不会被webpack构建
6:.babelrc:ES6解析的配置
7:editorconfig:代码格式
8:gitignore:git上传需要忽略的文件配置
9:postcssrc.js:转换css的工具
10:index.html:项目文件入口
11:package.json:npm包配置文件,定义项目的npm脚本,依赖包等信息
12:package-lock.json:是最新版node支持的文件,在执行npm install时,先读取package.json中的依赖,再读取package-lock.json中的本号,从而来决定安装和更新
13:README.md:项目的说明文档
网页渲染 —— Vue UI组件库
Vue有着丰富的组件库,在此推荐一些常用的组件库,比如: Element UI,Vant,Vuetify,Vue Material 等
下面以饿了么开发的Element UI为例讲一下简单使用,具体用法请看官网
安装命令 npm install element-ui@next -save(局部安装)
然后在main.js中引入并注册
import Element from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
Vue.use(Element)
Vue组件模板:template对应html,script对应js,style对应css
src文件流程:index.html到main.js再到App.vue(根组件)
注意:一个组件下只能有一个并列的div,数据要写在return里面
引用组件三部曲
1:在要使用的组件里的<script>中用import引入
2:在这里面的components中注册
3:然后在<template>中加上组件名构成的标签对来引用
Vue常用七大属性
el:用来指示vue编译器从什么地方开始解析vue语法,相当于一个容器,跟上面的div关联
data:视图的数据抽象出来放在data中,所有的变量都要写在data里
template:用来设置模板,会替换页面元素
methods:放置页面中的业务逻辑,用来写方法
render:创建真正的Virtual Dom
computed:根据已经存在的属性计算出新的属性,当其依赖属性的值发生变化时,这个属性的值会自动更新,与之相关的DOM部分也会同步自动更新
watch:监听data中数据的变化,只要数据发生变化的时候,都会自动执行对应的方法
路由
1:使用命令安装路由模块 npm install vue-router --save-dev(局部安装)
2:要想使用路由,就要在main.js文件中引入vue-router路由模块
import VueRouter from ‘vue-router’
一般情况下,我们都会在router文件夹下的index.js文件中配置路由,故我们需要在该文件下引入,
而在main.js中只需引入router/index.js文件即可
3:使用VueRouter路由模块 Vue.use(VueRouter)
给页面添加动态数据
每个应用基本上都会请求外部数据以动态改变页面内容,可使用vue-resource库解决
安装命令 npm install vue-resource -save(局部安装)
在main.js中引入并注册
import VueResource from 'vue-resource'
Vue.use(VueRescource)
由于webpack打包的时候无法识别并转换成js,所以需要配置才能读取css和字体文件
安装命令:
npm install style-loader --save-dev
npm install css-loader --save-dev
npm install file-loader --save-dev
页面跳转
在router/index.js文件中创建router实例,然后配置相关组件路由,并在main.js中注册该router实例
1:用标签跳转,to对应的是相应组件配置的path
2:推荐使用第二种,绑定响应事件,在对应方法里通过this.$router.push来完成跳转,如果仅仅只需要跳转,对应参数为跳转组件的path
跳转并传值
在开发过程中,常常需要在不同页面之间进行数据传递,组件之间可能是兄弟关系或父子关系
同样可以通过this.$router.push来完成传值
1:name+params,这是this.$router.push对应的两个参数,第一个是对应跳转页面配置的name,
第二个是要传递的数据对象(注:path不能与params同用
2:path+query,同样也是对应的两个参数,第一个是跳转页面配置的path,第二个也是传的参数对象
因为穿过来的参数都是对象的形式,故第一种可以用this.$route.params.来引用,后面跟对应的参数名,
第二种同理可用this.$route.query.来引用
重定向,别名和子路由嵌套
在路由配置时有很多可选的属性,其中常用属性有:
name:路由名称
path:配置路径
components:命名视图组件
props:路由组件传递参数
redirect:重定向,url被替换,默认跳转
alias:路由别名,可以自由的将UI结构映射到任意的url,而不是受限于配置的嵌套路由结构
children:对应的值为嵌套一个子路由的配置
配置跨域和代理设置
在vue前端开发时,通常都会请求后端,这时就需要解决跨域问题
在config/index.js的proxy中配置
1:target是要代理的域名,必须加上http
2:changeOrigin设为true
3:pathRewrite中用’/api’代替target里面的地址,组件中调用接口直接使用’/api’代替
Axios配置及使用
Axios是一个基于promise的可用在浏览器和node.js中的异步通信框架,主要作用是实现AJAX异步通信
promise:一个对象用来传递异步操作的信息,本质是分离异步数据获取和业务
安装命令:npm install axios
main.js中添加:Vue.prototype.$axios=axios
在main.js中添加一个原型属性$axios指向axios,后面可直接通过this.$axios就能执行axios方法了,
从而避免重复引用axios
然后在在new的vue实例中注册
访问后端接口并请求数据
在相应位置绑定事件,在对应方法里通过this.$axios.get(url).then((response)=>{数据处理})来访问
后端接口并获取对应的请求结果
1:url是后端接口的访问地址
2:response是从后台拿到的结果,可通过response.data来获取具体的数据
3:数据处理部分是拿到这部分数据的业务处理逻辑,拟写相应的功能代码
安装配置:基于python环境,使用pip命令来安装django;
开发工具:推荐使用pycharm
项目目录结构
安装django后,使用django管理工具django-admin来创建项目,并了解项目目录结构
manage.py:位于最外层,该项目的项目管理器,提供了很多命令用来管理项目,比如
runserver命令用于启动项目
init.py:空文件,其作用是声明testblog为一个独立的模块
settings.py:全局配置文件,各种路径,国际化,debug,模板等均在此文件中配置
urls.py:路由关系,设置每一个用户的URL映射
wsgi.py:协议,web通信socket都要实现这个协议才行
app目录结构:
migrations:数据库迁移的文件
admin.py:该应用后台管理系统配置
apps.py:app配置
models:数据模块
tests:自动化测试模块,在此编写测试脚本
views:视图函数集,执行响应的代码所在模块
连接数据库(以Mysql为例)
下面以pymysql为例,也可以通过mysqlclient来连接mysql
1:使用pip命令安装pymysql
2:在settings的DATABASES修改设置连接,包括连接的数据库名,用户名,密码,ip和端口号
3:在项目的init.py文件中通过以下语句引入模块进行配置
import pymysql
pymysql.install_as_MySQLdb()
4:通过django-admin命令来创建一个app目录,并在settings.py文件中声明
5:可在新建的app目录下的models.py文件中添加相应的表结构等
6:然后使用命令python manage.py makemigrations生成迁移文件
7:接下来通过命令python manage.py migrate在数据库中创建相应的表结构
url和视图函数
1:url配置实质上是url模式以及要为该url模式调用的视图函数之间的映射表
2:url配置格式 :url(正则表达式,views视图函数,参数,别名)
其中:
正则表达式:url路径的正则
views视图函数:通常为一个视图函数或一个指定视图函数路径的字符串
参数(可选):要传递给视图函数的默认参数
别名(可选)
3:完成一个接口调用实际上就是完成了一次http请求,一次完整的http请求包含:请求+响应,
其中HttpRequest为请求对象,HttpResponse为响应对象
(1):HttpRequest 是 django 接受用户发送过来的请求报文后,将报文封装到 HttpRequest 对象中去
(2):HttpResponse 返回的是一个应答的数据报文。render 内部已经封装好了 HttpResponse 类
(3):因为处理的是web请求,所以视图的第一个参数必须是 HttpRequest 请求对象
4:因为视图函数处理的是一个request对象,故我们可用request.属性的方法来查看具体信息
常用属性:
path:表示提交请求页面完整地址的字符串,不包括域名
method:表示提交请求使用的HTTP方法
GET:一个类字典对象,包含所有的HTTP的GET参数的信息
POST:一个类字典对象,包含所有的HTTP的POST参数的信息
5:视图函数在处理完相关逻辑后,也需要返回一个响应对象HttpResponse给浏览器
HttpResponse常用属性:
content:返回的内容
status_code:返回的HTTP响应状态码
content_type:返回的数据的MIME类型,默认为text/html。浏览器会根据这个属性,来显示数据。如果是text/html,那么就会解析这个字符串,如果text/plain,那么就会显示一个纯文本。
常用的Content-Type如下:
text/html(默认的,html文件)
text/plain(纯文本)
text/css(css文件)
text/javascript(js文件)
multipart/form-data(文件提交)
application/json(json传输)
application/xml(xml文件)
注意:根据需要,返回不同类型的数据,如果返回类型不是字典,需要传入第二个参数:safe=False
路由配置:
1:path转换器,格式为<转换器类型:自定义名>
作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数
故视图函数要有相应的形参与之对应
四种基本转换器类型:str,int,slug,path,也可根据需要自定义转换器类型
2:re_path正则路径
需要自己手动添加正则首位限制符号
正则路径中的无名分组按位置传参,相互对应
正则路径中的有名分组,格式:(?P<组名>正则表达式),有名分组按关键字传参,与位置顺序无关,
并且视图函数中的形参名称要与 urls 中的组名对应
路由分发
由于Django项目里多个app目录共用一个urls容易造成混淆,后期维护也不方便,故而使用路由分发,让每个app目录都单独拥有自己的 urls
1:在每个app目录里都创建一个urls.py 文件
2:在项目名称目录下的urls文件里,统一将路径分发给各个app目录
从django.urls引入include:from django.urls import include,然后用include来分发
3:在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转
4:在各自 app 目录下的 views.py 文件中写各自的视图函数
使用ORM模型类操作数据库
1:在相应应用下的models.py文件中创建模型类(继承models.Model)
2:一个模型类对应数据库中的一张表,类中的每个属性对应数据库中的字段,类实例对应于表中的一条记录(即元组)
3:通过命令 python manage.py makemigrations 生成迁移表
4:通过模型的管理器对象objects来实现数据库操作
(1):创建数据中每一条记录就是创建一个数据对象,通过模型类.objects.create(属性名1=属性值1,属性名2=属性值2…)来实现,成功则返回创建好的实体对象,失败则抛出异常;也可以创建模型类实例对象,然后调用save()进行保存
模型类常用字段类型:
BooleanField: 布尔类型字段
CharField: 字符串类型字段
DateField: 日期字段
IntegerField:整数字段
FloatField:(浮点数)小数字段
TextField:文本字段
DateTimeField:日期时间字段
(2):数据库中操作最多的就是查询,可通过模型类.objects.方法来查询相应结果,常用的查询API有:
all():查询所有结果
filter(): 它包含了与所给筛选条件相匹配的对象
get(): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误
values(): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
model的实例化对象,而是一个可迭代的字典序列
order_by(): 对查询结果排序
distinct(): 从返回结果中剔除重复纪录
count():返回数据库中匹配查询(QuerySet)的对象数量
exists(): 如果QuerySet包含数据,就返回True,否则返回False
(3):修改数据库中表的记录,通过模型类.objects.filter(筛选条件).update(属性名=修改值)来实现
(4):删除数据库中表的记录,通过模型类.objects.filter(筛选条件).delete()来实现
补充:除了以上的数据库基本操作之外,还有分组查询与聚合查询和F查询与Q查询等方式操作数据库
配置环境:JDK(Java开发环境),SDK(提供Android开发组件)
开发工具:推荐使用Android Studio
了解Android项目目录结构
我们开发主要基于app目录下进行,其余部分可简要了解
.gradle和.idea:项目自动生成的一些文件,无需我们手动编辑
build:主要包含了一些在编译时自动生成的文件
gradle:Android开发使用Gradle来构建项目,这是一个很庞大的体系,该目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle
.gitignore:这个文件是用来将指定的目录或文件排除在控制版本之外的
build.gradle:这是项目全局的gradle构建脚本,通常不需要修改;
gradle.properties:这是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本
gradlew和gradlew.bat:这两个文件用来在命令行界面中执行gradle命令,其中gradlew是在Linux或
Mac系统中使用的,gradlew.bat是在Windows系统中使用的
local.properties:该文件用于指定本机中的Android SDK路径,通常内容都是自动生成的,不需我们手动修改
settings.gradle:该文件用于指定项目中所有引入的模块
接下来开始讲解app目录结构:
build:这个目录和外层的build目录类似,但它更复杂,主要也包含一些在编译时自动生成的文件
libs:放置项目中使用到的第三方jar包,如未自动加载,请手动添加到构建路径里去
AndroidTest:用来编写Android Test测试用例,可对项目进行一些自动化测试
java:放置所有java代码的地方
AndroidMainfest.xml:这是整个项目配置文件,在程序中定义的所有四大组件都要在这个文件里注册
test:用来编写单元测试用例的,也是自动化测试的另一种方式
.gitignore:跟外层.gitignore文件类似
build.gradle:这是app项目的构建脚本,这个文件中会指定很多项目构建的配置
proguard-rules.pro:用于指定项目代码的混淆规则
res目录结构:
drawable:存放图片 layout:存放布局文件
mipmap:存放应用图标 values:存放字符串,样式,颜色等的配置
数据库
数据库部分推荐使用Android自带的嵌入式数据库SQLite
该数据库推荐使用Android Studio自带的动态数据库工具Database Inspector来管理,或使用其它可视化工具,比如:SQLite Studio或SQLite Expert来动态管理
操作SQLite数据库三个核心类
SQLiteOpenHelper(主要用于创建或打开一个数据库,即管理数据库)
1:创建子类继承SQLiteOpenHelper抽象类,并重写onCreate,onUpgrade两个抽象方法;
2:写构造方法,通常指定上下文对象和数据库名称两个参数,对象游标和版本号可通过定义常变量来指定;
3:如果数据库文件不存在,SQLiteOpenHelper在自动创建数据后会调用onCreate方法,在该方法中一般需要创建表,视图等组件,在创建数据库前一般是空的,因此不需要先删除数据库中的相关组件;
4:如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用
onUpgrade方法,调用该方法后会更新数据库的版本号。在onUpgrade方法中除了创建表,视图等组件外,还需要删除这些相关的组件;
SQLiteDatabase(主要用于执行SQL语句);
1:创建一个数据库对象
2:通过getWriteableDatabase方法或getReadableDatabase方法获得一个操作数据库的对象
3:然后通过execSQL或rawQuery方法来执行SQL语句,前一个用于增,删,改,后一个用于查询
Cursor(主要用于获取询结果并处理);
1:Cursor光标最初是指向属性行(即第一条记录的前一行)
2:通过moveToNext方法来向下移动,以获取所有查询结果并处理单个属性值
3:通过cursor.getType(cursor.getColumnIndex("列名”)来获取当前行某列的值,并转换成目标类型
4:curson还有很多方法,具体情况具体处理,上面列举的是常用方法
Activity
作为Android组件中最为基本也是最为常用的四大组件之一;
一个Activity通常是一个单独的窗口;
一个界面需要一个Activity,界面不等价于Activity;
Activity之间通过Intent进行通信;
Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件;
Activity创建三部曲
新建类继承Activity或其子类;
在AndroidManifest中声明注册;
创建layout并在Activity的onCreat中通过方法setContentView来设置;
Activity之间的跳转:通过Intent这个消息传递对象来实现不同页面之间的跳转,包括显示跳转和隐式跳转,下面列举一种最常用的显示跳转;
Intent inter = new Intent(MainActivity.this, NextActivity.class);
startActivity(inter); //从当前页面(MainActivity)跳转到NextActivity页面;
多层页面跳转可以通过Intent数组来实现,数组每个元素为不同页面之间消息传递对象,可通过上面列举的方式来获取(startActivities(intents));,也可以在下一个Activity继续设置跳转来实现多层跳转;
Activity之间的传值:
(1):直接使用putExtra来进行数据的传递,参数以键值对的形式存在,第一个是键名,第二个是键值;
(2):使用其底层实现,先通过Bundle来包装数据,再使用putExtra来进行数据传递
Acitivity跳转参数回调三部曲
1:A-Activity首先传递数据跳转到B-Activity
(1)创建Intent对象,通过putExtra方法传递相应参数
(2)然后调用startAcitivityForResult方法,第一个是参数是当前Intent对象,第二个参数是
请求标识
2:B-Activity接收A-Activity传过来的数据,处理完的数据setResult要带着请求标识,为了跟
传过来的请求标识区分
3:最后在你需要处理返回数据的界面进行重写onActivityResult方法来获取数据
Service
长期运行在后台,没有用户界面的应用组件,即使切换到另一个应用程序或后台,服务也能正常运行
Service运行在主线程中,当某个应用程序杀掉时,所有依赖于该进程的服务都会停止运行
所有程序默认运行在主线程中,需要在服务内部手动创建子线程
拥有自己的生命周期,不会被捆绑,即便Activity销毁之后,Service也不会被销毁
适用场景
1:下载网络数据(该功能应在子线程中启动服务)
2:播放音乐
3:访问文件,数据库等一些业务逻辑功能
创建服务
创建类并继承Service,并重写父类的onCreate()、onStartCommand(),onDestroy()和onBind方法
在AndroidManifest.xml中进行注册(四大组件都需要注册)
在Activity中启动服务的两种方式:startService(启动服务),bindService(绑定服务)
启动Service的方法和启动Activity很类似,都需要借助Intent来实现,同样可以在Activity中绑定
事件来启动或停止Service
onCreate()方法只会在Service第一次被创建的时候调用,再次startService()的时候,就只会执行onStartCommand()
启动Service之后,就可以在onCreate()或onStartCommand()方法里去执行一些具体的逻辑了
Sevice与Activity通信
服务的两种通信方式:本地服务通信和远程服务通信
通过onBind方法与Activity建立关联
Service和Activity进行通信指前台页面(Activity)可以调用后台服务的方法,实现步骤是和普通服务实现步骤是一样的,区别在于启动的方式和获得Service的代理对象
1:创建服务类,这里和普通Service不同,在onBind中返回一个Binder 对象,Activity可以获取该Binder 对象从而执行后台服务的方法.
2:新增一个类继承Binder类,在里面写具体方法,实现具体功能
3:修改相应布局以完成操作
4:在目标Activity实现ServiceConnection类,并重写onServiceConnected和onServiceDisconnected这
两个方法,分别在绑定成功和进程崩溃的时候调用;如果绑定成功了,第二个参数IBinder正是我们新建服务类中onBind方法的返回值,我们可以通过这个返回值来向服务传递数据
5:通过调用bindService来绑定服务,需要三个参数,第一个是Intent对象,第二个是刚获得的ServiceConnection连接对象,第三个是标志位
6:也可以通过unbindService来解绑服务,只需要传递ServiceConnection连接对象
Service的生命周期
1:在项目任何位置调用Context的startService方法,相应服务就会启动,并回调onStartCommand方法;
如果该服务未被创建,onCreate方法会先于onstartCommand方法执行;服务启动后就会一直保持运行
状态,直到stopService或stopSelf方法被调用
2:还可以调用Context的bindService来获取一个服务的持久连接,这是就会回调服务中的onBind方法,
同理,如果该服务未被创建,onCreate方法会先于onBind方法执行;然后便可以获取到onBind方法里
返回的IBinder对象实例,自由的与服务进行通信了;只要未解绑,服务就会一直保持运行状态
Broadcast Receive
广播接收器用于响应来自其他应用程序或者系统的广播消息,Android提供了一套完整的API,允许应用程序自由
的发送和接收广播,是一个全局的监听器
广播接收器有着广泛的应用,比如:当电话呼入这个外部事件到来时,可以利用广播接收器进行处理。当下载一个程序成功完成时,仍然可以利用广播接收器进行处理
广播发送者和广播接收者的执行是异步的,即广播发送者不会关心有无接收者接收,也不确定接收者合适才能接收到
创建广播接收器:广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息,并可在该方法中实现具体的逻辑
1.广播接收器接收到相应广播后,会自动回调 onReceive() 方法
2.一般情况下,onReceive方法会涉及与其他组件之间的交互,如发送启动Service等
3.默认情况下,广播接收器运行在UI线程,因此,onReceive()方法不能执行耗时操作,否则将导致ANR
在AndroidManifest.xml中注册广播接收器来监听制定的广播意图(静态注册),也可以在onCreate方法里创建
IntentFilter实例,添加相应的action,实现动态注册
动态注册的广播接收器最后一定要取消注册才行,可在onDestroy方法中通过调用unregisterReceiver方法实现
动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。尽管app本身未启动,该app订阅的广播在触发时也会对它起作用
广播自定义意图:若想在应用程序中生成并发送自定义意图,就要在相应活动类中通过sendBroadcast()来创建并发送这些意图,从而将它们自己的Intent广播给其他应用程序
Content Provider
Content Provider通过请求从一个应用程序向其他的应用程序提供数据,数据可以被存放在数据库,文件,甚至是网络
内容提供者被实现为类 ContentProvider 类的子类,需要实现一系列标准的 API,以便其他的应用程序来执行事务。
1:当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问
2:其它应用需要使用ContentResolver来调用ContentProvider的方法
3:它们之间的调用是通过URI来进行交流的
创建Content Provider
1:继承类 ContentProviderbase 来创建一个内容提供者类
2:定义用于访问内容的你的内容提供者URI地址
3:创建数据库以保存内容。Android 常使用 SQLite 数据库,并在框架中重写 onCreate() 方法来使用 SQLiteOpenHelper 的方法创建或者打开提供者的数据库。当你的应用程序被启动,它的每个内容提供者的 onCreate() 方法将在应用程序主线程中被调用
4:在 AndroidManifest.xml 中注册创建的内容提供者
需要在类 ContentProvider 中重写的一些方法和相关API:
onCreate():当提供者被启动时调用。
query():从客户端接受请求,结果是返回指针(Cursor)对象。
insert():向内容提供者插入新的记录。
delete():从内容提供者中删除已存在的记录。
update():更新内容提供者中已存在的记录。
getType():为给定的URI返回元数据类型。
UI控件及布局
Android提供了很多的UI控件,每个UI控件也对应很多属性,在此不做过多赘述
基本布局有:线性布局LinearLayout,相对布局RelativeLayout,约束布局ConstraintLayout
表格布局TableLayout,网格布局GridLayout,绝对布局AbsoluteLayout,层布局FrameLayout
其中用的最多的是前三种布局,每种布局都有很多属性,每个属性都有一些不同的属性值,从而来合理调控页面效果,布局时尽量使用百分比布局或使用内置的一些不因机型不同而造成不同效果的属性值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。