springmvc详解

说完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的流程图
springmvc详解_第1张图片
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

SpringMVC常用注解

@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发生的异常

springmvc拦截器(Interceptor)

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之前。

你可能感兴趣的:(笔记,java,springmvc,interceptor)