SpringMVC 学习笔记
ssm:myBatis Spring SpringMVC MVC三层架构
javaSE:一般老师带
javaWeb:一般老师带
框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力
SpringMVC+Vue+SpringBoot+SpringClude+Linux
Spring:IOC和AOP是比较重要的,如果忘记了一定要回去重新学习
SpringMVC:SpringMVC的执行流程(也非常重要)
SpringMVC:SSM框架整合!
1,什么是MVC?
M
数据和业务
V
视图层
C
交接控制层
模型(dao,servisce) 视图(jsp) 控制器(Servlet),它是一种软件设计规范,它不是一种设计模式,而是一种架构模式,所以不同的MVC是存在着差异的
dao
service
servlet:转发,重定向
jsp/html
前端 数据传输 实体类
实体类:用户名,密码,生日,爱好
前端:用户名,密码
实体类有很多属性,但是前端登录时只需要两个属性,所以没有必要封装成一个对象进行处理
这时候我们就可继续细分pojo:
pojo:User(这里面有一个user所有的属性)
vo:userVo(但是这里面只有user视图层的相关属性)
dto:userDto(关于user数据传输层面的相关属性)
dao:
do:
bo:
在Modol1:JSP:本质就是一个Servlet(jsp职责不单一,职责过重,不便于维护)
面试题:
会问你:你项目的架构,是设计好的,还是演进的?
1,肯定不能回答是设计好的
2,Alibab 刚开始是买的国外的一个PHP网站
3,随着用户大,转变使用了Java
4,王坚(一个人) 因为IOE的花销很大,所以去除了IOE 使用了MySQL
5,All in one----->微服务
1.1,MVC框架需要做哪些事情?
将url映射到java类或者java类的方法
封装用户提交的数据
处理请求--调用相应的业务处理--封装响应数据
将相应的数据进行渲染.jsp/html等表示层数据
1.2,MVC演化的框架
MVVM:M V VM(也是三层架构) VM--ViewModel(双向绑定)这个是前后端分离的核心
1.3,SpringMVC的特点
轻量级,简单易学
高效,基于请求响应的MVC框架
与Spring兼容性好,无缝衔接
约定优于配置
功能强大:RESTful,数据验证,格式化,本地化,主题等
简洁灵活
2,回顾Servlet
先创建maven项目,然后导入依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
建立一个子项目,然后添加web框架,导入该子项目的相应依赖
编写一个Servlet类,用来处理用户的请求
3,springmvc-hello
3.1,springmvc-servlet配置文件
<context:component-scan base-package="com.springmvc.controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
4,Controller以及RestFul风格
4.1,控制器Controller
控制器复杂提供访问应用程序的行为,通常通过接口定义或者注解定义两种方法实现
控制器负责解析用户的请求并将其转化为一个模型
在Spring MVC中一个控制器可以包含多个方法
在Spring MVC中对于Controller的配置方式有很多种
去实现一个Controller接口,但是这种方法比较慢,而且一个Controller中只能实现一种方法,而且需要额外的去xml中配置bean
或者使用Controller注释,一个Controller中可以实现很多方法,而且不用额外去配置bean
@Component 组件
@Service service
@Controller controller
@Repository dao
4.2,RequestMapping
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法,可用于类或者方法上。用于类上,表示类中所有响应请求的方法都是以该地址作为父路径
4.3,RestFul风格
概念:是一个资源定位以及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
功能:
资源:互联网所有的事务都可以被抽象为资源
资源操作:使用POST,DELEDE,PUT,GET,使用不同方法对资源进行操作
分别对应添加,删除,修改,查询。
传统方法操作资源:通过不同的参数来实现不同的效果!方法单一,post和get,传参的方式是问号后面加入参数
使用RestFul风格:可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同
简单来讲,就是用不同的提交方法来产生不同的效果
@PathVariable:路径变量注释,通过这个注解,就可以让方法参数的值对应绑定到一个URL模板变量上。
@RequestMapping("/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b,Model model){
int res = a + b;
model.addAttribute("msg","结果是:"+res);
return "text";
}
特点:
使路径变得更加简洁;
获得参数更加方便,框架会自动进行类型转换;
通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法
插:小黄鸭调试法
场景一:
我们都有过向别人(甚至可能向完全不会编程的人)提问以及解释编程问题的经历,但是很多时候就在我们解释的过程中自己却想到了问题的解决方案,然后对方一脸茫然;
场景二:
你的同行跑来问你问题,但是当他把问题说完,说这说到一半的时候就想出答案走了,留下一脸茫然地你
4.4,转发与重定向(有视图解析器)
//这个就是默认情况下,是转发
@GetMapping( "/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b,Model model){
int res = a + b;
model.addAttribute("msg","结果2是:"+res);
return "text";
}//这个是重定向
@GetMapping( "/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b,Model model){
int res = a + b;
model.addAttribute("msg","结果2是:"+res);
return "redirect:/text.jsp";
}
5,数据处理
5.1,处理提交数据
提交的域名城和处理方法的参数名字一致
........?name = lxl
//处理方法就是 @RequestMapping("/add") public String test1(String name) { System.out.println(name); return "text"; }
提交的域名城和处理方法的参数名不一致
........?username = lxl
//处理方法就是 @RequestMapping("/add") public String test1(@RequestParam("username") String name) { System.out.println(name); return "text"; }
前端提交的是一个对象
要求提交的表单域和对象的属性名一致,参数使用对象即可
<form action="${pageContext.request.contextPath}+/user/getUser" method="post"> <label> <input name="id" type="text" value="请输入id"> </label> <label> <input name="name" type="text" value="请输入name"> </label> <label> <input name="age" type="text" value="请输入age"> </label> <input type="submit" value="提交"> </form>
@PostMapping("/getUser")
public String getUser(User user){
System.out.println(user);
return "text";
}
注意:如果使用对象的话,前端传递的参数名要和对象里面的属性名是一致的,否则就是null
5.2,数据显示到前端
第一种:通过ModelAndView(没用Controller注释)
我们前面一直都是如此,就不过多解释
String result = "HelloSpringMVC";
modelAndView.addObject("msg",result);
第二种:通过Model(使用了Cotroller注释)
这个在我们前面也一直使用
model.addAttribute("msg", name);
第三种:通过ModelMap
对比:
Model只有寥寥几个方法,只适合用于储存数据,简化了新手对于 Model对象的操作和理解
ModelMap:继承了LinkedMap,除了实现自身的一些方法,同样继承了LinkedMap的方法和特性
ModelAndView:可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转
5.3,乱码问题
之前都是自己写一个过滤器类,然后处理乱码,现在可以直接使用Spring提供的类,只用在web.xml中配置就行
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6,JSON
6.1,什么是JSON
前后端分离时代:后端部署后端,提供接口,提供数据
json
前端独立部署,负责渲染后端的数据
是一种轻量级的数据交换格式,目前使用的很广泛
采用完全独立于编程语言的文本格式来储存和表示数据
简介和清晰的层次结构使得JSON成为理想的数据交换语言
易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率
在JavaScript语言中,一切都是对象。因此,任何javaScript支持的类型都可以通过JSON来表示,例如字符串,数字,对象,数组等,看看他的语法格式:
对象表示为键值对,数据由逗号分割
花括号保存对象
方括号保存数组
JSON键值对:
是用来保存JavaScript对象的一种方式
{"name":"lxl"}
{"age":"18"}
{"sex":"男"}
6.2,js对象和json对象相互转换
//将js对象转化为json对象
const json = JSON.stringify(user);
//将json对象转化为js对象
const obj = JSON.parse(json);
6.3,Controller返回JSON数据
jackson应该是目前比较好的json解析工具了
当然工具不止这一个,比如还有阿里巴巴的fastjson等等
我们这里使用jackson,使用它需要导入他的jar包
6.4,json乱码问题
//解决方案
@RequestMapping(value = "/j1",produces = "application/json;charset=UTF-8")
上面的方法每一个Controller都需要添加,很麻烦,我们可以统一解决
我们可以在Springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置
6.5,FastJson
他是阿里开发的一个专门用于java开发的包,可以方便的实现json对象和javabean对象的转换
里面有三个比较重要的类:
JSONObject-代表了json对象
JSONObject实现了Map接口
JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可以利用诸如sixe(),isEmpty()等方法获取“键:值”对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的
JSONArray-代表json对象数组
内部使用List接口中的方法来完成操作的
JSON-代表JSONObject和JSONArray之间的转化
JSON类源码分析与使用
仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的互相转化
7,SpringMVC:整合SSM
7.1,环境要求
IDEA
Mysql
tomcat
Maven
7.2,数据库环境
创建一个存放书籍额数据库表
8,SpringMVC:Ajax技术
简介:
ajax是异步的javascript和XML
是一种无需重新加载整个网页的情况下,能够更新部分网页的技术
ajax不是一种新的编程语言,而是一种用于创建更好更快已经交互性更强的Web应用程序的技术