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.导包
<dependencies>
<!--spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- <!–日志–>-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->
<!-- <artifactId>logback-classic</artifactId>-->
<!-- <version>1.2.11</version>-->
<!-- </dependency>-->
<!-- 导入thymeleaf与spring5的整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
2.
在web.xml中配置DispatcherServlet【前端控制器】
-
url设置为/
-
设置springmvc.xml配置文件路径,从而管理springmvc容器对象
-
设置DispatcherServlet的优先级,启动服务器创建当前DispatcherServlet
3.
创建springmvc.xml配置文件
-
位置:src/main/resources
-
名称:推荐使用springmvc.xml
-
示例代码
-
开启组件扫描
-
配置视图解析器
-
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<context:component-scan base-package="com.cong"/>
<!--mvc注解驱动-->
<mvc:annotation-driven/>
<!-- 处理静态资源过滤-->
<mvc:default-servlet-handler/>
<!--配置视图解析器-->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver" id="viewResolver">
<!--配置字符集属性-->
<property name="characterEncoding" value="UTF-8"/>
<!--配置模板引擎属性-->
<property name="templateEngine">
<!--配置内部bean-->
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<!--配置模块的解析器属性-->
<property name="templateResolver">
<!--配置内部bean-->
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!--配置前缀-->
<property name="prefix" value="/WEB-INF/views/"/>
<!--配置后缀-->
<property name="suffix" value=".html"/>
<!--配置字符集-->
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
</beans>
创建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请求 得需要我们的配置
配置一个拦截器
<!-- 配置拦截器 测试delete和put请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
编写html代码 测试crud 简单的测试 不包含myabtis
<!DOCTYPE html>
<!--添加thymeleaf-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>CRUD</title>
</head>
<body>
<a th:href="@{/get}"> 测试get请求</a>
<br>
<br>
<br>
测试post请求
<form method="post" th:action="@{/post}">
姓名:<input type="text" name="name">
年龄:<input type="text" name="age">
<input type="submit" value="提交">
</form>
<br>
<br>
<br>
测试delete请求 删除携带id
<form method="post" th:action="@{/delete/1001}">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="提交">
</form>
<br>
<br>
<br>
测试put请求 修改携带id
<form method="post" th:action="@{/put/1001}">
<input type="hidden" name="_method" value="put">
<input type="submit" value="提交">
</form>
</body>
</html>
分别对应的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入参
-
示例代码
<h3>添加员工信息</h3> <form th:action="@{/saveEmp}" method="post"> LastName:<input type="text" name="lastName"><br> Email:<input type="text" name="email"><br> Salary:<input type="text" name="salary"><br> DeptName:<input type="text" name="dept.deptName"><br> <input type="submit" value="添加员工信息"> </form>
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; }