SpringMVC基础(3):SSM整合/转发重定向

目录

1、SSM 整合

1.1、SSM 整合思路

1.2、容器的创建

1.3、SSM整合开发步骤

1.4、相对路径

2、SpringMVC 核心技术

2.1、转发和重定向

2.2、异常处理

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、相对路径

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

<a href="test/some.do">没有斜杠开头</a>
<a href="/test/some.do">有斜杠开头</a>
<a href="http://www.baidu.com">有协议开头的地址</a>

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

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)
<a href="${pageContext.request.contextPath}/test/some.do">发起请求test/some.do</a>

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

<head>    
<title>浏览学生</title>    
<base href="<%=basePath%>">
 
</head>

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}。

<p>有/开头的地址</p><a href="${pageContext.request.contextPath}/test/some.do">/test/some.do</a>

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");

    /**
     * 控制器方法返回是ModelAndView 实现转发 forward
     * 语法:mv.setViewName("forward:视图完整路径")
     * 
     * forward特点:不和视图解析器一同工作,就当项目中没有视图解析器
     */
    @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;
    }
}
/**
     * 控制器方法返回是ModelAndView 实现转发 redirect
     * 语法:mv.setViewName("redirect:视图完整路径")
     *
     * redirect特点:不和视图解析器一同工作,就当项目中没有视图解析器
     * 1、框架可以实现两次请求之间的数据传递,把第一个请求中Model里面简单
     *  类型的数据,转为字符串,附加到目标页面的后面,做gete参数传递。
     *    可以在目标页面中获取参数值的使用
     * 2、在目标页面中,可以使用 ${param.参数名}获取参数的值
     */
    @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类增加异常(切面)的处理功能

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值