SpringMVC

参考

B站颜群老师SpringMvc教程,部分内容参考简书博主:我没有三颗心脏
对于SpringMVC只是简要学习,所以很多配置等深入知识并没有提到,
是为学习SpringBoot打基础

MVC概述

JSP+JavaBean

早期的Java Web开发把显示层、数据层和控制层的操作全部交给JSP或
JavaBean来处理,JSP中Java代码和html代码杂糅在一起

JSP+JavaBean+Servlet

Servlet首先会接收用户的请求,然后根据请求调用相应的Java Bean
最后将要显示的结果交给JSP完成,这就是MVC模式

  • M 代表模型,就是各种要操纵的数据
  • V 代表视图,就是用户要看到的网页
  • C 代表控制器,根据不同的数据请求进行相应的数据操作,显示在视图

SpringMVC

进一步解耦合,将模型层拆分为业务层(service)和数据访问层(DAO)

springmvc环境搭建

spring-webmvc.jar包,定位是servlet

第一个SpringMVC程序

servlet中有urlpattern,springmvc不需要urlpattern。普通的servlet流程
:一个请求会被urlpattern拦截,交给对应的servlet处理配置mvc自带的
springDispatcherServlet,让MVC介入程序并会拦截一切请求

1
2
3
4
5
6
7
8
9
10
11
12
<!-- web.xml -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springFramework.web.servlet.
DistpatcherServlet
<load-on-startup>1</load-on-startup>
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

SpringMVC的请求

当用户在浏览器中点击链接或者提交表单的时候就会向服务器发出请求,
SpringMVC会接收到相应的请求并进行相应的处理最后返回请求

DispatcherServlet

所有的请求首先都会经过DispatcherServlet,将这些请求发送给相应
的Spring MVC控制器

处理器映射

处理器映射会根据请求携带的URL信息来决策

1
2
3
4
5
6
7
8
9
10
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
<prop key="/hello">helloController</prop>
</props>
</property>
</bean>
<bean id="helloController" class="controller.HelloController"></bean>

控制器

请求到达控制器,控制器会分析请求的内容并进行相应处理

返回DispatcherServlet

控制器完成逻辑处理后,通常会产生一些信息比如用户数据,这些信息被称为
模型

视图解析器

根据控制器的处理分析要到达的视图

视图

视图使用数据模型渲染出结果,信息会传给客户端

使用注解配置SpringMVC

控制器

1
2
3
4
5
6
7
@Controller //使类变为控制器
public class SpringMvcHandler{
@RequestMapping("welcome") //替代urlpattern,拦截请求
public String welcome(){
return "success";
}
}

配置视图解析器

给所有返回位置增加前缀和后缀,控制器跳转到 views/success.jsp

1
2
3
4
5
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolve">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

RequestMapping映射及属性

RequestMapping也可以放在类上面,页面跳转时默认是请求转发

1
2
3
4
5
6
7
8
9
@Controller //使类变为控制器
//SpringMvcHan/welcome/abc
@RequestMapping("SpringMvcHan") //映射路径
public class SpringMvcHandler{
@RequestMapping("welcome/abc") //替代urlpattern,拦截请求
public String welcome(){
return "success";
}
}

RequestMapping中可以写多个属性,method中指定拦截什么类型的请求,params指
定请求必须有指定的name,并且必须有zs值,age可以没有,不能有height参数,约
定headers请求头信息,必须符合要求的头信息才可以接收

  • RequestMethod.GET
  • RequestMethod.POST
  • RequestMethod.DELETE
  • RequestMethod.PUT
1
2
3
4
5
6
7
8
9
10
11
@Controller 
@RequestMapping(value="Spring/**/Mvc/*/Han",method="RequestMethod.POST",
params={"name=zs","age!=23""!height"},headers={
"Accept=text.....","Accept-Encoding.."
})
public class SpringMvcHan{
@RequestMapping("welcome/a?c")
public String welcome(){
return "success";
}
}

ant风格的请求路径

  • ? 单个字符
    • 任意多个字符
  • ** 任意目录

通过@PathVariable获取动态参数

对于Spring/welcome/zs请求

1
2
3
4
5
6
7
8
9
@Controller //使类变为控制器
//SpringMvcHan/welcome/abc
@RequestMapping("Spring") //映射路径
public class SpringMvcHandler{
@RequestMapping("welcome/{name}")
public String welcome(@PathVariable("name") String name){
return "success";
}
}

REST风格

一般浏览器只支持get和post,其他请求通过过滤器实现,约定type和name符合
要求,springmvc已写好过滤器HiddenHttpMethodFilter

1
2
3
<form action="..." method="post">
<input type="hidden" name="_method" value="DELETE/PUT"/>
</form>
  • GET
  • POST
  • DELETE
  • PUT

过滤器底层解析

首先判断请求方式是不是post并且有没有隐藏域,如果是就包装把请求变为delete
或者put请求

普通方式获取值

值不是路径的一部分

1
2
3
4
5
6
7
8
9
@Controller
public class SpringMvcHandler{
@RequestMapping("welcome")
public String welcome(@RequestParam("uname") String name,
@RequestParam(value="uage",required=false,defaultValue="23")
Integer age){ //uage属性不一定有
return "success";
}
}

获取请求头信息

1
2
3
4
5
6
7
@Controller 
public class SpringMvcHandler{
@RequestMapping("welcome")
public String welcome(@RequestHeader("Accept-Language") String mes){
return "success";
}
}

获取cookie

1
2
3
4
5
6
7
@Controller 
public class SpringMvcHandler{
@RequestMapping("welcome")
public String welcome(@CookieValue("JSESSIONID") String jsid){
return "success";
}
}

使用实体类接收请求参数

如果请求的数据名恰好与Student属性名一一对应

1
2
3
4
5
@RequestMapping("fsda")
public String test(Student stu)
{
stu.value;
}

可以在mvc中使用原生态servlet

1
2
3
4
5
6
7
8
@Controller 
public class SpringMvcHandler{
@RequestMapping("welcome")
public String welcome(HttpServletRequest request,
HttpServletReponse response){
return "success";
}
}
Author: 高明
Link: https://skysea-gaoming.github.io/2020/02/28/SpringMvc/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.