栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC(3):SSM

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC(3):SSM

1、SSM 整合 1.1、SSM 整合思路
  • SSM思路: SpringMVC+ Spring + MyBatis(IBatis),所以有人叫做SSI整合。
  • SSM整合是使用三个框架的优势功能。三个框架对应的三层架构的三层。 SpringMVC是视图层, Spring是业务层, MyBatis持久层。
  • SSM 整合,需要把对象交给容器管理, 让容器去创建项目中要使用的java对象。 现在有两个容器。
    • 第一个是Spring容器: Spring容器是管理service 和 dao等对象是业务层对象的容器。
    • 第二个是SpringMVC容器:管理控制器对象是视图层对象。
  • SSM整合就是把对象交给容器管理。 两个容器共存,各自负责管理不同的对象。
  • 把对象声明到配置文件中,让两个容器创建对象。 Spring创建service、dao。SpringMVC创建controller。
1.2、容器的创建

1、Spring容器创建: 在web.xml声明了监听器ContextLoaderListener , 这个功能框架写好了。

       功能是:创建spring的容器对象 WebApplicationContext,在创建WebApplicationContext对象时,读取spring的配置文件, 读取文件的时候,遇到bean标签或者注解,就能创建service、dao等对象, 放到容器中。

2、SpringMVC容器: 在web.xml声明了中央调度器DispatcherServlet。 在servlet的init()方法中,创建了容器对象 WebApplicationContext,在创建WebApplicationContext对象,读取springmvc的配置文件,读取文件时遇到@Controller注解,创建控制器controller对象,放到容器中。

内存中, 创建对象

  • WebApplicationContext spring = new WebApplicationContext(); //spring–map(service, dao)
  • WebApplicationContext springmvc = new WebApplicationContext(); //springmvc–map(controller)

3、SpringMVC容器和Spring容器的关系: 设计上SpringMVC容器对象是 Spring容器的子容器。

Spring是父容器,SpringMVC子容器,相当于java中的继承关系。  

1.3、SSM整合开发步骤
  • 使用的student2表(id,name,age)。
  • 创建maven web项目。
  • 修改pom.xml加入依赖: spring ,springmvc,mybatis, mybatis-spring, mysql驱动,druid, jackson。
  • 写web.xml : 声明容器对象。
    • 声明 Spring 的监听器ContextLoaderListener: 创建Spring的容器对象。创建service、dao对象。
    • 声明 SpringMVC 的中央调度器DispatcherServlet : 创建springmvc容器对象, 创建controller对象。
    • 声明字符集的过滤器 CharacterEncodingFilter , 解决post请求乱码的问题。
  • 创建程序中的包:dao、service、controller、entity。
  • 写spring、springmvc、mybatis配置文件。
  • 写java代码、实体类、dao接口和mapper文件、service类、controller类。 使用注解声明对象和赋值。
  • 创建视图文件和各种jsp。
1.4、相对路径

在页面中,有路径的问题, 访问路径有 "/"开头的, 还有没有 “/”:

没有斜杠开头
有斜杠开头
有协议开头的地址

地址的区别,现在看的都是在页面中的地址。

1)有协议开头的,例如http://www.baidu.com , 称为绝对地址。 地址是唯一的,你能够直接访问

2)没有协议开头的,例如 test/some.do , /test/some.do 称为相对地址。 相对地址单独使用不能表示某个资源,不能访问。 相对地址必须有参考地址在一起,才能表示一个资源的完整地址,才能访问。

参考地址: 有“ /" 和没有”/“ 参考地址不同的:

1)没有斜杠开头的地址, 参考地址:当前资源的访问路径

  • ​ 当前访问的地址: http://localhost:8080/ch07_path/index.jsp
  • ​ 资源名称: index.jsp
  • ​ 资源路径: http://localhost:8080/ch07_path
  •  在index.jsp 有 访问地址 a href=“test/some.do”

​ 点击some.do后, 地址变成 http://localhost:8080/ch07_path/test/some.do

此时:http://localhost:8080/ch07_path/test/some.do

资源名称:some.do

资源路径:http://localhost:8080/ch07_path/test/

在去点击 test/some.do 地址:http://localhost:8080/ch07_path/test/test/some.do

没有斜杠开头的地址: 参考地址 + 当前的相对地址 组合在一起是最后的访问地址

解决方式:

