评价:感觉参数的这块很重要
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。
它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所具有的优势。而且框架本身有代码,看起来容易理解。
评价:核心是DispatcherServlet前端控制器,后面的Handler还有很多东西,还有视图解析器,这个只是一个大概的模型
Jar包下载:
spring:http://maven.springframework.org/release/org/springframework/spring/
jackson:
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/
xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
beans> |
评价:框架默认是加载WEB-INF下面的,springmvc-servlet.xml 的,一般为了配置文件的统一管理,我们都是自己去指定加载的
xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet> <servlet-name>springmvcservlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> servlet>
<servlet-mapping> <servlet-name>springmvcservlet-name>
<url-pattern>*.dourl-pattern> servlet-mapping>
web-app> |
评价:这个是一个比较完整的流程图,一定要做到心中有这个图
1.用户发送请求到前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器
3.处理器映射器根据请求url 找到具体的处理器,生成处理器链和拦截器(如果存在) 一起返回给DispatcherServlet
4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器handler
6执行完成返回ModelAndView
7 HandlerAdapter讲handler执行结果ModelAndView返回给DispatcherServlet
8 DispatcherServlet将ModelAndView发送给ViewReslover视图解析器
9 ViewReslover 解析后返回具体视图
10 DispatcherServlet 对view 进行数据解析
11 DispatcherServlet响应客户端
DispatcherServlet:前端控制器
用户的请求发送给前端控制器,DispatcherServlet是整个流程控制的核心,由它调用其他组件处理用户请求,DispatcherServlet的降低了组件之间的耦合性。
HandlerMapping:处理器映射器
HandlerMapping负责根据用回请求找到Handler处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,注解方式等等。
默认是使用注解的方式:
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
handler:处理器
由于handler 涉及到具体的用户业务请求,需要程序员根据业务需求开发handler,就是用来处理用户的请求。
HandlAdapter:处理器适配器
通过HandlAdapter对处理器执行,这是使用的适配器模式,可以对多种类型的处理器进行执行,默认是对注解形式的。
默认配置:
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
ViewResolver:试图解析器
ViewResolver负责将处理结果生成view视图,ViewResolver首先根据逻辑视图名解析成物理视图(网页地址) 再生成view视图对象,最后对view进行数据加载处理结果通过页面展示给用户
默认配置:
org.springframework.web.servlet.view.InternalResourceViewResolver
View:视图
Springmvc框架提供了很多view视图类型的支持,包括,jsp freemaker等,常用的就是jsp
开发人员需要关注的就是 handler和view
说明:在springmvc中 处理器映射器 处理器适配器 试图解析器 是springmvc的三大组件。
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> |
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> |
评价:后面还自己自己去扩展适配器解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp">property> bean> |
ViewClass:jstlView表示jsp模版页面需要使用jstl标签库,所以classpath中必须包含jstl的相关jar包,次属性是默认的可以不用设置
Prefix和suffix 查找视图页面的前缀和后缀,最是视图地址为:
/WEB-INF/jsp/hello.jsp
配置前缀和后缀之后那么在返回的时候直接写 hello 就可以了。
为了更好的学习,我们先整合mybatis和springmvc
查询用户列表
在资料文件夹里面有ssm整合需要的jar文件。
使用springmvc-01这个工程
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>
configuration> |
xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.whhp.springmvc.mapper"/> bean> beans> |
xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:component-scan base-package="com.whhp.springmvc.service"/>
beans> |
管理事务二种方式:第一种方式通过表达式匹配,第二种方式注解。
xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.whhp.springmvc.controller" />
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp">property> bean>
beans> |
xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<context-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:spring/application-*.xmlparam-value> context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class> listener>
<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>*.dourl-pattern> servlet-mapping>
web-app>
|
编辑用户,对用户的信息进行修改
请求的url:/userEdit.do
参数id
//通过id查询用户 @Override public User getUserById(Integer id) { User user = userMapper.selectByPrimaryKey(id); return user; } |
评价:这个好Service层的代码,由于Mapper层我们用的逆向工程搭建的,而且都是一些简单的CRUD操作,我们没有过多的关注DAO
//通过id查询用户 @RequestMapping("/userEdit") public ModelAndView userEdit(HttpServletRequest request) { //获取请求参数? String id = request.getParameter("id"); Integer uid = new Integer(id); User user = userService.getUserById(uid);
//创建MModelAndView ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("user",user); modelAndView.setViewName("editUser"); return modelAndView; } |
HttpServletRequest request
HttpServletResponse response
HttpSession httpSession
Model model
如果使用model可以不使用ModelAndView,Model对象可以向页面传递参数,View对象则可以使用string返回值替代,不管是Model还是ModelAndView 本质上都是使用reuqest域传值
因为request在获取请求参数的时候,可以将代码进行简化。
//通过id查询用户 @RequestMapping("/userEdit") public String userEdit(Model model,Integer id) { User user = userService.getUserById(id); model.addAttribute("user",user); return "editUser"; } |
7.1.6.1 支持的数据类型
整形Integer int 字符串,单精度,双精度 布尔型
说明: 对于布尔型的参数,请求的参数值true或false
url= localhost:8080/xxx.do?status=true
public void xxx(Boolean status)
7.1.6.2 @RequestParam(重点)
@RequestParam用来处理简单类型的绑定。
Value:参数名称,请求参数的名称(把请求参数映射到形参上)
Required:默认是true,表示请求中一定要有相印的参数,否则会报错。
HTTP Status 400 - Required Integer parameter 'id' is not present
defaultValue:可以设置默认值
400-499 :请求发送错误
500-599:服务端出错了
405:客户端是发送的get请求,但是服务端只有post请求的方法。
需求:修改数据保存
url: /editSave.do
参数: 表单中填写的数据
如果提交的参数很多,或者提交的表单中的内容很多的时候可以使用pojo接收数据,要求pojo对象中的属性和表单中的input的name属性一致。
页面中
" />
|
javaBean
private String username; private Date birthday; |
<filter> <filter-name>CharacterEncodingFilterfilter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class> <init-param> <param-name>encodingparam-name> <param-value>utf-8param-value> init-param> filter>
<filter-mapping> <filter-name>CharacterEncodingFilterfilter-name> <url-pattern>/*url-pattern> filter-mapping> |
使用包装pojo接收商品的查询条件
private User user;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; } |
" /> |
//使用包装类类接收数据 @RequestMapping("/editSave2") public String editSave2(UserVo vo) { System.out.println("----"); System.out.println(vo.getUser().getUsername()); System.out.println(vo.getUser().getId()); System.out.println(vo.getUser().getSex()); return null; } |
在用户修改页面可以修改日期,根据业务自定义日期格式
由于日期数据有多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对requestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。在springmvc这可以在处理器适配器上自定义Converter进行参数绑定。如果使用
public class DateConverter implements Converter
@Override public Date convert(String source) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = simpleDateFormat.parse(source); return date; } catch (ParseException e) { e.printStackTrace(); } return null; } |
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" > <property name="converters" > <set> <bean class="com.whhp.springmvc.converter.DateConverter" >bean> set> property>
bean> |
评价:这个是在SpringMVC的核心配置文件配置的