什么是springmvc?
Spring MVC 是 Spring Framework 提供的一个流行的“Model-View-Controller” 的轻量级的web 开发框架。
SpringMVC的主要特点和作用
1.基于MVC设计模式:
Spring MVC遵循松耦合的MVC设计理念,将程序逻辑、数据和界面分离,易于开发和测试。
2.非侵入式设计:
它只是一组Java类,不依赖任何容器和框架。几乎不需要任何配置就可以实现MVC功能。
3.RESTful支持:
内置映射URL到控制器方法的功能,方便实现增删改查等REST操作。
4.强大的数据处理功能:
内置数据绑定、格式化、验证功能,自动将请求参数映射到Java对象或直接使用。
5.视图技术独立:
采用松耦合的方式,支持各种视图技术如JSP、Freemarker、Thymeleaf等。
6.拦截器支持:
通过拦截器机制支持日志、安全、认证等系统服务,为请求处理提供动态扩展点。
7.依赖注入与 IoC:
结合Spring IOC容器,使用依赖注入实现组件解耦合。
8.AOP支持:
可以对Controller进行权限、事务等切面操作的应用。
9.部署自动配置:
简化部署配置,部署Spring MVC应用只需几个配置文件的支持。
10.REST API 开发:
支持前后端分离模式下的API开发,利用其HTTP请求映射功能。
SpringMVC的执行流程
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求后,将提交的信息交给处理器映射器HandlerMapping。
- HandlerMapping根据用户的url请求,匹配该url的Handler (Controller),并返回一个执行链。
- DispatcherServlet调用处理器适配器HandlerAdapter。
- HandlerAdapter经过适配调用具体的处理器 (Controller)。
- Controller处理完成后返回一个ModelAndView。
- HandlerAdapter将Controller处理结果 (ModelAndView)返回给DispatcherServlet。
- DispatcherServlet将ModelAndView请求视图解析器 (ViewReslover)进行解析。
- ViewReslover解析后返回具体的View。
- DispatcherServlet将view进行渲染视图 (即将模型数据填充到视图中)。
- DispatcherServlet将页面响应给用户。
主要组件:
- 前端控制器(DispatcherServlet):接收请求、响应结果,相当于转发器,它是SpringMVC框架最核心的组件,有了它就能减少其他组件之间的耦合度。
- 处理器映射器(HandlerMapping):根据请求的URL找到具体的处理器。
- 处理器适配器(HandlerAdapter):适配调用具体的处理器,并且执行处理器中处理请求的方法,执行完毕之后返回一个ModelAndView对象。
- 处理器(Handler):处理具体的用户请求,涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
- 视图解析器(ViewResolver):会根据传递过来的ModelAndView对象进行视图解析,解析完成之后就会返回一个具体的视图View给前端控制器。
- 视图(View):View是一个接口,它的实现类支持不同类型的视图。
快速入门
1.导入坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
2.配置web.xml或配置类
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
package org.example.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
使用注解时要写SpringConfig配置类
package org.example.config;
import org.example.entity.Phone;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import javax.sql.DataSource;
@Configuration
@ComponentScan("org.example")
@EnableAspectJAutoProxy
@EnableTransactionManagement
@ComponentScan(value = "org.example",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfiguration {
}
3.写一个Contrlloer类
@Controller
public class HeroController {
@RequestMapping("/hello")
public String hello(){
System.out.println("这是SpringMVC");
return "hello.jsp";//这里返回的是你的页面的名称,注意要放在WEB-INF之外才能找到
}
}
@RequestMapping
是Spring MVC中的一个注解,它的主要作用是将HTTP请求映射到控制器的处理方法上。以下是其主要功能以及一些示例:
主要功能:
- 请求映射:
@RequestMapping
可以将特定的HTTP请求映射到控制器类或特定的处理程序方法上。 - 指定请求的URL:
@RequestMapping
注解可以用于指定请求的URL。 - 指定请求的方式:
@RequestMapping
注解可以用于指定请求的方式。 - 指定请求参数的条件:
@RequestMapping
注解可以用于指定限制请求参数的条件。 - 指定处理的HTTP请求头:
@RequestMapping
注解可以用于指定处理的HTTP请求头。 - 指定处理的请求提交内容类型(Content-Type):
@RequestMapping
注解可以用于指定处理的请求提交内容类型。 - 指定返回的内容类型:
@RequestMapping
注解可以用于指定返回的内容类型。
例子:
@Controller
@RequestMapping("/home")
public class HomeController {
@RequestMapping(method = RequestMethod.GET)
public String home() {
return "homePage";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String view(@PathVariable("id") Long id) {
// 处理代码
return "viewPage";
}
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public String edit(@PathVariable("id") Long id, @RequestParam("name") String name) {
// 处理代码
return "editPage";
}
}
配置视图解析器
创建spring-mvc的配置文件,并在其中注入视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
因为将jsp文件放在WEB-INF文件夹外时不安全的,所以,一般要放在WEB-INF文件夹里面,所以为了更方便书写和能够访问到WEB-INF文件夹下面的页面,需要配置视图解析器,也可以使用配置类
package org.example.config;
import org.example.aop.LoginIntercepter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@ComponentScan("org.example.controller")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
@Bean
public ViewResolver getViewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
配置拦截器
拦截器与过滤器
拦截器(Interceptor): 拦截器是Spring MVC框架的一部分,它的生命周期由Spring MVC容器管理。拦截器主要用于处理Spring MVC的控制器(Controller)的请求。例如,您可以使用拦截器来进行权限验证,判断用户是否登录,或者是进行一些通用的功能,如请求日志打印等。拦截器可以访问action上下文、值栈里的对象,因此它可以使用Spring MVC的各种特性,如依赖注入等。
过滤器(Filter): 过滤器是Servlet规范的一部分,它的生命周期由Servlet容器管理。过滤器可以对所有的请求进行过滤,包括对静态资源的请求。过滤器基于函数回调,但是它不能访问Spring MVC的上下文,因此它不能使用Spring MVC的特性,如依赖注入等。
主要区别:
- 生命周期和依赖性:过滤器的生命周期由Servlet容器管理,而拦截器的生命周期由Spring MVC容器管理。过滤器是Servlet规范的一部分,依赖于Servlet容器。而拦截器是Spring MVC框架的一部分,不依赖于Servlet容器。
- 拦截范围:过滤器可以对所有请求进行过滤,而拦截器只能对Controller的请求进行拦截。
- 深度:拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
- 执行顺序:过滤器在拦截器之前执行。
创建拦截器的接口
public class MyIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("目标方法执行之前执行···");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("目标方法执行之后,视图对象返回之前执行···");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("流程都执行完毕之后执行···");
}
}
注入拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/hero/*"/>
<bean class="com.cqgcxy.interceptor.MyIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
@Autowired
private MyIntercepter myIntercepter;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myIntercepter).addPathPatterns("/hero","/hero/**");
registry.addInterceptor(loginIntercepter).addPathPatterns("/hero","/hero/**").excludePathPatterns("/hero/login");
}