SpringMVC
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,是一个基于mvc的web框架
MVC设计模式
mvc是一个设计模式,mvc在b/s系统 下的应用:
补:https://blog.csdn.net/MOKEXFDGH/article/details/86583221#MVC_258
springmvc框架
组件:
1、前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器
有了DispatcherServlet减少了其它组件之间的耦合度
2、处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View(需要程序员开发jsp)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
入门程序
环境:spring3.2
使用mybatis案例,商品列表查询
配置前端控制器和处理器适配器
1.在web.xml中配置前端控制器:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation:指定springmvc配置的加载位置
如果不指定则默认加载WEB-INF/[DispatcherServlet 的Servlet 名字]-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- load-on-startup:表示servlet随服务启动 -->
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
<!--
<!--
第一种:*.action,访问以.action结尾由DispatcherServlet进行解析
第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
使用此种方式可以实现RESTful风格的url
第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址
不能根据jsp页面找到handler,会报错
-->
</servlet-mapping>
2.创建springmvc.xml配置Handler、处理器映射器、处理器适配器、视图解析器:
<!-- 配置加载Handler,beanname即为指定url(可以访问的url) -->
<bean name="/items1.action" id="itemList1" class="cn.moke.springmvc.controller.first.ItemList1"/>
<!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 处理器适配器,由源代码可知适配器能执行实现Controller接口的Handler -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器,解析jsp,默认使用jstl标签;InternalResourceViewResolver支持JSP视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
注:
配置完成,运行tomcat通过:http://localhost:8080/项目名称/items1.action,可以访问视图
前端控制器从DispatcherServlet.properties文件(webmvc包中)中加载处理映射器、适配器、视图解析器等组件
如果不在springmvc.xml中配置,使用默认加载的
3.视图解析器配置前缀和后缀:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"><!-- 配置jsp路径的前缀 -->
<property name="suffix" value=".jsp"><!-- 配置jsp路径的后缀 -->
</bean>
程序中不用指定前缀和后缀:modelAndView.setViewName(“itmes/itemsList”);
开发Handler
public class ItemList1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
//商品列表
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//创建modelAndView准备填充数据、设置视图
ModelAndView modelAndView = new ModelAndView();
//相当于request的setAtrribute,在jsp页面通过itemsList获取数据
modelAndView.addObject("itemsList", itemsList);
//视图
modelAndView.setViewName("/WEB-INF/jsp/itmes/itemsList.jsp");//itemsList.jsp即为视图
//返回ModelAndView
return modelAndView;
}
}
映射器和适配器
非注解的处理器映射器
BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping
入门程序使用的映射器:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
另一个映射器:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置:
<!-- 加载Handler -->
<bean id="itemList1" class="cn.moke.controller.ItemList1"/>
<!—简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/items1.action">itemList1</prop>
<prop key="/items2.action">controller的bean id</prop>
</props>
</property>
</bean>
注:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理
非注解的处理器适配器
SimpleControllerHandlerAdapter和HttpRequestHandlerAdapter
1.org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求编写的Handler实现 Controller接口
2.org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的Handler实现HttpRequestHandler接口
public class ItemList2 implements HttpRequestHandler {
public void handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception{
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone5 苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//填充数据
request.setAttribute("itemsList", itemsList);
request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);
/*
使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
*/
}
}
注解的处理器映射器和适配器(重点)
1.注解映射器:
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器
配置:
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
2.注解适配器:
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
3.mvc:annotation-driven代替注解映射器和注解适配器(实际开发常用),默认加载很多的参数绑定方法,如json转换解析器:
<mvc:annotation-driven></mvc:annotation-driven>
4.注解的Handler
//使用Controller标识 它是一个控制器
@Controller
public class ItemsController3 {
//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
//一般建议将url和方法写成一样
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsList", itemsList);
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
5.加载Handler:
<!-- 对于注解的Handler可以单个配置,实际开发中建议使用组件扫描 -->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!-- 可以扫描controller、service、...,这里让扫描controller,指定controller的包 -->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
源码分析
通过前端控制器源码分析springmvc的执行过程:
1.第一步:前端控制器接收请求后,调用doDiapatch方法
2.第二步:前端控制器调用处理器映射器查找Handler
3.第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
4.第四步:视图渲染,将model数据填充到request域
(1)视图解析,得到view:
(2)调用view的渲染方法:
(3)将model数据填充到request域:
springmvc和mybatis整合
1.springmvc+mybaits的系统架构:
2.整合步骤:
(1)第一步:整合dao层
mybatis和spring整合,通过spring管理mapper接口
使用mapper的扫描器自动扫描mapper接口在spring中进行注册
(2)第二步:整合service层
通过spring管理service接口
使用配置方式将service接口配置在spring配置文件中
实现事务控制
(3)第三步:整合springmvc
由于springmvc是spring的模块,不需要整合
3.所需要jar包:数据库驱动包:mysql5.1、mybatis的jar包、mybatis和spring整合包、log4j包、c3p0数据库连接池包、spring3.2所有jar包、jstl包
整合dao
1.db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123
2.log4j.properties
# Global logging configuration,建议开发环境中要用debug
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3.sqlMapConfig.xml
在classpath下创建mybatis/sqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!—使用mapper.xml自动扫描器时,mapper.xml文件如果和mapper.java接口在一个目录则此处不用定义mappers -->
<mappers>
<package name="cn.itcast.ssm.mapper" />
</mappers>
</configuration>
4.applicationContext-dao.xml
配置数据源、事务管理,配置SqlSessionFactory、mapper扫描器:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop