说完spring,那么来说下springmvc,还是什么是springmvc?
springmvc是spring框架的一个模块,基于 MVC 的一个框架,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
springmvc 表现层:方便前后端数据的传输
Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层
MVC是指,C控制层,M模块层,V显示层这样的设计理念,而SSM框架里面SPRING MVC本身就是MVC框架,作用是帮助(某种意义上也可以 理解为约束)我们要按照MVC这样的设计来开发WEB项目,而另外两个框架spring主要是用作IOC,AOF等其他的一些设计原则,至于mybatis是用来方便操作数据库的,所以他们都在MV里面,至于V指的是展示部分,一般是指JSP.
springmvc的工作原理
a、客户端发送请求到 DispatcherServlet
b、DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller c、Controller 调用业务逻辑后,返回 ModelAndView
d、DispatcherServlet 查询 ModelAndView,找到指定视图e、视图将结果返回到客户端
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 响应用户。
组件:
1、前端控制器DispatcherServlet
作用接收请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet减少了其它组件之间的耦合度。
2、处理器映射器HandlerMapping
作用:根据请求的url查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View
View是一个接口,实现类支持不同的View类型(jsp…)
配置
1、创建一个javaweb项目,导入jar包
2、配置web.xml文件,
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-serlvet.xml
springMVC
/
default
*.js
*.css
3、在src下创建springmvc-servlet.xml文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 指定需要扫描的包(包括子包),使注解生效 -->
<context:component-scan base-package="com"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4、在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个hello.jsp,在body中写入“Hello World”。
5、建立包及Controller,如下所示
6、编写Controller代码
@Controller
@RequestMapping("/springmvc")
public class mvcController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
7、启动服务器,键入 http://localhost:8080/项目名/springmvc/hello
@Controller
负责注册一个bean 到spring 上下文中
@RequestMapping
注解为控制器指定可以处理哪些 URL 请求
@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法
在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中
@RequestParam
在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法
@PathVariable
绑定 URL 占位符到入参
@ExceptionHandler
注解到方法上,出现异常时会执行该方法
@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常
1.1什么是拦截器(HandleUbterceper)
拦截器可以在目标方法执行之前进行一些拦截工作,或者在目标方法执行过后进行一些操作.在javaWeb的学习当中我们就学过了拦截器,当然在SpringMVC也为我们提供了新的拦截器,在本篇文章中我们就来研究SpringMVC中的拦截器.
1.2拦截器的定义
1.编写类实现HandlerInterceptor接口
2.继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
3.通过实现WebRequestInterceptor接口
4.继承WebRequestInterceptor接口的实现类来定义。
public class SpringFilterTest implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("1.方法执行前执行");
return true;//当它为true时放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("1.方法执行后、视图渲染前执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("1.视图选然后执行");
}
}
然后要在springmvc-servlet.xml中配置
<mvc:interceptors>
<!-- 指定一个拦截器 -->
<mvc:interceptor>
<!-- 要拦截的路径 -->
<mvc:mapping path="/**" />
<!-- 放行的路径 -->
<mvc:exclude-mapping path="/login" />
<!-- 自定义起作用的拦截器类 -->
<bean id="myInterceptor1" class="com.interceptor.SpringFilterTest"></bean>
</mvc:interceptor>
<!-- 指定一个拦截器 -->
<mvc:interceptor>
<!-- 要拦截的路径 -->
<mvc:mapping path="/test1" />
<!-- 放行的路径 -->
<mvc:exclude-mapping path="/test2" />
<!-- 自定义起作用的拦截器类 -->
<bean id="myInterceptor2" class="com.interceptor.SpringFilterTest2"></bean>
</mvc:interceptor>
</mvc:interceptors>
我这里配置的两个拦截器
第一个拦截器是为了拦截除login外的所有请求
第而个拦截器是为了拦截除test1的请求
在执行多个拦截器的时候拦截器的执行流程为
他们的preHandle()方法将按照配置文件中拦截器的配置顺序执行,而postHandle()方法和afterlompletion()方法将按照配置顺序反序执行
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,
触发时机:
1.过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
2.过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(
ServletRequest request, ServletResponse response, FilterChain chain
)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。