hello
发表于2021-04-09更新于2021-05-06字数统计0阅读时长1分
接下来我将以:
1 | n月份~6月份 |
这个时间段,是铁定的基础阶段,当然这个基础阶段是要打上引号的!所谓的基础阶段,并不是单纯地看本科阶段所学科目的书!而是从->本科书->到名师基础班的过渡。
也就是说,这个阶段最重要的事情就是:打好基础!越牢越好,切忌好高骛远,埋头苦干。
我复习的时候,看的老师:
基础阶段我建议,先看高等数学、线性代数的书,入门知识过一遍。能够掌握做课后习题的方法即可!不要做太难的题。
再看完高等数学、线性代数的书后,可以开始进入真正的考研数学基础班了。
还是建议数学汤家凤基础阶段紧跟!
值得一提的是,我非常建议
1 | 买汤家凤老师的《接力题集1800》 |
对的,必买!!!
汤老师在课程中,会讲数学一、数学二、数学三的公共部分!
对于数学科目的独属部分以及题集的部分讲解,会在公众号以直播的形式播出!
给出自己基础阶段的复习方法:
高等数学跟汤家凤老师,线性代数跟李永乐老师即可。
☆ 第一、看对应的汤老师视频课程,但不要看多了,建议是看数集视频(看自己的状态)然后立马投入到1800题集的题海中!
过完一章后,最好是看看这一章学到了什么?可不可以以笔记的形式过一遍。
☆ 第二、《接力题集1800》,一定要关注、标黑错题。错题是很有价值的,到底自己是错在哪里?
详细看看答案,为什么汤老师要这么写?
如果不知道,那么,看了答案后,下次是否能够同步汤老师的思维! 看到该类型的题,就要想起:
1 |
|
为数不多还遗留下来的笔记了!
这个阶段不是很困难,但是一定要养成基本的解题素养!要知道常见的题型,以及常见的解法!
长时间的 Deliberate Practice(刻意练习) 即可!重复重复再重复。
第三、线性代数我想特别说明:
由于线性代数的抽象性!导致我们看了老师的课程内容 != 我们会做对应的题目,
这个时候我们要反复地看书、经典的例题!!!
这个阶段就是决定自己到底能不能在数学科目有所突破!有所成长的关键时候了。
对,这个阶段要做大量的题,高难度的题,综合的题
请注意!我这里说的难题,是指贴合考研数学考场难度的题目
这个阶段我推荐:
1 | 汤老师的 《接力题集1800》强化篇 (除开基础篇即可) |
☆ 强化班:听武忠祥老师的课程!!!
☆ 强化班:听线性代数,李永乐老师的课程!!
其他阶段的课程我不建议反复听,但是:
强化班的课程很有必要反复听!!!
听课的同时,一定要加强自己计算的能力!速度,准确度!
强化班不是基础班,是真正要上战场的预备课!练习的题目也都是大量高于考场的题目,不要畏难!
这个阶段是绝对适合做高难度的题目的。
很有必要在这个阶段提一嘴!所谓的多种方法,其实在考场上是不适用的。
let’s put it another way,也就是说你会什么方法,就用什么方法解题。熟悉自己的解题方法,熟练自己的解题方法即可。
在大量方法的灌输下,国庆节之后,我们可以开始做套题了!
☆☆☆☆☆ 李林老师的四套卷、八套卷
☆☆☆ 汤老师的卷子(不做参考,因为部分题源是1800题集上的题目)
其他的卷子没有做过..不予评价
请千万记住,不能按照自己做模块题目的思路去做题,一定要强迫自己在规定的时间2~2.5h内做完卷子!!
请千万记住,做卷子的目的不是,所有的题目都要做出来!而是拿到对于这张卷子,自己能拿到的分数!
否则,只会懊悔自己,为什么自己的分数不如自己所愿!
就像我的好研友李总说的那样,你上岸又不是一定要数学150分!
说的很好,每个人对数学的理解能力不同,要求自己做对能做对的题目(这点很重要)
对于实在不会或者算不出来的题目,字迹要工整、思路要清晰,是老师给你评分,不是你自己的思路给你自己评分!
一定要老师知道,你每一步的意义。老师也是 按点给分,按步骤给分!
同时,如果有条件。可以看看数学张宇老师的《闭关修炼》,为的是拓展自己的数学思维!
注意!越是临近考试,越不能放弃考研数学的本质!刷题。结合强化阶段的题目以及做套题的错题
考研数学真题>模拟套题
刷题最开始的阶段,请选择 x年到2010年,x为自己决定起点年份的卷子!
对于近年的真题卷子,一定要珍惜不能浪费!
那么,到了最后的冲刺阶段:
是一定要多看李林老师的《四套卷》、《六套卷》
By the way 直到考试前的早上!我还在看六套卷的选择题。结果你懂的
上考场的具体答题顺序建议:高等数学、线性代数的顺序做题方式。
请注意,必须引入JQuery
CDN代码如下:
1 | <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> |
请注意GET方法一般用于从后台中获取数据,而不是提交数据
默认是GET方法,速度很快。但是由于数据将直接以localhost:8080?data1=111&data2=222的形式
出现在浏览器的地址栏中,
因而Get方法一般不用于:敏感、隐私的数据传输
1 | var id = $("input[name='editor']").val() |
与Get方法不同的是,Post方法一般用于向服务器提交数据。而不是获取数据!
因此,我们可以将需要隐私处理的数据以POST方式以服务器交互:比如账户密码,业务逻辑数据等等
1 | var username = $("input[name='username']").val() |
1 | public void fun(String username, String password) |
UserController.java
1 | public void fun(User user) |
User.java
1 | public class User{ |
关键代码
1 | data:$("#form").serialize(), |
解释:
给网页中的form表单一个id=”form”
在进行AJAX请求时 找到这个表单
对这个表单中的数据进行序列化serialize()
注意:后台用对象User来接收,并且前端name中的值需要与Bean对象User中的private属性一一对应
1 | $.ajax({ |
在命令行中输入
1 | vue ui |
修改以下参数
创建完之后就可以了。
打开IDEA->导入项目….
项目结构图如图所示:
通过结构图我们可以知道:
具体含义,如图所示:
1 | <template> |
在上述代码中,我们可以看出router-link标签负责导航栏 to表示导航路径
而具体的路径配置是交给项目结构中的
router下的index.js来配置
index.js中的关键代码如图
import代表从那个vue页面中导入相关组件
而在routes中具体配置相应的路径,名字,以及组件的名字
而对于VUE3.0,我们建立导航可以用新的写法:
import语句可以省略,除了写path与name参数之外,
我们的component参数可以变成:
1 | component:()=>import('../views/About.vue) |
添加以下依赖:
1. Lombok
2. Spring Web
3. Spring Data JPA
4. MySQL Driver
以上四个依赖
1.资源文件中添加数据库文件连接信息:
1 | spring: |
值得注意的是,类中的每个属性,在首字母小写后-必须等于数据库表中的字段名
1 | import lombok.Data; |
1 |
|
(其中User是对应的类 Integer是主键)利用这种方法,可以避免写一些比如1.查询一条数据2.查询全部数据3.根据主键查询数据…
已经封装好了 常见的DAO层操作
1 |
|
1 | import org.junit.jupiter.api.Test; |
值得注意的是 注解@Service应加在实现类上
1 | import com.example.demo.entity.User; |
1 | import com.example.demo.entity.User; |
1 | import com.example.demo.entity.ApiResponse; |
值得注意的是:@RestController = @Controller + @ResponseBody后台从数据库中查询到的数据
以XML或者JSON的格式,返回给前端。
由于我们修改了SPRINGBOOT的端口为8181 而VUE默认是8080因此,我们需要对SpringBoot做一个配置!
1 | import org.springframework.context.annotation.Bean; |
到此为止,后台的代码基本算是完成了!
接下来开始编写
修改App.vue文件中的template标签为
1 | <template> |
同时在router文件夹中的index.js文件中 配置router导航映射(见文章前部分内容!)
第一种方式:适用于VUE2(显式声明)
1 | import User from '../views/User.vue' //建立VUE页面与组件的映射 |
第二种方式:建立隐式映射
1 | //注释掉上方的import User from '../views/User.vue' |
在views文件夹下创建User.vue文件:
1 | <style scoped> |
首先,在命令行中输入
1 | vue add axios |
然后找到项目结构图中的plugins文件夹下面的axios.js
粘贴以下代码:
1 | ; |
1 | <script> |
1 | <template> |
到此为止。一个简单的查询数据库所有数据的请求就完成了
项目效果图如下:
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 | const app = Vue.createApp({}) |
Vue的编程设计模式应该叫做mvvm的设计模式。什么叫做mvvm?它首先是面向数据的编程,程序中定义了数据,然后定义了模板,Vue就可以把数据和模板自动进行关联。最后挂载到真实的DOM上,展示给用户。
1 | mvvm解释: 第一个m代表model数据,第一个v代表view视图,最后两个字幕vm代表viewModel视图数据连接层。 |
1 | <script> |
model数据,是我们自己定义的,view模板也是我们自己定义的,但是vm是Vue自动给我们关联的。
当我们明白了什么是mvvm后,你就知道为什么我们给根组件起名vm了。
当我们获取了vm根节点后,其实就可以操作里边的数据了。比如在控制台中输入下面的代码:
1 | vm.$data.message = 'vincent' |
如果在app里 我们使用this指针操作data数组中某个变量
说起自动执行函数,还要从被动执行函数说起。比如给网页某一个元素一个点击事件:
1 |
|
在面向数据编程中,此时给该按钮加入点击事件。只有当该按钮被点击时,事件才会被触发。这就是被动函数的概念!
而对于自动执行函数..不需要相应的点击事件才触发
1 |
|
在网页加载完成后,自动进入mounted函数中,即自动执行里面的代码块。
那么,现在用具体的例子来演示一下这四个基本周期函数吧:
1 |
|
浏览器的控制台:
可以看到:执行流程是: beforeCreate -> created -> beforeMount -> mounted
这两个周期函数是在VUE中的data数据发生变化时,才会被执行,一个是在变化之前,一个是在变化之后。
用一个改变data中变量message的值的例子来说明:
1 |
|
这两个生命周期函数是在VUE销毁时自动执行的函数,一个是销毁前执行,一个是销毁后执行。
beforeUnmount(): 当VUE应用失效时,会自动执行。
unmounted():当VUE应用失效,且DOM完全销毁之后,会自动执行。
代码演示如下:
1 |
|
可以看到,页面在调用unmount函数前后,控制台会打印:
在app.unmount()函数执行后,在beforeUnmount()方法里,DOM还是有内容的,然后到了unmounted方法中,就已经没有任何的DOM内容了。
记住八大生命周期,可回想安卓中的生命周期函数!
各有两个un-XX与xx-ed
如图所示:
在之前的代码类似 content 这种,正确叫法是 插值表达式 当然也可以叫做 字面量
JSP中从后台SpringMVC中的ModelAndView中存储的数据 利用EL表示JSP网页取值一样
1 | <script> |
在以上代码中,我们利用面向数据编程的插值表达式 在模板template当中显示出data数组中的数据。
但有时可能我们需要显示的一些数据变量,中含有HTML标签,我们想在网页中以标签的形式显示出来而不是字符串的内容(即不会把<>这样的内容也显示出来),这样我们就需要用到 v-html=”message” ,需要注意的是,我们需要用多行代码块`而不是单行代码块”
具体代码如下:
1 | <script> |
在模板template中引用的data数据,被绑定到模板对应mount挂载的网页区域中。当data中的数据发生改变时,对应网页中显示出来的内容也会发生改变。这就是双向数据绑定,而有时我们只需要这样的数据,让它只在第一次渲染出来,而之后不再跟随data中的数据的值变化而变化。这样的思想,我们可以用v-once属性完成!
代码如下:
1 |
|
在上述代码中,我们无论点击多少次按钮,带有v-once属性的div中的字面量数据,绝对不会再次渲染新值
比如我们要实现这么一个功能:这里有一个灯(不是开着的,就是关着的),我们利用嵌入JS代码至插值表达式中,实现开关灯。
1 | <script> |
在某些情况下,我们需要这种“非真即假”的场景,来为我们改变一些元素的状态!
假设我们data数组中有message这个数据,而我们想要某个元素有一个title属性,同时这个title的值为message的值。(联想我们插入HTML标签,而不是标签变成了字符串)
代码如下:
1 | <script> |
此时我们将鼠标移到对应的数据内容上,悬停出来的内容即为title,而title的值也是数据内容。说明,我们利用v-bind属性给这个元素赋值了message变量中的内容。
v-on 是用来绑定响应事件的,在之前提到:
1 | methods:{ |
现在可以利用@click来代替:v-on:click事件
也就是说 @事件=v-on:事件
完整代码:
1 | <script> |
效果图如下:
与v-on一样,v-bind也可以用来绑定属性。基本用法是:
:title=”val_name(变量名)”,即绑定title为data中的变量名。
1 | <script> |
效果图如下:
对于绑定的title属性,我们可以看成是一个动态变量parameter里面,赋值为title,title的值为相应的变量名。
所以我们可以利用这样的形式来写:
简写bind函数时,我们不用title(:title),我们把title抽离出来,看成是一个parameter变量的值
代码如下:
1 | <script> |
与属性动态绑定一样,我们可以将点击这个动作抽象成一个变量event,其值为click作为参数。对应的值不变!仍为data中的变量。
1 | <button @[event]="fun" :[name]="val">点击我弹窗显示数据</button> |
1 | <script> |
通过事件绑定,属性绑定,这样我们可以动态切换对应的事件。只需要更改this.event以及this.parameter的值
最常见的事件就是阻止表单的默认提交,比如在表单的数据还没有完全验证成功情况下。是必须阻止表单默认提交的!
通常我们的代码会像这样:
1 | <script> |
对于那些经常要做的阻止操作而言,这种方法太低效了。
因而,VUE给我们提供了一个模板修饰符,直接可以阻止默认行为,写法如下:
1 | <form action="https://www.baidu.com" @click.prevent="handleButton"> |
上述代码中:@click.prevent=”阻止之后 转而进入的事件
完整代码如下:
1 | <script> |
前面我们提到了三目运算符,结合例子说明:
1 | <script> |
当输入的数字大于10或者小于10时 都会提示
现在从这种三目运算符到v-if的过渡:
如果有这么一个场景,当输入的值为“蓝色”时,标签的背景是蓝色,如果是红色,背景是红色。
代码实现如下:
1 |
|
对应一般的方法而言,若页面重新渲染;则相应需要计算的方法,会再进行一次计算。
比如,现data数据中有val,和content两个变量;
有一个涉及val变量的方法,计算val*10的值。
现在若在普通方法中,更改同在data中的变量content,那么val变量会重新计算一遍。
现在将代码放入computed域中,现在更改content的值时涉及val的方法不会再执行
Watch译为监听,则我们可以将一些需要监听数据变化,并对这些变化作出一些操作的数据源,
放在Watch域中。而且可以获取到 改变前的值&改变后的值
1 | <script> |
现有三种样式,我们动态地引用这三个样式:
1 | .red{color:red} |
完整代码如下:
1 |
|
其中利用动态绑定:class=”className”,而在data中的变量className值代表真正的class值
因此,我们可以在控制台中修改:vm.$data.className=’green’
使得我们在style标签中的CSS样式能够生效。
在上个例子中,我们有字体颜色.red类,有背景颜色.back类
现在我们想要绑定这个DOM元素,既让它有样式.red,又让它有样式.back
则我们可以利用一个自定义对象classObject,将想要生效的样式置为true
完整代码如下:
1 | <script> |
其中,我们看到,相应的red、back样式类都为true
在之前的for循环,我们每次都是重新渲染页面:
如果有含初始数据的数组,我们只需要重新渲染“新数据”的内容
每次添加数据 我们可以避免重新渲染之前的已有数据
利用 :key=”index+item” 绑定key属性!
完整代码如下:
1 | <script> |
当我们有参数时,调用函数若想用event,
此时应用click(para1, para2 …, $event)
有时,我们可能需要同时对一个按钮绑定一个事件。并同时执行两个方法fun1与fun2
**@click=”fun1(), fun2()”**可以完成这个功能。会顺序执行这两个方法!
完整代码如下:
1 | <script> |
VUE中有六种常见的事件修饰符他们分别是:
所谓冒泡机制(就像水里面的泡泡,DOM树中的事件就像泡泡一样向上逐个被捕捉!)
比如网页结构是!
1 | <body> |
那么此时给button加的事件,会自底向上得逐个被各个标签捕获
也就是说,若给h2添加点击事件,给button添加点击事件。
最终根据冒泡机制,会执行h2的点击事件。
完整代码如下:
1 | <script> |
而我们可以用**@click.stop=”btnClick”**给下边的按钮添加,避免它往上冒泡被捕获到。
例如阻止form表单的默认提交行为。
1 | <form @click.prevent="handleButton"> |
上述代码可以避免自动form自动提交,转而转向handleButton函数
once修饰符修饰的事件,只会执行一次。
完整代码如下:
1 | <script> |
在某种场景下,我们需要按下Enter键登录&注册
我们需要在鼠标hover悬停于某个元素上方时,进行交互
这样的操作还涉及到键盘、鼠标之间的事件
在输入框中输入内容时,会触发keydown事件
完整代码如下:
1 |
|
对于特定的键Enter、Space等键有时我们会需要检测
比如实现表单的Enter提交方式
完整代码如下:
1 | <script> |
所谓数据的双向绑定,就是指:data中的变量val与页面中的字面量相互绑定
这种两方中其中一方发生变化,而另一方必然随之变化的过程,称为双向绑定
比如data中有一个变量val
1 | data(){ |
而前端页面中,输入的值赋给val
1 | template:"<input v-model="val" />" |
这样,输入不同的前端页面,data中的val也会不同!
单选框一般用字符串接收
参与单选框中的v-model对应的data中的字符串变量命名意义是:这些若干同属的类别
**比如男、女 其v-model=”gender”**这样命名
其次,应有不同的value属性值来区分这些单选框!
完整代码如下:
1 | <script> |
对于多选框的每个框要么属于checked被选中的状态 要么没被选中
完整代码如下:
1 | <script> |
对于双向绑定,当输入框绑定data中的变量content后,如果页面的某一个区域立即用到了这个content
那么在输入的过程中,页面会实时显示content的值
我们使用 v-model.lazy=”val” 来懒显示,即输入框失去焦点后,内容才会发生变化
代码如下:
1 | <script> |
默认输入的内容是字符串类型 为避免后台转换数字
我们可以使用v-model.number=”val” 来转换成输入绑定data中的变量val
代码如下:
1 | <script> |
trim属性用来消除input框输入内容前后的空格的。现在我们再字符串上输入空格,其实它会在DOM元素上进行增加空格的,这个可以在控制台清楚的看出(详细请看视频操作)。 加入trim修饰符后,Vue就会自动给我们去除前后的空格.
1 | v-model.trim="content" |
Do you really need to speak English fast? When native English speakers speak fast, the boundaries between words disappear and this gives the impression of talking fast. In reality, they are not talking faster than normal —it’s just that the sounds in their pronunciation flow together in the most smooth and efficient way.
你一定要说得快吗?当以英语为母语的人说得很快时,单词之间的界限就消失了,这会给人一种说得很快的印象。在现实生活中,他们并没有说得比平时快,只是他们的发音中的声音以最流畅和有效的方式衔接在一起。
地球上所有的自然资源是有限的。拿矿物资源来说,它不是上帝的恩赐,
而是经过几百万年,甚至几亿年的地质变化才形成的。地球是无私的,它向人
类慷慨地提供矿产资源。但是,如果不加节制地开采,必将加速地球上矿产资
源的枯竭。
人类生活需要的水资源、森林资源、生物资源、大气资源,本可以不断地
再生,长期给人类做贡献。但是因为人类随意毁坏自然资源,不顾后果地滥用
化学用品,不但使它们不能再生,还造成了一系列生态灾难,给人类生存带来
了严重的威胁。
资源是有限的,我们必须要加以珍惜,合理使用地球上有限的资源,细水
长流,方能持久!
在资源有限的前提下,人类在生产生活中,需要设计合理、优化的资源使
用方案,以满足其利润最大化的需求。
假设工程项目总数为 n,可利用的资源份额总数为 m,给每项工程投入的资
源份额数不同时,所获得的利润也不同。 其利润表如下所示:
一、请完成如下问题的求解:
■问题 1(50 分):请利用 C/C++编程实现并输出当所获得的利润最大时,
资源的投入方案。
测试用例(备注:须遵守测试用例所示范的输入、输出格式及形式要求):
备注 1:测试用例示范
测试用例 1
输入:
请输入工程项目总数 n:X↙
请输入资源份额总数 m:X↙
请输入工程项目与投入资源份额数所对应利润:(可参考问题 2 中的利润表
数据形式)
输出:
最后的决策结果为:给工程 1 投入 X 个份额,工程 2 投入 X 个份额,……,
工程 X 投入 X 个份额的资源时,可达到最大利润 XXX. (其中 X 为具体数值)
测试用例 2
输入:
请输入工程项目总数 n:3↙
请输入资源份额总数 m:8↙
请输入工程项目与投入资源份额数所对应利润:(参考问题 2 中的利润表数
据)
输出:
最后的决策结果为:给工程 1 投入 0 个份额,工程 2 投入 4 个份额,工程 3
投入 4 个份额的资源时,可达到最大利润 140.
■问题 2(30 分):当可利用的资源份额总数为 8,工程项目总数为 3 以及
利润表如下所示时,请给出资源投入最优方案的分析、计算过程。
■问题 3(10 分):分析给出所实现算法的时间复杂度;
■问题 4(10 分):请简要给出可能的进一步提高算法时间复杂度的解决
1 |
|
1 |
|
1 |
|
1 | class AbstractEmployee{ |
1 | class Employee:AbstractEmployee{ |
1 | void Employee::AskForPromotion(){ |
1 | class Developer: Employee{ |
1 | Developer::Developer(string name, string company, int age, string fav) |
注意:父类中的Name,Company,Age 在其子类Developer中都是不可获取的(Inaccessible)
因为,这些属性都是private 私有的,在类外任何地方都不能获取!
除非我们修改这些属性的修饰符 修改成protected
Spring MVC又叫SpringWebMVC是一个轻量级的基于请求响应的表现层框架。它是Spring框架的一部分。SpringMVC与Struts2都可以替代原始Servlet技术。
Spring Web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。
1、SpringMVC是极具代表性的MVC框架对初学者学习很有帮助;
a)模型(Model)封装了应用程序数据,通常它们将由Bean对象组成;
b)视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出;
c)控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染;
2、与Spring框架无缝集成;
3、对Servlet轻度封装,框架小巧轻便性能好;
4、可使用注解式开发,编码简洁;
5、便于测试;
6、具有本地化、国际化、类型转换、数据验证等功能;
7、使用人群十分广泛,在现在的企业招聘中属于java程序员必备技能之一;
1、SpringMVC框架学习:
a)了解SpringMVC框架处理流程;
b)掌握SpringMVC搭建、配置与使用;
c)Spring + SpringMVC + MyBatis 三大框架整合;
d)掌握SpringMVC基本参数与复杂参数绑定;
e)掌握SpringMVC自定义异常处理类、拦截器、图片上传等操作;
f)掌握SpringMVC处理Json格式字符串;
2、SSM框架练习项目:
a)使用整合后的SSM框架完成Steam后台游戏管理和前台游戏列表的Demo;
SpringMVC从哪获取?
以下网址可以获取Spring框架的所有版本,SpringMVC是Spring框架中的一个子包SpringWebMvc
http://repo.spring.io/release/org/springframework/spring/
a)导包 –> 02_jar -> spring_jar整理 -> spring_mvc;
b)DispatcherServlet配置和拦截规则 (前端控制器、任务派发器、前端调度器);
c)使用SpringMVC显示页面;
d)使用SpringMVC向前台传递数据;
a)HandlerMapping:处理器映射 :将请求映射到Handler上并返回处理器执行链
i.通过HandlerMapping(处理器映射),可以将Web 请求映射到正确的Handler(处理器)也就是Controller上;
ii.DispactherServlet(前端控制器) 将请求交给HandlerMapping,让他检查请求并找到一个合适的HandlerExecutionChain(处理器执行链),这个HandlerExecutionChain 包含一个能处理该请求的Handler;
b)HandlerAdapter:处理器适配器 :执行具体的逻辑业务
i.负责执行DispactherServlet中HandlerExecutionChain的Handler;
ii.从Handler中获取ModelAndView(模型与视图)对象,返回给DispactherServlet;
c)ViewResolver:视图解析器 :解析视图
i.通过视图名称解析视图;
ii.返回视图对象;
d)HandlerExceptionResolver:处理器异常解析,将异常映射到统一错误页面,常见的404页面,不让用户看到具体的错误,友好提示;
e)LocaleResolver:本地化解析,解析客户端信息进行本地化;
f)ThemeResolver:主题解析,实现多风格,类似皮肤效果;
g)RequestToViewNameTranslator:请求到视图名转换器,当view为空时,从request中获取viewName;FlashMapManager:FlashMap管理器,通常应用在重定向场景;
5、SpringMVC Controller简要说明
a)RequestMapping注解使用:
i.多请求;
ii.限定请求方法;
iii.窄化(简化)请求路径;
b)Controller方法返回值:
i.ModelAndView:返回模型和视图
ii.void:使用原生request,response
iii.String:
1.返回视图名 viewName;比较推荐使用
2.转发 forword;
3.重定向 redirect;
iv.自定义类型(JSON) – 需要@ResponseBody注解 -
a)导包 -> spring_Jar整理 -> ssm框架整合包
b)配置 -> web.xml
i.读取spring配置文件;
ii.配置springmvc前端控制器;
c)配置 -> applicationContext.xml
i.读取数据库配置文件;
ii.配置数据源连接池;
iii.开启注解扫描;
iv.配置事务核心管理器;
v.开启注解事务;
vi.配置视图解析器;
vii.配置Mybatis:
1.配置sqlSessionFactory;
2.配置别名;
3.配置mapper工厂;
a)准备 – 测试数据:
i.Bean -> 根据个人喜好;
ii.数据库表 -> 根据个人喜好;
b)导入 – 测试数据 -> 学习项目 -> 后台页面
使用整合后的ssm框架,查询数据库测试表,将数据显示到前台
a)HttpServletRequest request;
b)HttpServletResponse response;
c)HttpSession session;
d)Model model:将数据存储在request域,前台可以获取;
a)Integer、int;
b)Float、float;
c)Double、double;
d)Boolean、boolean;
e)String;
4、包装类参数绑定:多条件查询,并将结果显示在页面上;
5、解决表单post提交乱码:在web.xml中配置过滤器;
1、Array数组类型的参数绑定:为页面增加多选框,获取选定游戏信息的id,后续逻辑自行选择;
2、List类型的参数绑定:获取所有游戏价格,并且计算总价;
Json介绍:http://www.bejson.com/knownjson/aboutjson/
a)导包,配置注解驱动;
b)创建自己的Json对象;
c)发送和接收Json字符串;
d)修改游戏信息,在弹出层内回显数据;
e)使用@RequestBody完成List和数组参数绑定,获取所有游戏的名称,在后台打印;
a)异常处理器原理;
b)使用异常处理器捕获运行时异常;
c)使用异常处理器捕获自定义异常;
a)通过@ControllerAdvice注解使@ExceptionHandler异常处理注解应用到所有使用@RequestMapping的方法上;
b)处理运行时异常:直接打印错误信息;
c)处理自定义异常:将错误信息输出到error页面上;
a)SpringMvc拦截器帮我们按照一定规则拦截请求,后根据开发人员自定义的拦截逻辑进行处理;
b)自定义拦截器需要实现HandlerInterceptor接口;
c)自定义的拦截器实现类需要在SpringMvc配置文件中配置;
d)可以配置多个拦截器,配置的顺序会影响到拦截器的执行顺序,配置在前的先执行;
e)HandlerInterceptor有3个接口:
i.preHandle 预处理:在拦截方法前执行;
ii.postHandle 后处理:在拦截方法后执行;
iii.afterCompletion 渲染后处理:在页面渲染后执行;
f)拦截器也体现了AOP思想;
g)拦截器的应用:权限检查,日志记录,性能检测等;
a)自定义2个拦截器,并在主配置文件中配置好;
b)运行服务进入拦截器,观察执行流程;
a)preHandle预处理:————–根据拦截器定义的顺序,正向执行;
b)postHandle后处理:————-根据拦截器定义的顺序,逆向执行;
c)afterCompletion渲染后处理:—根据拦截器定义的顺序,逆向执行;
d)postHandle预处理:————-所有拦截器都返回成功调用;
e)atterCompletion渲染后处理:—preHandle返回true调用;
a)需要登录才可以访问列表页;
b)如果未登录重定向到登录页面;
a)使用自定义异常处理器捕获登录时异常;
b)如果出现异常,将异常信息发送到登录页面提示;
a)在web.xml配置DispatcherServlet的url-pattern以扩展名结尾,例如*.do,*.html 等;
b)在web.xml配置default servlet-mapping的url-pattern,以目录形式和扩展名形式;
c)在springmvc.xml中配置mvc:resources/,该方法需要注意以下几点:
i.需要开启mvc:annotation-driven注解驱动;
ii.如果配置了拦截器,需要在拦截器中进行过滤,否则会被拦截;
iii.路径名不要打错 ;
更多关于RESTful风格的介绍网上查查;
使用RESTful前:
http://127.0.0.1/item/save POST 新增物品
http://127.0.0.1/item/delete GET/POST 删除物品
http://127.0.0.1/item/update POST 修改物品
http://127.0.0.1/item/query.do?id=1 GET 根据id查询物品
使用RESTful后:
http://127.0.0.1/item POST 新增物品
http://127.0.0.1/item/1 DELETE 根据id删除物品
http://127.0.0.1/item PUT 修改物品
http://127.0.0.1/item/1 GET 根据id查询物品
RESTful风格开发对Http协议中的基本方法的使用
POST INSERT 增 邮寄一个新的
DELETE DELETE 删 仍了,不要了
GET SELECT 查 获取一个
PUT UPDATE 改 往这个里边放点东西
使用Springmvc实现RESTful风格开发;
a)使用物品id当作请求路径,点击按钮,跳转到具体的页面;
b)当使用ajax时,页面不会跳转,需要到ajax回调中处理;
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
1 |
|
1 |
|
1 | public class ItemInfo { |
1 |
|
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
1 | public class LoginInterceptor implements HandlerInterceptor { |
1 |
|