一、各部分负责的功能
spring 负责整合整个工程框架,统一创建和管理整个工程的对象
mybatis 负责管理数据库相关的操作
spring MVC 负责管理web开发中servlet相关操作 获得请求相应请求等
二、SpringMVC
(一)概述
1、springMVC就是一个spring框架,只是专门用于web开发
2、SpringMVC和web开发的关系
(1)SpringMVC是基于Spring的一个框架,实际是Spring的一个模块,专门用来做web开发的
(2)web开发底层是servlet,SpringMVC实质是servlet的一个升级,是在其基础上加一些功能,使web开发更方便
(3)SpringMVC中有一个对象是servlet
3、SpringMVC和Spring关系
SpringMVC就是一个Spring容器,能够通过ioc管理对象,使用<bean>标签、注解:@component、@Repository、@Service、@Controller创建对象,放到Spring和SpringMVC容器中统一管理,其中控制器对象放在SpringMVC容器中
@Controller创建的控制器对象是普通类对象,不是一个Servlet,SpringMVC赋予了控制器对象一些额外的功能,SpringMVC中有一个对象时Servlet:
中央调度器 DispatcherServlet---用来接收请求,调度其他各种器最终来响应请求
处理映射器 HandlerMapping---用来获得controller对象
处理适配器 hadleradptor---利用controller对象调用方法
视图解析器 ViewResoler---处理来自controller方法的返回结果ModelAndView对象,得到view对象,用来在视图显示
(二)springMVC执行流程
【具体流程】
用户发起请求--->DispatcherServlet接收请求 ,并将请求交给处理器映射器--->处理器映射器获取controller层处理器对象,并将其放在处理器执行链
--->DispatcherServlet将处理器对象交给处理器适配器对象--->处理器适配器对象利用处理器对象调用控制层方法---->得到ModelAndView
---->DispatcherServlet将ModelAndView交给视图解析器对象--->视图解析器对象创建View接口对象,使用View对象和其实现类表示视图,jsp的完整路径
---->DispatcherServlet获取View对象,调用View类的方法,将model数据存到request作用域
----->执行对象视图的forward,展示结果的jsp页面
【简化】
请求--->DispatcherServlet--->控制层对象--->调用对应方法--->ModelAndView
[注] 处理器执行链保存的对象:处理器对象、拦截器
三、 SpringMVC进行web开发
(一)开发过程
1、实现步骤
- 新建web maven工程
- 工程配置文件中加依赖:spring-webmvc(间接将spring的依赖都加入项目)、jsp、servlet
- 在web.xml配置文件中注册springmvc框架的核心对象DispatcherServlet
DispatcherServlet ---中央控制器,是一个servlet,父类继承HttpServlet
负责接收用户请求,调用控制器对象,并把请求的处理结果显示给用户
DispatcherServlet页---前端控制器,front controller
2、 控制层--控制器类:处理请求
(1)加@Controller注解
(2)定义处理请求的方法
@RequestMapping:用来指定前端请求名和后端对应的处理方法, vlaue是前端请求名
当指定一个方法处理多个或多种类型请求时,形式如下:
@RequestMapping(value={“/请求名1”,“/请求名2”,...},method=RequestMethod.POST/GET)
【注】能处理请求的都是控制器(处理器),myController就是后端处理器
@Controller
public class MyController{
//处理some.do请求的方法
@RequestMapping(value="/some.do")
public ModelAndView doSome(){
ModelAndView mv=new ModelAndView ();
mv.addObject("msg","执行的是doSome方法");//前端接收变量名为msg,后面为变量值,key value形式
mv.setViewName("/show.jsp");//跳转展示的页面
return mv;//框架会将mv对象的数据加入request对象中,框架自动进行页面跳转
}
}
3、配置web.xml文件
(1)声明注册springMVC核心对象DispacherSercvlet 指定web文件 servlet全限定名称 (创建servlet对象)
在服务器Tomcat启动时就创建,原理同监听器,在全局控制对象中创建spring容器对象,只创建一次,需要使用时在servletContext对象中获取
(2)读取springMVC配置文件 springMVC.xml
(3)指定本servlet创建时间,当有多个servlet对象创建时,依照这个数组进行依次创建
(4)servlet mapping :什么样的请求给哪个servlet
<servlet>
<!--1创建servlet对象,自定义对象名-->
<servlet-name>myweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--2读取自定义springmvc配置文件的位置-->
<init-param>
<param-name>contextConfigLocation </param-name><!--自定义springmvc配置文件名-->
<param-value>contextConfigLocation </param-name><!--自定义springmvc配置文件位置-->
</init-param>
<!--3设置Servlet对象创建时间,>=0的整数,数值越小,创建时间越早-->
<load-on-startup> 1</load-on-startup>
</servlet>
<!--4配置响应请求信息-->
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<url-pattern>*.do </url-pattern>
<!--凡是请求名是xx.do形式的,都用该servlet调用相应的控制层方法响应-->
</servlet-mapping>
4、配置SpringMVC.xml
将controller文件配置到SpringMVC.xml中,将利用注解方式创建的对象扫描到springMVC框架中统一管理
<beans>
<context:componet-scan base-package="控制层类所在文件夹的路径"/>
</beans>
(二)处理接收前端请求参数
1、三大对象
- HttpServletRequest--- 获取请求参数,地址栏访问时参数 ?属性=属性值
- HttpServletResponse--获取响应参数
- HttpSession--获取会话参数
2、使用方式
以方法参数形式存在,对前端数据进行接收,根据前端传送参数的方式,参数存储的作用域,选择不同对象来接收参数
@Controller
public class MyController{
@RequestMapping(value="/other.do")
public ModelAndView doOther(HttpServletRequest request,HttpServletResponse response,HttpSession session){
ModelAndView mv=new ModelAndView ();
mv.addObject("msg","执行的是doSome方法"+request.getParameter("id"));//前端以?形式传参
mv.setViewName("/show.jsp");
return mv;
}
3、接收用户表单提交的参数
(1)逐个接收
//前端传参
<from action="receive.do" method="post">
id:<input type="text" name="id"><br/>
name:<input type="text" name="name"><br/>
<input type="submit" value="提交参数"><br/>
</from>
//后台接收
@RequestMapping(value="/receive.do")
public ModelAndView xxx(int id,String name){
ModelAndView mv=new ModelAndView ();
mv.addObject("myid",id);
mv.addObject("myname",name);
mv.setViewName("/show.jsp");
return mv;
}
//前端展示
<body>
<h3>myid:${myid}</h3><br/>
<h3>myname:${myname}</h3>
<body>
(2)多个参数封装成对象接收
//前端传参
<from action="receive.do" method="post">
id:<input type="text" name="id"><br/>
name:<input type="text" name="name"><br/>
<input type="submit" value="提交参数"><br/>
</from>
//后台接收
//(1)创建一个报讯参数值的普通类,属性名和请求中参数名一致
public class Student{
private Integer id;
private String name;
//set get封装
}
//(2)通过对象接收参数
@RequestMapping(value="/receive.do")
public ModelAndView xxx(Student stu){
ModelAndView mv=new ModelAndView ();
mv.addObject("myid",stu.getId);
mv.addObject("myname",stu.getName);
mv.setViewName("/show.jsp");
return mv;
}
//前端展示
<body>
<h3>myid:${myid}</h3><br/>
<h3>myname:${myname}</h3>
<body>
4、方法的返回值类型
(1)ModelAndView
- Model---数据,最终放在request作用域中
- View--框架和视图直接的转发操作 forward
- 使用场景:同时用数据和视图
(2)String
- 代表视图部分
- 使用场景:本次请求只是做的页面跳转操作:a.jsp--->b.jsp
当方法上面带@ResponseBody时---表示返回数据
@RequestMapping(value="/xx.do")
@ResponseBody
public String xxx(){return " ";
}
(3) void
- 既不能表示数据 又不能表示视图
- 使用场景:处理ajax,ajax请求服务器返回的是数据,与视图无关
利用响应对象response来输出数据,来响应ajax请求
- 数据的传输形式是json
(4)object【重要】
- 框架利用反射对象 响应ajax 处理json数据
- 表示数据,与视图无关
- 使用场景:响应ajax请求
(三)SpringMVC核心技术
1、请求重定向和转发
(1)forward 转发---用户发送一次请求
forward用法:
mv.setViewName(forward:页面完整路径)
可以转发项目中任意文件(可以转发到视图解析器以外的视图页面)
mv.setViewName(show)
只能转发web-inf下 view文件夹下的文件
(2)redirect 重定向---用户发送两次请求
- 数据放在request作用域中,两次request请求不同不同,取数据只能用取参数形式取
- 两种方式取:(1)${}EL表达式 (2)java代码输出
mv.setViewName(redirect:/xx.jsp)
不能访问web-inf下的文件(受保护,用户不能直接访问)
2、异常处理
(1)以往处理异常---每个方法上try catch
现在集中处理--- AOP思想,解耦合,将异常代码与业务代码分离,单独统一处理
(2)实现
<1>自定义异常类---继承Exception类
<2>控制层处理类抛出异常---throws 自定义异常类
<3>创建普通类统一处理异常
- 类上加@ContrillerAdvice---用来表明是异常处理类,被springMVC扫描知晓
- 方法上加@ExceptionHandler(value=自定义异常类名.class)
<4>配置文件 springMVC.xml
<beans>
<context:component-scan base-package="异常处理类所在的文件夹路径"
<mvc:annotation-driven/>
</beans>
3、拦截器
(1)功能
- 拦截用户的请求,对请求做判断处理
- 拦截器是全局的,可以对多个Controller做拦截
- 一个项目中可以有0或多个拦截器,一起拦截用户的请求
- 拦截器常用在:用户登录处理,权限检查,记录日志
(2)执行时间
- 在请求处理之前,即controller类中方法执行之前
- 控制器方法执行之后也会执行拦截器
- 请求处理完成后也会执行拦截器
(3)实现步骤
- 自定义一个类实现HandlerInterceptor接口--implement HandlerInterceptor
- 在springmvc配置文件中声明拦截器,让框架知道拦截器的存在
springmvc配置文件:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"><!--指定拦截的url请求地址,凡是和user有关的请求都将被拦截-->
<bean class="自定义拦截器类的路径">
</mvc:interceptor>
</mvc:interceptors>
(4)拦截器和过滤器区别和联系
- 拦截器用来验证请求的,能截断请求;
- 过滤器用来过滤请求参数、属性的(request、response),侧重对数据的过滤,设置字符编码等
- 拦截器侧重拦截对Controller的对象,若请求不能被DispatcherServlet接收,则不会执行拦截器
- 过滤器可以处理jsp,js,html等
- 拦截器是框架中的对象;过滤器是servlet中对象
- 拦截器实现HandlerInterceptor接口;过滤器实现Filter接口
- 拦截器拦截在普通方法执行;过滤器过滤servlet请求响应
- 拦截器是springmvc容器中创建对象;过滤器是tomcat服务器创建对象
- 过滤器先于拦截器之前执行,过滤器一个执行时间点,拦截器有三个
四、整合SSM
(一)概述
1、这个框架中有两个容器
(1)Spring容器:管理service Dao 工具类的对象
(2)springMVC容器:管理web相关的 Controller对象
2、两个容器的连接
SpringMVC容器是spring容器的子容器,子容器可以访问父容器中内容,类似java中继承
即SpringMVC容器中的controller对象可以访问spring容器中的service对象
(二)整合
1、实体类
-
封装 set get
- 有参无参构造函数
- toString()
2、dao层
- xxdao接口
-
xxDao.xml
具体见Mybatis:Mybatis--增强的JDBC、SSM_@snow'的博客-CSDN博客
3、service层
- 接口
- 接口实现类 --类上加@service
- 注入dao层对象
@Resource
private xxDao xxdao;
4、controller层
- 类上---@Controller
方法上---@RequestMapping(" /请求名")
- 注入service层对象
@Resource
private xxService xxservice;
- 响应ajxa---方法上除了@RequestMapping(" /请求名")
还有 @ResponseBody
5、webl配置文件:web.xml
- 中央调度器
(1) 用来导入SpringMVC的配置文件(dispatcherServlet.xml)创建springMVC容器对象,继而创建并管理controller对象
(2)创建一个叫myweb的servlet对象
指定他处理.do类型请求,创建时间第1个
- 注册Spring监听器
用来扫描spring配置文件applicationContext.xml文件,创建spring对象,进而创建service dao对象
- 注册字符集过滤器
一次性设置所以文件(/*表示)的编码格式为utf-8 防止pos请求方式中文乱码问题
6、SpringMVC的配置文件:dispathcherServlet.xml
1、扫描controller包,利用注解声明controller及其他web相关的对象
2、注解驱动
7、mybatis配置文件 mybatis.xml
(1)setting输出日志(可省去)
(2)设置包别名,配置dao.xml时,返回的实体类可以直接写类名
(3)配置sql mapper文件 xxDao.xml
8、 spring配置文件:applicationContext.xml
1、连接数据库: 利用属性文件 jdbc.properties
2、配置mybatis配置文件,获得sqlSession对象,用来调用dao代理对象
3、service dao对象,通过注解声明,xml中无需用bean注入