SSM框架之SpringMVC

本文详细介绍了SpringMVC的各个核心组件,包括前端控制器DispatcherServlet、处理器映射器、处理器适配器、处理器及视图解析器。通过实例展示了SpringMVC的配置和使用,包括入门程序、映射器和适配器的配置,以及注解的使用。此外,还深入讲解了SpringMVC与MyBatis的整合,涉及 Dao、Service 和 Web 层的整合,并讨论了异常处理、上传图片和JSON数据交互。文章最后探讨了RESTful支持和拦截器的实现,为读者提供了一个全面的SpringMVC学习指南。
摘要由CSDN通过智能技术生成


SpringMVC

springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,是一个基于mvc的web框架

MVC设计模式

mvc是一个设计模式,mvc在b/s系统 下的应用:
mvc
补:https://blog.csdn.net/MOKEXFDGH/article/details/86583221#MVC_258

springmvc框架

sm
组件:
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方法
dod
2.第二步:前端控制器调用处理器映射器查找Handler
hdas
3.第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
hdsa
4.第四步:视图渲染,将model数据填充到request域
(1)视图解析,得到view:
view1
(2)调用view的渲染方法:
view2
(3)将model数据填充到request域:
view3


springmvc和mybatis整合

1.springmvc+mybaits的系统架构:
ssm23

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值