目录
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类增加异常(切面)的处理功能。