1)使用${pageContext.request.contextPath}。 
表示访问项目的路径(上下文件 context path)
发起请求test/some.do

优点:好理解
缺点:每个链接地址,都需要加el表达式
2)固定当前页面中的 没有“/”开头地址的 参考地址使用html中base标签
<%    String basePath = request.getScheme() + "://" + request.getServerName()            +":"+request.getServerPort()+request.getContextPath()+"/";%>

    
浏览学生    

 

2)有斜杠开头的地址  a href="/test/some.do":

  • 现在访问的的 http://localhost:8080/ch07_path/index.jsp,在index.jsp中有  /test/some.do。
  • 点击/test/some.do,地址变成 http://localhost:8080/test/some.do。
  • 有斜杠开头的地址,参考地址是 服务器地址, 也就是从协议开始到端口号的位置 http://localhost:8080。
  • 地址组成:http://localhost:8080/test/some.do地址缺少项目访问路径ch07_path。
  • 解决问题的方式:在你的路径前面加入 el表达式 ${pageContext.request.contextPath}。

有/开头的地址

/test/some.do

2、SpringMVC 核心技术 2.1、转发和重定向
  • forward:表示转发,实现request.getRequestDispatcher("xxx.jsp").forward();
  • redirect:表示重定向,实现response.sendRedirect("xxx.jsp");

mv.setViewName("forward:/hello.jsp");

mv.setViewName("redirect:/other.jsp");

    
    @RequestMapping(value="doForward.do")
    public ModelAndView doForward(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","msg");
        
        modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
        
        return modelAndView;
    }
}
    @RequestMapping(value="doForward.do")
    public ModelAndView doRedirect(String name,Integer age){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name",name);
        modelAndView.addObject("age",age);

        modelAndView.setViewName("redirect:/show.jsp");
        //http://localhost:8080/SpringMVC/show.jsp?name=lisi?age=22

        
        //注意:重定向不能访问/WEB-INF中的内容,即不能访问收保护的内容。
        //modelAndView.setViewName("redirect:/WEB-INF/view/show.jsp");
        
        return modelAndView;
    }
2.2、异常处理
  • 框架使用的是集中的异常处理。 把各个Controller中抛出的异常集中到一个地方处理。 处理异常的叫做异常处理器。
  • 框架中使用两个注解完成异常的集中处理。 这样每个controller不用单独处理异常了。注解是:

@ExceptionHandler : 放在方法的上面,表示此方法可以处理某个类型的异常。 当异常发生时,执行这个方法。

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

2.3、拦截器

拦截器:是springmvc框架中的一种对象, 需要实现接口HandlerInterceptor. 拦截用户的请求。 拦截到controller的请求。

作用:拦截用户的请求, 可以预先对请求做处理。 根据处理结果, 决定是否执行controller 。 也可以把多个controller中共用的功能定义到拦截器。

特点:

拦截器可以分为系统拦截器和自定义拦截器。
一个项目可以多个拦截器。0,或多个自定义拦截器。
拦截器侧重拦截用户的请求。
拦截器是在请求处理之前先执行的。
拦截器的定义:

1)创建类实现拦截器接口HandlerInterceptor,实现接口中的方法(3个)

2)在springmvc配置文件中,声明拦截器对象,并指定拦截的uri地址

4.3.1、第一个拦截器
public class MyInterceptor implements HandlerInterceptor {        @Override    public boolean preHandle(HttpServletRequest request,                             HttpServletResponse response,                             Object handler) throws Exception {        System.out.println("=====MyInterceptor拦截器的preHandle====");        return true;    }        @Override    public void postHandle(HttpServletRequest request,                           HttpServletResponse response,                           Object handler,                           ModelAndView mv) throws Exception {        System.out.println("=====MyInterceptor拦截器的postHandle====");    }        @Override    public void afterCompletion(HttpServletRequest request,                                HttpServletResponse response,                                Object handler,                                Exception ex) throws Exception {        System.out.println("=====MyInterceptor拦截器的afterCompletion====");    }}

配置文件

                                           
当你的preHandle返回true, 执行结果:

=====MyInterceptor拦截器的preHandle====执行了MyController的doSome方法=====MyInterceptor拦截器的postHandle=========MyInterceptor拦截器的afterCompletion====请求的执行顺序: 用户some.do---preHandle---doSome---postHandle--afterComplietion
当 preHandle返回 false

=====MyInterceptor拦截器的preHandle====
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677871.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号