SpringMVC
springmvc入门了解
springmvc表述层框架要解决的基本问题
- 请求映射:让一个方法处理一个请求
- 数据输入:获取请求参数
- 类型转换:内置或者自定义类型转换器,对请求参数的类型进行转换
- 数据校验:参数的非空校验
- 视图界面:Thymeleaf
- 请求分发:请求转发
- 与域对象交互
- 会话控制:Session
- 过滤拦截:Filter
- 异步交互
- 文件上传
- 文件下载
SpringMVC入门案例
Spring基本配置文件
<!-- 自动扫描包 -->
<context:component-scan base-package="com.atguigu.mvc.handler"/>
<!-- Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
命名规范
springmvc的规范没有什么要求,只要是JavaBean就可以了,一般默认Handler是请求处理器
加入日志记录sl4j记录仪
在handler类上声明一个成员类就可以了
private Logger logger = LoggerFactory.getLogger(this.getClass());
- Logger:org.slf4j.Logger
- LoggerFactory:org.slf4j.LoggerFactory
访问整体流程解析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTz52a7I-1640176363870)(./img/001.png)]
常见注解
RequestMapping注解
RequestMapping注解(重点)
@RequestMapping
注解就是前端请求的url地址处理请求关联在一起,建立映射关系
指定请求方式
RequestMapping的method属性指定
http定义了八种请求方式,封装在SpringMVC中的枚举类
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
一般设置RequestMapping注解的method属性
//value属性表示匹配请求路径,method属性表示匹配请求方式
@RequestMapping(value = "/emp", method = RequestMethod.GET)
通过RequestMapping的进阶注解指定
原版 | 进阶版 |
---|---|
@RequestMapping(value = “/emp”, method = RequestMethod.GET) | @GetMapping("/emp") |
@RequestMapping(value = “/emp”, method = RequestMethod.POST) | @PostMapping("/emp") |
@RequestMapping(value = “/emp”, method = RequestMethod.PUT) | @PutMapping("/emp") |
@RequestMapping(value = “/emp”, method = RequestMethod.DELETE) | @DeleteMapping("/emp") |
RequestHeader注解
获取请求头的具体数据
@RequestMapping("/getHeader")
public String getHeaderValue(@RequestHeader("user-agent") String headerValue){
//目标:获取user-agent请求头的信息,并且赋值给headerValue
logger.debug(headerValue);
return "target";
}
CookieValue注解
获取cookie的数据
@RequestMapping("/getCookie")
public String getCookieValue(@CookieValue(value = "JSESSIONID",defaultValue = "abc") String cookieValue){
//目标:获取浏览器中的名为"JSESSIONID"的cookie的值,赋值给CookieValue参数
logger.debug(cookieValue);
return "target";
}
获取请求参数(重点)
一个参数名获取一个参数值
<a th:href="@{/param/one(userName='tom')}">一个名字一个值的情况</a><br/>
@RequestMapping("/oneParameter")
public String oneParameter(@RequestParam("username") String username){
//最简单的方式获取单个请求参数:就是在handler方法中添加一个和请求参数名同名的参数,来接收请求参数
//其实这个地方String username此处省略了一个注解 @RequestParam
//@RequestParam("username")就是通过参数名获取请求参数
logger.debug(username);
return "target";
}
@RequestParam 注解的 required 属性:默认值为true,表示请求参数默认必须提供
一个参数名获取多个参数值
@RequestMapping("/multi")
public String oneNameMultiValue(@RequestParam("team")List<String> teamList){
logger.debug(teamList.toString());
//要使用什么类型来接收参数
return "target";
}
实体类封装请求参数
@RequestMapping("/pojo")
public String parameterToPojo(Employee employee){
//获取请求参数封装到Employee对象中:只需要保证Employee类中的属性和请求参数名一致
logger.debug(employee.toString());
return "target";
}
解决POST请求的中文字符乱码问题
到 web.xml 中配置 CharacterEncodingFilter 即可:
<!-- 配置过滤器解决 POST 请求的字符乱码问题 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- encoding参数指定要使用的字符集名称 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 请求强制编码 -->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!-- 响应强制编码 -->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
使用Map封装请求参数
@RequestMapping("/map")
public String parameterToMap(@RequestParam Map map){
//获取请求参数,封装到Map中:请求参数名就是map的key,请求参数值就是map的value
logger.debug(map.toString());
return "target";
}
访问静态资源(重点)
我们只需要在springMVC配置中加上一个配置就可以访问静态资源了
<!-- 加入这个配置,SpringMVC 就会在遇到没有 @RequestMapping 的请求时放它过去 -->
<!-- 所谓放它过去就是让这个请求去找它原本要访问的资源 -->
<mvc:default-servlet-handler/>
页面跳转控制
mvc:view-controller访问页面
,将请求转发到目标视图,除此之外没有任何其他代码。此时可以使用 SpringMVC 配置文件中的配置代替这样的 handler 方法。
访问Thymeleaf前后缀控制范围内的页面
<mvc:view-controller path="/index.html" view-name="portal"/>
访问Thymeleaf前后缀控制范围外的页面
<mvc:view-controller path="/test/redirect/command" view-name="redirect:/outter.html"/>
**加入 mvc:view-controller 配置后,其他正常 @RequestMapping 将失效。此时还是需要加入 mvc:annotation-driven 来解决。 **
SpringMVC使用域对象
请求域对象
将数据存入请求域对象
@RequestMapping("/testAttrOriginalRequest")
public String testAttrOriginalRequest(HttpServletRequest request){
//目标:将数据存储到请求域对象,然后跳转到target页面
//方式一:使用原始的request来完成
request.setAttribute("username","aobama");
return "target";
}
①使用Model对象往请求域中存储值
②在形参位置声明ModelMap类型变量,用于存储模型数据
③在形参位置声明Map类型变量,用于存储模型数据
④创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
设置视图名称
modelAndView.setViewName(“target”);
SpringMVC 传入的 Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6KUCFLE-1640176363876)(./img/002.png)]
会话域对象
使用会话域最简单直接的办法就是使用原生的 HttpSession 对象
@RequestMapping("/attrSession")
public String attrSession(HttpSession httpSession){
//目标:往会话域中存储数据
httpSession.setAttribute("address","召唤师峡谷");
return "target";
}
应用域
应用域同样是使用IOC注入的方式来操作:
@Autowired
private ServletContext servletContext;
@RequestMapping("/attr/application")
public String attrApplication() {
servletContext.setAttribute("appScopeMsg", "i am hungry...");
return "target";
}
1、Spring和SpringMVC的环境
- 依赖
- web.xml中的配置:servlet、filter
- springmvc配置文件:
- 包扫描:为了解析组件注解(IOC和依赖注入的主键)
- 配置Thymeleaf的模板解析器:为了解析Thymeleaf模板
- 加载MVC注解驱动:为了能够找到Handler方法处理请求
- 处理静态资源
view-controller
:访问页面
- 注解:
- IOC和依赖注入的注解: Controller、Service、Repository、AutoWired
- SpringMVC的注解: RequestMapping(请求映射)、RequestParam(获取请求参数)
- 日志
2. 持久层环境
- 依赖
- springmvc配置文件中配置持久层:
- 数据源
- JdbcTemplate
- 持久层实现类的方法中执行各个SQL语句
3. 测试环境
- 依赖
- Spring整合Junit
- 测试:需要测试业务层和持久层的代码
功能总结
1. 单纯跳转页面的功能
例如:访问首页、访问add.html添加页面,使用view-controller
标签实现
2. 查询功能
例如:查询电影列表、更新前的数据回显。它们的具体步骤:
- 需不需要带参数:就要看有没有查询条件
- 获取参数:
- 调用业务层的方法进行查询,获取到查询的数据
- 将查询到的数据存储到请求域
- 返回逻辑视图
- 在Thymeleaf页面获取请求域的数据,并展示
3. 增删改功能
例如:添加电影、删除电影、更新电影。它们的具体步骤:
- 肯定需要带参数:Thymeleaf的路径携带参数、以及表单携带参数
- 参数乱码:配置过滤器解决
- 获取参数:单个参数、POJO封装参数
- 调用业务层的方法进行增删改
- 重新查询所有: 使用
redirect
指令重定向访问查询所有电影
的功能