SpringMVC 02

SpringMVC 02

3.SSM整合

SpringMVC + Spring + MyBatis当前最为流行的 JavaEE 开发技术架构

SSM 整合的实质------把对象交给容器管理

  • Spring容器是管理service 和 dao等对象------业务层

  • SpringMVC容器管理控制器对象------视图层

  • 将 MyBatis 整合入 Spring------持久层

3.1 容器创建

Spring容器

  • web.xml声明监听器ContextLoaderListener----创建spring容器对象WebApplicationContext

  • WebApplicationContext对象读取spring配置文件---根据标签/注解创建对象放到容器

SpringMVC容器

  • web.xml声明中央调度器DispatcherServlet---init方法---创建容器对象WebApplicationContext

  • 读取springmvc配置文件---@Controller注解---创建控制器controller对象放到容器中

SpringMVC容器和Spring容器的关系

  • SpringMVC对象相当于继承自Spring对象

  • controller对象 ----- dao、service对象

3.2 开发步骤

0.创建maven工程

1.pom.xml-----加入依赖

2.配置web.xml

  • 声明spring的监听器ContextLoaderListener: 创建spring的容器对象---service ,dao对象

  • 声明springmvc的中央调度器DispatherServlet : 创建springmvc容器对象---controller对象

  • 声明字符集过滤器 CharacterEncodingFilter----- 解决post请求乱码的问题

3.创建程序的包---- dao ,service, controller, entity

4.配置中央调度器----组件扫描---视图解析器

5.jdbc与MyBatis配置

6.Spring配置----读取配置文件----注解扫描----配置dao,service,工具类,事务

7.dao与mapper文件、service、controller------注解声明对象和赋值

8.视图文件-----jsp

 

3.3 相对路径

地址的区别

  • 协议开头为绝对地址----地址是唯一的,能够直接访问

  • 相对地址必须有参考地址才能访问

参考地址+相对地址

  • 没有斜杠开头:当前资源的访问路径+相对地址

  • 有斜杠开头:服务器地址+相对地址

  • ${pageContext.request.contextPath}----表示访问项目的路径

  • 固定当前页面中的没有“/”开头地址的参考地址

<%String basePath = request.getScheme() + "://" + request.getServerName()
+":"+request.getServerPort()+request.getContextPath()+"/";%>
<base href="<%=basePath%>">

 

4.SpringMVC核心技术

4.1 请求重定向与转发

处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重定向

  • 跳转到页面/跳转到其它处理器

  • 请求转发的页面,可以是 WEB-INF 中页面

  • 重定向的页面,不能为 WEB-INF 中页面-----用户不能直接访问 WEB-INF 中资源

请求转发 ------ mv.setViewName("forward:/hello.jsp");

  • 方法返回 ModelAndView

    • 必须写出相对于项目根的路径 ---- 指定不同位置的视图

    • forward 操作不需要视图解析器

  • 方法返回 String ----- forward: 视图完整路径

请求重定向 ----- mv.setViewName("redirect:/other.jsp");

 

4.2 异常处理

异常处理器 ----- 集中的异常处理------各个Controller中抛出的异常集中到一个地方处理

使用注解:

  • @ExceptionHandler : 指定异常处理方法,处理某个类型的异常。 异常发生时,执行此方法。

    • 可选属性 value,为一个 Class<?>数组 ----- 指定要处理的异常类

    • 被注解的方法

  • @ControllerAdvice: 放在类的上面, 表示这个类中有异常的处理方法。 相当于aop中的@Aspect。看做是控制器增强, 给Controller类增加异常(切面)的处理功能。

处理异常

  • 创建异常类

  • 控制器抛出异常

  • 异常的处理类加入@ControllerAdvice

  • 定义方法处理对应的异常。方法上加@ExceptionHandler注解

  • 返回处理异常的页面

  • springmvc配置文件 --- 组件扫描器、视图解析器 --- 组件扫描@ControllerAdivce --- 注解驱动

 

4.3 拦截器

拦截指定的用户请求,到controller的请求,并进行相应的预处理与后处理

在处理器适配器执行处理器之前

根据处理结果, 决定是否执行controller

定义

  • 实现接口HandlerInterceptor中的方法(3个)

  • springmvc配置声明拦截器对象指定拦截的url

实现

preHandle: 预先处理请求的方法

  • 参数Object handler : 被拦截的控制器对象(MyController)

  • 返回值: boolean --- 请求能否处理

  • 在控制器方法之前先执行,决定请求是否执行

  • 登录的检查, 权限的判断, 统计数据等等

postHandle: 后处理方法

  • 参数Object handler : 被拦截的控制器对象(MyController)

  • ModelAndView mv: 控制器方法的返回值

  • 在控制器方法之后执行

  • 获取到控制器方法的执行结果。 可以修改原来的执行结果

  • 对请求的二次处理

afterCompletion: 最后执行的方法

  • 参数Object handler : 被拦截的控制器对象(MyController)

  • Exception ex: 异常对象

  • 请求处理完成后执行 --- 执行forward操作后

  • 释放内存, 清理临时变量

配置 -----spring mvc .xml

<!--声明拦截器-->
<mvc:interceptors>
   <!--声明第一个拦截器-->
   <mvc:interceptor>
       <!--指定拦截器的拦截地址
           path:拦截的url地址,使用 ** 通配符。
                 例如: path="/user/**"
                 http://localhost:8080/user/listUser.do
                 http://localhost:8080/user/query/queryUser.do
       -->
       <mvc:mapping path="/**"/>
       <!--指定使用的拦截器-->
       <bean class="com.fremont.handler.MyInterceptor"/>
   </mvc:interceptor>

</mvc:interceptors>

多拦截器

  • 每个拦截器做单一的验证处理

  • 组合多个拦截器

  • 多个拦截器和一个控制器对象在一个链上

  • 框架中使用HandlerExecutionChain(处理器执行链),表示这个执行链

拦截器和过滤器

  • 拦截器是springmvc框架中的对象。 过滤器是servlet中的对象

  • 拦截器对象是框架容器创建的, 过滤器对象是tomcat创建的对象

  • 拦截器侧重对请求做判断处理, 可以截断请求。 过滤器侧重对request,response对象设置参数

  • 拦截器的执行时间有三个,过滤器只在请求之前

  • 拦截器拦截对controller,动态资源的请求;过滤器可以过滤所有请求

  • 先执行的过滤器,后面是 中央调度器 , 后面才是拦截器, 再后面是控制器方法

  •  

posted @ 2021-06-09 22:46  FremontUltimate  阅读(53)  评论(0)    收藏  举报