DispatcherServlet ;是客户端所有请求处理的入口,负责请求转发。
RequestMapping ;负责存储请求url到后端handler对象之间的映射。
Handler; 用于处理DispatcherServlet对象转发过来的请求数据。
ViewResolver;负责处理所有Handler对象响应结果中的view。
当用户发送一个请求给服务端时,首先是DispatcherServlet接收到请求,然后交给RequestMapping进行映射找到对应的Handler,RequestMapping是个Map的存在key是url,value则是对应的Handler,Handler处理完请求后在交给DispatcherServlet,DispatcherServlet在交给ViewResolver响应到页面上,再次返回给DispatcherServlet然后进行响应
进行代码入门
添加依赖Spring Web Thymeleaf springmvc会内嵌一个tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在static目录创建一个html网页可以直接访问
而在templates目录中创建的网页则需要需要基于后端控制器进行访问步骤如下
/*@Controller描述的对象为spring框架的bean,
* 这个通常作为spring web模块的一个请求处理器对象*/
@Controller//此注解用于告诉springweb模块这个对象是个控制层响应处理器
public class TemplaController {//在springmvc中称之为Handler
//在项目启动的时候会把这个@Controller类和这个url对应的方法存进行一个映射存储到一个集合当中
//底层一般使用的是map存储
//借助@RequestMapping定义请求url到方法映射
@RequestMapping("/doTempla")
public String doTemplateUI(Model mOdel){//此方法由DispatcherServlet
mOdel.addAttribute("name", "Default");
return "default";//这个名字为view的名字
//此返回值交给DispatecherServlet
//这个view的名字交给ViewResolver(ThymeleafViewResolver)
//这个解析的作用就是添加前缀和后缀
//对html页面中的元素进行解析(对特点属性进行处理)
}
然后再templates目录中创建一个网页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1> The DeFalt [[${name}]] lalalallalal</h1>
</body>
</html>
如果不是在默认的地址则可能报错500
server.port=8081
spring.thymeleaf.cache=false
#spring templeaf
#spring.thymeleaf.prefix=classpath:/templates/
#spring.thymeleaf.suffix=.html
#spring.thymeleaf.prefix这是配置的前缀
#spring.thymeleaf.suffix这配置的后缀
MVC对象的划分1view (负责呈现数据)2Controller(负责请求响应调度调度中心) 3Model(处理各种逻辑)
MVC设计思想 spring web就是实现这种思想
1通过DispatcherServlet处理请求调度
2通过Handler处理请求响应数据
3通过ViewResolver对View(html)进行解析
相比传统的springmvc做了很多简化
1内嵌web服务器(默认为tomcat)
2默认将DispatcherServlet,ViewResolver等对象配置进行了默认实现
3无需打成war包,可以直接运行jar包工程
项目结构static和templates
static目录中的页面可以直接访问,但是不能直接从model中获取数据
templates目录中的html不能直接访问但是可以通过controller访问并且可以添加额外thymeleaf表达式
thymeleaf是模板引擎,可以将html作为模板,可以对html元素进行功能扩展,通过表达式从model取数据,通过属性实现循环操作
ModelAndView对象则是将view和model对象封装在一起的对象代码如下
@RequestMapping("/haha")
public ModelAndView dogo(ModelAndView model){
model.addObject("age", 321);
model.addObject("nn",123);
model.setViewName("vie");
return model;
}
页面html模板代码如下需要和key名字对应
<h1> The DeFalt [[${age}]] </h1>
<h1> The DeFalt [[${nn}]] </h1>
Json数据对象:Json就是一种数据格式,有些程序不需要返回ModelAndView只需要数据,Json可以满足各种设备的适配代码如下
1首先定义一个pojo来封装数据
package com.cy.pj.module.pojo;
public class ResponseResult {
/*状态码*/
private Integer code;
/*响应信息*/
private String message;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2定义一个url来请求
package com.cy.pj.health.controller;
import com.cy.pj.module.pojo.ResponseResult;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class JesonController {
@RequestMapping("/lala")
@ResponseBody//不再将响应结果理解为view,并将响应结果转为为json格式响应到客户端
public ResponseResult doConverResponToJson(){
ResponseResult result = new ResponseResult();
result.setCode(200);
result.setMessage("ok");
return result;
}
}
需要注意的是需要添加@ResponseBody这个注解,将响应结果转为json格式,前提需要满足能转换,在springboot工程中 web模块里面会去调用jackson api,将返回值转为为json格式,但是在传统项目中则没有自动添加ackson api需要手动添加,即开箱即用
转换原理则是基于pojo对象的get方法进行字符串的拼接,pojo中的get方法中,get单词后面的名字作为key(首字母小写),value作为get方法的返回值
结果如下
{
code: 200,
message: "ok"
}
SpingMVC 请求参数数据处理
第一种情况
将请求参数直接赋值给方法参数中的直接量变量(8大基本封装类+String+Date)
/*直接量的方式就收参数 方法中参数名需要请求参数名相同 http://localhost:8081/dogo?name=12*/
@RequestMapping("/dogo")
public String doHandelParam(String name){
return "Requet params is" + name;
}
请求http://localhost:8081/dogo?name=12*/
特别提示@RequestParam(required=false/true)可以规定参数是否必须传值描述方法参数
不然就会报错
第二种情况rest风格一种软件加个编码风格,这种风格中定义了url的一种格式,其语法
在{}中的则为变量
/** * /a/b/{c}/s/{e} * a/b/100/s/200 * */
*/
@RequestMapping("/doHanReq/{id}")
public String ddoHandelParam(@PathVariable Integer id){
return "request params name="+id;
}
}
如果url中的参数名和方法的参数名不同则需要在@PathVariable注解中与url的参数名相同
如果是对象传参的话则是
package com.cy.pj.module.pojo;
public class RequqsetParamerter {
private String namee;
@Override
public String toString() {
return "RequqsetParamerter{" +
"name='" + namee + '\'' +
'}';
}
public String getNamee() {
return namee;
}
public void setNamee(String namee) {
this.namee = namee;
}
}
接收参数
@RequestMapping("/doHanReqq")
public String ddoHandelParamm(RequqsetParamerter pojo){
return "request params"+pojo.toString();
}
}
pojo对象中的set方法需要与请求参数的参数名匹配
访问控制层的方法时spring会默认创建实体对象进行调用set方法进行赋值