Springboot 网站开发的框架
Spring官网:www.spring.io
Spring项目初始化:start.spring.io
官方文档:docs.spring.io
Core Container(不求甚解,边学边了解)
Beans:类
Core:ioc
context:上下文相关
SpEL:表达式语言
上图左上角数据访问层,OXM是xml的映射
pom文件里面描述了各种依赖的jar包
项目结构目录中:
(资源目录下)
templates:模板会放在这里
static:静态的目录,js,css,图片
application....:配置文件
controller:入口,解析参数,字段什么的
model:
service:取出相关信息,通过调用底下Dao层
每个网址都是个URL,相对应的每个url在后台有处理的函数
路径里的参数可以通过注解@PathVariable解析到变量里去,通过@RequestParam把key和type解析出来了
@RequestParam(value = "type", defaultValue = "1") int type, @RequestParam(value = "key", defaultValue = "zz",required = false) String key)
url中没写key的时候,默认就“zz“了。去掉defaultValue,那就默认null了.
入口定义一个@controller的类,@RequestMapping写好路径的映射的以及处理的函数,@ResponseBody就能返回字符串,如果路径比较复杂,可以用两种方式解析出来:
1.路径里的变量
@RequestMapping(path = {"/profile/{groupId}/{userId}"})2.通过请求里的变量
@PathVariable("userId") int userId, @PathVariable("groupId") String groupId, @RequestParam(value = "type", defaultValue = "1") int type, @RequestParam(value = "key",defaultValue = "zz",required = false) String key
Http Method
get请求:所有打开网页获取信息,get获取接口信息
head:紧急查看http的头
post请求:向网页写入东西,比如发帖,post提交数据到服务器
put:支持幂等性的post,即若指令执行的时候,如果服务器异常等原因,执行两次,结果会是一样的。比如在发帖,网络断掉了,浏览器就会重发,服务器收到两次,实际结果会是一样的
delete:删除服务器资源
opition:查看支持的方法
一般网站只用get和post,代表获取和更新,html的form仅支持get和post
在pom.xml中引入了这个工具,不管改post还是get都可以直接编译了
<artifactId>spring-boot-devtools</artifactId>
模板
实际的网站开发中,返回的页面是很复杂的,并不是简单的几个字符串,这个时候就可以返回渲染的模板
Parse: #parse("header.html")
Include: #include("header.html")当使用parse会把变量解析出来,而使用include只会纯粹的把文本包括进来,不做模板解析一般放在头尾,把公共部分直接引用
velocity模板语言基本语法(类似java语法)
request/response
request:参数解析,cookie读取,http请求字段,文件上传
response:页面内容返回,cookie下发,http字段设置,headers
几个核心方法:
重定向:
301:永久跳转
302:临时跳转
Error:
IOC:控制反转
一般我们写代码,会涉及到很多对象,自然也会有它们的初始化。传统模式,我们会在main方法中定义一个主对象及其初始化,定义一个对象,再定义它依赖的对象。会有各种各样的对象,不可能在一个地方做好所有对象的初始化。IOC的方法,则会把对象都构造好,再通过依赖注入的方式联系起来。比如定义一个WendaService,里面有方法是一些后台的服务。几个controller都要调用,一般我们在每个controller new一个它的对象。在spring中,先定义好这个service,@service,可以依赖注入到任何地方,需要使用的时候就不用自己去初始化了,@Autowired自动装配了注入进来。有点在于实现了模块间的解耦,分工合作的时候只需要谈好,需要什么样的service,接口,写好之后另一个直接使用,不用考虑初始化问题。听过注解表示,这是一个来自bean池的对象的初始化。
AOP:面向切面编程
比如我们有很多的业务,而AOP就是说,在所有的页面都想插一刀,处理所有的服务。
比我我们建一个aspect包,打上@aspect注释,表示这是一个面向切面的编程,然后定义一个方法,实现一个这样的功能,对controller中的某个方法调用之前都调用一次这个方法,某个放大调用之后再调用这个方法。
*********补一个看到的讲的不错的~~
链接:https://www.zhihu.com/question/24863332/answer/48376158
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。