1. SpringMVC简介
1.1 MVC模式
MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的开发思想。
- M(model)模型:处理业务逻辑,封装实体
- V(view) 视图:展示内容
- C(controller)控制器:负责调度分发(1.接收请求、2.调用模型、3.转发到视图)
1.2 SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模式的轻量级(启动时消耗资源少) Web 框架,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
总结:SpringMVC的框架就是封装了原来Servlet中的共有行为;例如:参数封装,视图转发等。
2. SpringMVC组件概述
2.1 SpringMVC的执行流程
1. 用户发送请求至前端控制器DispatcherServlet。
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4. DispatcherServlet调用HandlerAdapter处理器适配器。
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6. Controller执行完成返回ModelAndView。
7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9. ViewReslover解析后返回具体View。
10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11. DispatcherServlet将渲染后的视图响应响应用户。
2.2 SpringMVC组件解析
2.2.1 前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
2.2.2 处理器映射器:HandlerMapping
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
2.2.3 处理器适配器:HandlerAdapter
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
2.2.4 视图解析器:ViewResolver
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
笔试题:SpringMVC三大组件?
- 处理器映射器、处理器适配器、视图解析器
spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--1.组件扫描:只扫描controller-->
<context:component-scan base-package="com.lagou.controller"/>
<!--2.mvc注解增强:处理器映射器及处理器适配器-->
<mvc:annotation-driven/>
<!--3.视图解析器-->
<bean id="resourceViewResolve" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.3 SpringMVC注解解析
@Controller
SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中,如果使用@Controller注解标注的话,就需要使用:
spring-mvc.xml
<!--配置注解扫描-->
<context:component-scan base-package="com.lagou.controller"/>
@RequestMapping
* 作用:
用于建立请求 URL 和处理请求方法之间的对应关系
* 位置:
1.类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
它出现的目的是为了使我们的URL可以按照模块化管理:
用户模块
/user/add
/user/update
/user/delete
...
账户模块
/account/add
/account/update
/account/delete
2.方法上:请求URL的第二级访问目录,和一级目录组成一个完整的 URL 路径。
* 属性:
1.value:用于指定请求的URL,它和path属性的作用是一样的
2.method:用来限定请求的方式
3.params:用来限定请求参数的条件
例如:params={"accountName"} 表示请求参数中必须有accountName
pramss={"money!100"} 表示请求参数中money不能是100
3. SpringMVC的请求
SpringMVC可以接收如下类型的参数:
- 基本类型参数
- 对象类型参数
- 数组类型参数
- 集合类型参数
客户端请求参数的格式是: name=value&name=value……
服务器要获取请求的参数的时候要进行类型转换,有时还需要进行数据的封装。
3.1 获取基本类型参数
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;自动的类型转换是指从String向其他类型的转换。
@RequestParam
当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定。
3.2 获取对象类型参数
Controller中的业务方法参数的POJO属性名与请求参数的name一致,参数值会自动映射匹配。
中文乱码过滤器
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
web.xml
<!--中文乱码过滤器:解决post方式提交的乱码-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.3 获取数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
3.4 获取集合(复杂)类型参数
获得集合参数时,要将集合参数包装到一个POJO中才可以。
4. SpringMVC的响应
4.1 页面跳转
4.1.1 返回字符串逻辑视图(常用)
直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转到指定页面。
@RequestMapping("/returnString")
public String returnString() {
return "success";
}
企业开发我们一般使用返回字符串逻辑视图实现页面的跳转,这种方式其实就是请求转发。
forward转发
如果用了forward:则路径必须写成实际视图url,不能写逻辑视图。
使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法。
可以通过Model向request域中设置数据 model.addAttribute("key", "value")
。
@RequestMapping("/forward")
public String forward(Model model) {
model.addAttribute("username", "拉勾招聘");
return "forward:/WEB-INF/pages/success.jsp";
}
前端jsp
<body>
index.....${username}
</body>
请求转发是一次请求,${username}
能取值。
Redirect重定向
我们可以不写虚拟目录,springMVC框架会自动拼接,并且将Model中的数据拼接到url地址上。
@RequestMapping("/redirect")
public String redirect(Model model) {
// 底层使用的还是reqeust.setAttribute("username","拉勾教育")
// 域范围:一次请求
model.addAttribute("username", "拉勾教育");
return "redirect:/index.jsp";
}
前端jsp
<body>
index.....${username}
</body>
重定向是两次请求,所以页面${username}
取不出来值。
4.1.2 void原始ServletAPI
我们可以通过request、response对象实现响应。
@RequestMapping("/returnVoid")
public void returnVoid(HttpServletRequest request, HttpServletResponse response)throws Exception {
// 通过request实现转发
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// 通过response实现重定向
response.sendRedirect(request.getContextPath() +"/index.jsp");
}
WEB-INF是一个安全目录,里面的jsp不能直接访问,要么服务器内部转发访问(request),要么把里面的页面移到webapp目录下。
request
地址栏不改变,response
地址栏改变。
4.1.3 ModelAndView
在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,在方法中直接使用该对象设置视图,同样可以跳转页面。
@RequestMapping("/returnModelAndView")
public ModelAndView returnModelAndView(ModelAndView modelAndView) {
/*
Model:模型 封装数据
View:视图 展示数据
*/
//设置模型数据
modelAndView.addObject("username", "lagou");
//设置视图名称
modelAndView.setViewName("success");
return modelAndView;
}
4.2 返回数据
4.2.1 直接返回字符串数据
// 通过response直接响应数据
response.setContentType("text/html;charset=utf-8"); response.getWriter().write("拉勾网");
4.2.2 将对象或集合转为json返回
Springmvc默认用MappingJackson2HttpMessageConverter
对json数据进行转换,需要加入 jackson的包;同时使用 <mvc:annotation-driven />
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
@RequestBody
该注解用于Controller的方法的形参声明,当使用ajax提交并指定contentType为json形式时,通过 HttpMessageConverter接口转换为对应的POJO对象。
@ResponseBody
该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
5. 静态资源访问的开启
当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文 件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表对所有的 静态资源都进行处理操作,这样就不会执行Tomcat内置的DefaultServlet处理,而是被前端控制器DispatcherServlet处理,和@RequestMapping("/servletAPI")
进行路径匹配,而Controller中没有该路径,故加载不到。
我们可以通过以下两种方式指定放行静态资源:
spring-mvc.xml
<!--方式一:放行指定的静态资源 mapping:放行的映射路径 location:静态资源所在的目录-->
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
<!--方式二:放行全部的静态资源:在springmvc配置文件中开启DefaultServlet处理静态资源-->
<mvc:default-servlet-handler/>
6. SSM整合
步骤分析
-
准备数据库和表记录
-
创建web项目
-
编写mybatis在ssm环境中可以单独使用
- pom.xml导入依赖
- 编写实体类
- 编写Dao接口
- 编写映射配置文件(接口代理方式,该文件和Dao同包同名,即
**dao.xml
) - 编写核心配置文件
SqlMapConfig.xml
-
编写spring在ssm环境中可以单独使用
- pom.xml导入依赖
- 编写Service接口、实体类
- 编写核心配置文件
applicationContext.xml
-
spring整合mybatis
-
pom.xml导入依赖
<!--mybatis整合spring坐标--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency>
-
spring配置文件管理mybatis
-
-
编写springMVC在ssm环境中可以单独使用
- pom.xml导入依赖
- 编写核心配置文件
spring-mvc.xml
- 编写
web.xml
- 编写Controller类及对应jsp页面
-
spring整合springMVC(spring和web容器整合)
-
web.xml
ContextLoaderListener
加载<!--spring与web容器整合--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
-