1.springMVC是spring框架的一个模块,springMVC和spring无需通过中间层进行整合
springMVC是一个基于MVC的web框架
2.MVC是一个设计模式
3.springMVC框架原理
组件
1)前端控制器(DispatcherServlet):接收请求,响应结果,相当于转发器,中央处理器。减少了其他组件之间的耦合度
2)处理器映射器(HandlerMapping):
作用:根据请求的url查找Handler
3)处理器适配器(HandlerAdapter):
作用:按照特定规则(HandlerAdapter要求的规则)执行Handler。
4)处理器Handle
5)视图解析器(ViewResolver):进行视图解析,根据逻辑视图解析成真正的视图(View)
6)视图View:是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf..)
4.入门程序
(1)配置前端控制器————web.xml
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>*.actionurl-pattern>
servlet-mapping>
(2)配置处理器映射器、适配器——springmvc.xml
A.添加约束
B.配置处理器适配器
<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" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<bean id="itemsController" name="/queryItems.action" class="com.iot.ssm.controller.ItemsController"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems1.action">itemsControllerprop>
<prop key="/queryItems2.action">itemsControllerprop>
props>
property>
bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
beans>
注意:注解的处理器映射器和适配器,(使用注解的映射器和注解的适配器必须配对使用)
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
而以上配置可以用注解驱动来代替
<mvc:annotation-driven>mvc:annotation-driven>
(3)开发注解Handle
使用@Controller来标识它是一个控制器
使用@RequestMapping(“/queryItems”)实现 对queryItems方法和url进行映射,一个方法对应一个url,一般建议将url和方法写成一样
这样在配置处理器适配器的时候,可以使用组件扫描
<context:component-scan base-package="com.iot.ssm.controller">context:component-scan>
因此在spring-mvc.xml中的配置就可以简写成:
<mvc:annotation-driven>mvc:annotation-driven>
<context:component-scan base-package="com.iot.ssm.controller">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
5.@RequestMapping:定义Controller方法对应的url,进行处理器的映射使用。
窄化请求映射:对该Controller也添加一个@RequestMapping(“/”)注解,作为一个根目录
对标记@Controller类中标识有@RequestMapping的方法进行映射。在@RequestMapping里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。
6.Controller的返回值类型
1)返回ModelAndView
需要方法结束时,定义ModelAndView,将model和view分别进行设置
2)返回String
如果Controller方法返回string,表示返回逻辑视图名
真正视图(jsp路径)=前缀+逻辑视图名+后缀
@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
//@RequestParam里边指定request传入参数名称和形参进行绑定。
//通过required属性指定参数是否必须要传入
//通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
//public String editItems(Model model, @RequestParam(value="id",required=true) Integer items_id)throws Exception {
public String editItems(Model model)throws Exception {
//调用service根据商品id查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(1);
//通过形参中的model将model数据传到页面
//相当于modelAndView.addObject方法
model.addAttribute("itemsCustom", itemsCustom);
return "items/editItems";
}
2.2)返回redirect重定向
redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)
//重定向到商品查询列表
//return "redirect:queryItems.action";
2.3)forward页面转发:通过forward进行页面转发,浏览器地址栏url不变,request可以共享。
//页面转发
return "forward:queryItems.action";
3)返回void:在controller方法形参上可以定义request和response,使用request或response指定响应结果
7.参数绑定
1)spring参数绑定过程:
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。
springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收!!!!
2)默认支持的类型
HttpServletRequest:通过request对象获取请求信息
HttpServletResponse:通过response处理响应信息
HttpSession:通过session对象得到session中存放的对象
Model/ModelMap:model是一个接口,modelMap是一个接口实现。作用:将model数据填充到request域。
3)简单类型
通过@RequestParam对简单类型的参数进行绑定。如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数则报错。
@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
//@RequestParam里边指定request传入参数名称和形参进行绑定。
//通过required属性指定参数是否必须要传入
//通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
public String editItems(Model model,@RequestParam(value="id",required=true) Integer items_id)throws Exception {}
4)pojo绑定
页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。
注意:这里只是要求name和形参的属性名一致,而不是要求和形参的名称一致,这点不要混淆了,框架会进入形参内部自动匹配pojo类的属性名。(我没看源码,但应该是用反射实现的)
页面参数:
商品名称:
注意:itemsCustom和包装pojo中的属性名一致即可。
controller方法形参:
public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception
包装类ItemsQueryVo中部分属性:
public class ItemsQueryVo {
//商品信息
private Items items;
//为了系统 可扩展性,对原始生成的po进行扩展
private ItemsCustom itemsCustom;
可见,ItemsQueryVo中属性itemsCustom和页面参数中一致
5)自定义参数绑定实现日期类型绑定
对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。
将请求日期数据串传成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。本文示例中,自定义参数绑定将日期串转成java.util.Date类型。
需要向处理器适配器中注入自定义的参数绑定组件。
自定义日期类型绑定:
public class CustomDateConverter implements Converter<String,Date>{
public Date convert(String s) {
//实现 将日期串转成日期类型(格式是yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//转成直接返回
return simpleDateFormat.parse(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果参数绑定失败返回null
return null;
}
}
配置方式:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.iot.learnssm.firstssm.controller.converter.CustomDateConverter"/>
list>
property>
bean>
8.SSM整合基础
1.整合dao层
mybatis和spring整合,通过spring管理mapper接口。
使用mapper的扫描器自动扫描mapper接口在spring中进行注册。
2.整合service层
通过spring管理service接口。
使用配置方式将service接口配置在spring配置文件中。
实现事务控制。
3.整合springmvc
由于springmvc是spring的模块,不需要整合。
具体流程:
1.applicationContext-dao.xml
1)配置数据源(连接池),以及db.properties
<util:properties id="config" location="classpath:db.properties">util:properties>
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{config.driver}" />
<property name="url" value="#{config.url}" />
<property name="username" value="#{config.username}" />
<property name="password" value="#{config.password}" />
bean>
2)配置sqlSessionFactory
<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds">property>
<property name="mapperLocations" value="classpath:cn/javaex/blog/dao/*.xml">property>
bean>
3)配置mapper扫描器
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.iot.learnssm.firstssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
bean>
2.实体类:生成po类,最好对每个类添加一个扩展类poCustom,利于系统的扩展
3.整合mapper(持久层):创建mapper.xml和mapper.java,先根据sql语句创建mapper.xml,其中resultType最好使用包装类,根据mapper.xml创建mapper.java,最好使用po类的扩展类作为参数,根据xml中的输入类型和输出类型定义方法。
4.整合service(业务层):
创建service接口,根据mapper.java中的方法定义一个方法。
创建servicelmp类,以mapperlmpl类的对象作为参数(因为mapper已经在配置文件中配置过,已经存在该对象,因此不需要new) ,实现接口中的方法,返回mapperlmp对象.方法()
配置service,声明(非注解)方式创建applicationContext-service.xml
id="service首字母小写" class="ServiceImpl类的路径"/>
配置事务控制,创建applicationContext-transaction.xml
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
bean>
配置通知,声明方式
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* service包路径.*.*(..))"/>
aop:config>
5.整合springMVC(整合Controller层)
创建springmvc.xml
<context:component-scan base-package="controller包路径">context:component-scan>
<mvc:annotation-driven>mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
配置前端控制器——web.xml
<servlet>
<servlet-name>SpringMVCservlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
servlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-*.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>SpringMVCservlet-name>
<url-pattern>*.actionurl-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>SpringMVCservlet-name>
<url-pattern>*.jsonurl-pattern>
servlet-mapping>
编写Controller,添加注解@Controller
添加service的对象作为属性值,并添加@Autowired注解,如下:
//使用@Controller来标识它是一个控制器
@Controller
//为了对url进行分类管理 ,可以在这里定义根路径,最终访问url是根路径+子路径
//比如:商品列表:/items/queryItems.action
public class ItemsController {
@Autowired
private ItemsService itemsService;
//商品查询列表
@RequestMapping("/queryItems")
//实现 对queryItems方法和url进行映射,一个方法对应一个url
//一般建议将url和方法写成一样
public ModelAndView queryItems() throws Exception{
//调用service查找数据库,查询商品列表
List itemsList = itemsService.findItemsList(null);
//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当于request的setAttribute方法,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList",itemsList);
//指定视图
//下边的路径,如果在视图解析器中配置jsp的路径前缀和后缀,修改为items/itemsList
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//下边的路径配置就可以不在程序中指定jsp路径的前缀和后缀
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
}
编写jsp
6.加载spring容器——web.xml
加载spring容器:添加spring容器监听器,加载spring容器,使用通配符加载spring/下的配置文件
applicationContext-dao.xml
applicationContext-service.xml
applicationContext-transaction.xml
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>WEB-INF/classes/spring/applicationContext-*.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>