day01
现在解决一下tomcat中文乱码的问题
解决控制台乱码问题
1) 点击Help => Edit custom VM Options,在最后面添加
“-Dfile.encoding=UTF-8”
2) 点击右上角 Edit Configurations,在tomcat配置中的 VM option中添加
“-Dfile.encoding=UTF-8”
在第二步的Startup/Connection页签的Run和Debug添加一个key为JAVA_TOOL_OPTIONS, value为“-Dfile.encoding=UTF-8”
的环境变量
3) 保存后重启idea,可以发现控制台中文乱码显示正常了
1.1 SpringMVC概述
-
SpringMVC是Spring子框架,是Spring 为【展现层、展示层、表示层】提供的基于 MVC 设计理念的优秀的 Web 框架
-
Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器【请求处理器】,而无须实现任何接口。
-
SpringMVC是非侵入式
-
@Controller、@Component、@Reposity、@Service
-
-
浏览器【客户端】发送请求
-
由前端控制器【DispatcherServlet】将请求,委托给Controller【请求处理器】
-
Controller【请求处理器】调用业务逻辑层,并返回数据
-
将数据封装到ModelAndView对象
-
渲染视图【将View从ModelAndView中解析出来】
-
将View对象交个DispatcherServlet,最终响应浏览器【客户端】
1.3第一步 搭建SpringMVC步骤
1.导包
org.springframework
spring-webmvc
5.3.1
org.thymeleaf
thymeleaf-spring5
3.0.12.RELEASE
javax.servlet
javax.servlet-api
4.0.1
provided
org.projectlombok
lombok
1.18.20
2.
在web.xml中配置DispatcherServlet【前端控制器】
-
url设置为/
-
设置springmvc.xml配置文件路径,从而管理springmvc容器对象
-
设置DispatcherServlet的优先级,启动服务器创建当前DispatcherServlet
3.
创建springmvc.xml配置文件
-
位置:src/main/resources
-
名称:推荐使用springmvc.xml
-
示例代码
-
开启组件扫描
-
配置视图解析器
-
创建Controller【请求处理器】及处理方法 跳转首页
@Controller
public class ToIndexController {
@GetMapping("/")
public String toindex(){
//物理视图名=视图前缀+逻辑视图名+视图后缀
//物理视图名=/WEB-INF/pages/index/.html
System.out.println("跳转首页啦!!!!");
return "index";
}
@RequestMapping注解详解
该注解有以下几个子注解
@PutMapping 主要是基于RESF风格的修改功能
@DeleteMapping主要是基于RESF风格的删除功能
@PostMapping主要是基于RESF风格的增加功能
@GetMapping主要是基于RESF风格的查询功能
- 放在方法上可以单独使用 直接映射到方法上 这点就比servlet牛逼不知道多少倍
- 也可以放在类上 代表给这个类有一个大的约束url 但是注意的是不能够单独使用 需要配合方法使用
-
value属性
-
类型:String[]
-
作用:为方法或类映射URL
-
-
path属性
-
类型:String[]
-
作用:与value属性作用一致
-
-
method属性
-
类型:RequestMethod[]
public enum RequestMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE }
-
作用:设置当前URL的请求方式【GET、POST、DELETE、PUT】
-
注意:如请求方式不被支持,会报错:405
Request method 'GET' not supported
-
-
params
-
类型:String[]
-
作用:为当前URL设置请求参数
-
注意:如未携带指定参数,会报错
Parameter conditions "stuName" not met for actual request parameters:
-
-
headers
-
类型:String[]
-
作用:为当前URL设置请求头
-
注意:如未携带指定请求头,会报错:404
-
第三章 SpringMVC中REST风格的CRUD
3.1 REST概述
-
简称为 REST 或 RESTful
-
REST风格的URL将HTTP协议中的四种请求方式GET、POST、PUT、DELETE分别对应四种基本 *** 作:
-
GET 用来获取资源
-
POST 用来新建资源
-
PUT 用来更新资源
-
DELETE 用来删除资源。
-
3.2 REST风格与传统风格对比
-
传统风格
功能 URL 请求方式 增加 /saveEmp POST 删除 /deleteEmp?id=1001 GET 修改 /updateEmp POST 查询 /getEmpById?id=1001 GET -
REST风格
功能 URL 请求方式 增加 /emp POST 删除 /emp/1001 DELETE 修改 /emp PUT 查询 /emp/1001 GET -
总结:REST风格CRUD优势
-
提高网站排名
-
便于第三方平台对接
-
代码测试
测试之前完成一件事 就是浏览器无法发送put和delete请求 得需要我们的配置
配置一个拦截器
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter
/*
编写html代码 测试crud 简单的测试 不包含myabtis
CRUD
测试get请求
测试post请求
测试delete请求 删除携带id
测试put请求 修改携带id
分别对应的controller控制器 为
/**
* @ClassName RequsetMapping扩展
* @Author Dongyu Zhou
* @Date 2022/4/27 18:34
* @Version 1.0
*/
@Controller
public class RequsetMapping扩展 {
/**
* get请求
* @return
*/
@GetMapping("/get")
public String get(){
System.out.println("get请求 ....");
return "success";
}
/**
* post请求
* @return
*/
@PostMapping("/post")
//如果入参和请求参数名字一样 可以自动映射
public String post(@RequestParam("name") String name, @RequestParam("age")Integer age){
System.out.println("name = " + name);
System.out.println("post ....");
return "success";
}
/**
* delete请求
* @return
*/
@DeleteMapping("/delete/{Empid}")
public String delete(@PathVariable("Empid")Integer id){
System.out.println("id = " + id);
System.out.println("delete ....");
return "success";
}
/**
*
* @return
*/
@PutMapping("/put/{EmpId}")
public String put(@PathVariable("EmpId") Integer id){
System.out.println("id = " + id);
System.out.println("put ....");
return "success";
}
第四章 SpringMVC处理请求数据
4.1 自动入参
-
概述:请求参数名与请求参数名与入参参数名一致
-
注意:如请求参数名与入参参数名不一致,会将null值注入【所以建议使用包装类型作为入参的类型】
-
示例代码
@GetMapping("/doDefaultParam") public String doDefaultParam(String stuName,Integer stuAge){ System.out.println("stuName = " + stuName); System.out.println("stuAge = " + stuAge); return SUCESS; }
4.2 @RequestParam注解
-
作用:将指定参数名设置请求方法入参参数中
-
属性
-
value:设置需要入参的参数名
-
name:与value左右一致
-
required:设置当前标识的参数是否必须入参
-
true【默认值】:表示当前标识的参数必须入参,如未入参会报错
Required Integer parameter 'sAge' is not present
-
false:表示当前标识的参数不必须入参,如未入参会将null值注入
-
-
defaultValue:设置当前入参参数默认值【参数值为null时显示】
-
-
示例代码
@GetMapping("/doDefaultParam") public String doDefaultParam(String stuName, @RequestParam(value = "sAge", required = false, defaultValue = "16") Integer stuAge){ System.out.println("stuName = " + stuName); System.out.println("stuAge = " + stuAge); return SUCESS; }
4.3 POJO入参
-
概述:入参时,参数名与POJO中属性一致时,SpringMVC支持POJO入参
-
示例代码
添加员工信息
public class Employee { private Integer id; //员工id private String lastName; //员工姓名 private String email; //员工邮箱 private Double salary; //员工薪资 private Dept dept; //..... }
@PostMapping("/saveEmp") public String saveEmp(Employee employee){ System.out.println("employee = " + employee); return SUCESS; }
4.4 获取请求头信息【@RequestHeader】
-
作用:获取请求头信息
-
属性
-
value:设置请求头名称
-
name:作用与value作用一致
-
required:设置当前请求头是否必须入参
-
true【默认值】:表示当前请求头必须入参,如未入参,会报错
-
false:表示当前请求头不必须入参,如未入参,不会报错【null】
-
-
defaultValue:设置当前请求头默认数值【请求头信息为null时,显示】
-
-
示例代码
/** * 测试获取请求头 */ @GetMapping("/getRequestHeader") public String getRequestHeader(@RequestHeader("User-Agent") String userAggent, @RequestHeader("Referer") String referer ){ System.out.println("userAggent = " + userAggent); System.out.println("referer = " + referer); return SUCCESS; }
4.5 获取Cookie数值【@CookieValue】
-
作用:通过Cookie的key获取Cookie的Value
-
属性
-
value:设置Cookie的key
-
name:作用与value作用一致
-
required:设置当前Cookie是否必须入参
-
true【默认值】:表示当前Cookie必须入参,如未入参,会报错
-
false:表示当前Cookie不必须入参,如未入参,不会报错【null】
-
-
defaultValue:设置当前Cookie默认数值【Cookie信息为null时,显示】
-
-
示例代码
@GetMapping("/getCookieValue") public String setCookieValue(@CookieValue("stuName") String stuName){ System.out.println("==>getCookie,stuName = " + stuName); return SUCCESS; }
4.6 SpringMVC中使用Servlet原生对象
-
如需使用Servlet原生API怎么办?
-
直接将原生对象入参即可
-
-
示例代码
@GetMapping("/testServletAPI") public String testServletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session){ System.out.println("request = " + request); System.out.println("response = " + response); System.out.println("session = " + session); return SUCCESS; }
ModelAndView源码解析
属性一view
第一个就是view 有两个属性 一个是view接口 不常用 还得new一个实现类 太麻烦了
第二个就是使用视图名字 这个常用 比如 返回一个视图 return "success"
属性二 ModelMap model 这个是啥玩意 咱也不知 按住ctrl点进去
原来他就是一个LinkedHashMap
再来看看方法 视图名称有get'和set方法
但是没有model的方法 有三个 get方法
这三个方法的区别
总结
public class ModelAndView {
/** View instance or view name String. */
//视图对象【存储视图】:view对象或view名称【推荐使用view名称】
@Nullable
private Object view;
/** Model Map. */
//数据模型【存储数据】:ModelMap 继承 LinkedHashMap
@Nullable
private ModelMap model;
/**
* 设置视图名称
*/
public void setViewName(@Nullable String viewName) {
this.view = viewName;
}
/**
* 获取视图名称
*/
@Nullable
public String getViewName() {
return (this.view instanceof String ? (String) this.view : null);
}
/**
* 获取数据【Model可能为null,返回Map】
*/
@Nullable
protected Map getModelInternal() {
return this.model;
}
/**
* 获取数据【Model不为null,返回ModelMap】
*/
public ModelMap getModelMap() {
if (this.model == null) {
this.model = new ModelMap();
}
return this.model;
}
/**
* 获取数据【Model不为null,返回Map】
*/
public Map getModel() {
return getModelMap();
}
/**
设置数据
*/
public ModelAndView addObject(String attributeName, @Nullable Object attributeValue) {
getModelMap().addAttribute(attributeName, attributeValue);
return this;
}
}
使用
这几种方法 分别为 model modelMap map modelAndView
这几种传递的数据模型存放在request域中
如果我们想要存放在session域中的话 就可以直接把HttpSession作为入参放到方法里面
总结
springMVC的工作原理源码解析
无论是返回值为modelandview 还是String 返回值最后都是modelandview
断点测试 modelandview
测试String返回类型
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
这个方法就是调用Controller中的处理请求的方法
接下来 接着看 mv最终在一下方法中处理
点进去看 这个是渲染视图
怎么渲染 就点进去 这里往下走 就出现一个获取视图名
视图渲染 怎么渲染 可以再点进去看
解决springMVC的请求乱码问题
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceRequestEncoding
true
CharacterEncodingFilter
/*
为啥能解决呢
我们点进去这个类
CharacterEncodingFilter
不难发现这个类有三个属性 'encoding' 和
forceRequestEncoding forceResponseEncoding
这三个属性
看一下方法
就能发现这个dofilter的方法 就是主要解决乱码问题 来看一下1
默认为发false
所以我们设置true
所以在web.xml配置filter拦截器
接着上面的视图渲染 我们刚才debug走到了
下面我们接着走
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)