springmvc经典教程(1)

一、 SpringMVC架构

1.1、 Spring web mvc介绍

spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:

1.2、 Web MVC

mvc设计模式在b/s系统下应用:

1、 用户发起request请求至控制器(Controller)

控制接收用户请求的数据,委托给模型进行处理

2、 控制器通过模型(Model)处理数据并得到处理结果

模型通常是指业务逻辑

3、 模型处理结果返回给控制器

4、 控制器将模型数据在视图(View)中展示

web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。

5、 控制器将视图response响应给用户

通过视图展示给用户要的数据或处理结果。

1.3、 Spring web mvc 架构

1.3.1、 架构图

1.3.2、 架构流程

1、 用户发送请求至前端控制器DispatcherServlet

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

5、 执行处理器(Controller,也叫后端控制器)。

6、 Controller执行完成返回ModelAndView

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器

9、 ViewReslover解析后返回具体View

10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户

1.3.3、组件说明

以下组件通常使用框架提供实现:

  • DispatcherServlet:前端控制器
  • 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
  • HandlerMapping:处理器映射器
  • HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
  • Handler:处理器
  • Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
  • 由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
  • HandlAdapter:处理器适配器
  • 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
  • ViewResolver:视图解析器

    ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
    springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。

  • 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

二、商品订单业务说明

本教程在通过商品订单业务学习使用springmvc进行功能开发。

2.1、 业务流程

1、管理员维护商品信息

2、用户挑选商品,购买,创建订单

2.2、 数据库环境

先导入sql_table.sql,再导入sql_data.sql脚本:

如下:

2.3、 商品订单数据模型

三、SpringMVC入门

3.1、 需求

实现商品查询列表功能。

3.2、 开发环境准备

本教程使用Eclipse+tomcat7开发

详细参考“Eclipse开发环境配置-indigo.docx”文档

3.3、 第一步:建立一个Web项目

在eclipse下创建动态web工程springmvc_first。

3.4、 第二步:导入spring3.2.0的jar包

3.5、 第三步:前端控制器配置

在WEB-INF\web.xml中配置前端控制器,

[html] view plain copy print?

  1. <servlet>
  2. <servlet-name>springmvc</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:springmvc.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springmvc</servlet-name>
  12. <url-pattern>*.action</url-pattern>
  13. </servlet-mapping>

load-on-startup:表示servlet随服务启动;

url-pattern:*.action的请交给DispatcherServlet处理。

contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加

载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml。

3.5.1、 Servlet拦截方式

1、拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action

此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

2、拦截所有,设置为/,例如:/user/add  /user/add.action

此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。

但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

3、拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

3.6、 第四步:springmvc配置文件

Springmvc默认加载WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定义处指定加载的配置文件,如下:

  1. <init-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:springmvc.xml</param-value>
  4. </init-param>

如上代码,通过contextConfigLocation加载classpath下的springmvc.xml配置文件。

3.7、 第五步:配置处理器映射器

在springmvc.xml文件配置如下:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/mvc
  8. http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
  15. <!-- 处理器映射器 -->
  16. <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
  17. <bean
  18. class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name为请求的url,且必须以.action结尾。

3.8、 第六步:配置处理器适配器

在springmvc.xml文件配置如下:

<bean        class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

SimpleControllerHandlerAdapter:即简单控制器处理适配器,所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean作为

Springmvc的后端控制器。

3.9、 第七步:配置视图解析器

在springmvc.xml文件配置如下:

  1. <!-- ViewResolver -->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  4. <property name="prefix" value="/WEB-INF/jsp/"/>
  5. <property name="suffix" value=".jsp"/>
  6. </bean>

<!-- ViewResolver -->

<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"/>

</bean>

InternalResourceViewResolver:支持JSP视图解析

viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar包;

prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:

前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址
“WEB-INF/jsp/hello.jsp”

3.10、 第八步:后端控制器开发

  1. public class ItemList1 implements Controller {
  2. @Override
  3. public ModelAndView handleRequest(HttpServletRequest request,
  4. HttpServletResponse response) throws Exception {
  5. //商品列表
  6. List<Items> itemsList = new ArrayList<Items>();
  7. Items items_1 = new Items();
  8. items_1.setName("联想笔记本");
  9. items_1.setPrice(6000f);
  10. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  11. Items items_2 = new Items();
  12. items_2.setName("苹果手机");
  13. items_2.setPrice(5000f);
  14. items_2.setDetail("iphone6苹果手机!");
  15. itemsList.add(items_1);
  16. itemsList.add(items_2);
  17. //创建modelAndView准备填充数据、设置视图
  18. ModelAndView modelAndView = new ModelAndView();
  19. //填充数据
  20. modelAndView.addObject("itemsList", itemsList);
  21. //视图
  22. modelAndView.setViewName("order/itemsList");
  23. return modelAndView;
  24. }
  25. }

org.springframework.web.servlet.mvc.Controller:处理器必须实现Controller接口。

ModelAndView:包含了模型数据及逻辑视图名

3.11、 第九步:后端控制器配置

在springmvc.xml文件配置如下:

  1. !-- controller配置 -->
  2. <bean name="/items1.action" id="itemList1"
  3. class="com.sihai.springmvc.controller.first.ItemList1"/>

name="/items1.action":前边配置的处理器映射器为BeanNameUrlHandlerMapping,如果请求的URL为“上下文/items1.action”将会成功映射到ItemList1控制器。

3.12、 第十步:视图开发

创建/WEB-INF/jsp/order/itemsList.jsp视图页面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>查询商品列表</title>
  10. </head>
  11. <body>
  12. 商品列表:
  13. <table width="100%" border=1>
  14. <tr>
  15. <td>商品名称</td>
  16. <td>商品价格</td>
  17. <td>商品描述</td>
  18. </tr>
  19. <c:forEach items="${itemsList }" var="item">
  20. <tr>
  21. <td>${item.name }</td>
  22. <td>${item.price }</td>
  23. <td>${item.detail }</td>
  24. </tr>
  25. </c:forEach>
  26. </table>
  27. </body>
  28. </html>

3.13、 第十一步:部署在tomcat测试

通过请求:http://localhost:8080/springmvc_first/items1.action,如果页面输出商品列表就表明我们成功了!

3.14、 DispatcherServlet

DispathcerServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties文件加载springmvc所用的各各组件,如果在springmvc.xml中配置了组件则以springmvc.xml中配置的为准,DispatcherServlet的存在降低了springmvc各各组件之间的耦合度。

3.15、 HandlerMapping处理器映射器

HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain对象中给前端控制器返回。

3.15.1、 BeanNameUrlHandlerMapping

BeanNameUrl处理器映射器,根据请求的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找到bean实例。

  1. <!—beanName Url映射器 -->
  2. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

3.15.2、 SimpleUrlHandlerMapping

simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置。

  1. <!—简单url映射 -->
  2. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  3. <property name="mappings">
  4. <props>
  5. <prop key="/items1.action">controller的bean id</prop>
  6. <prop key="/items2.action">controller的bean id</prop>
  7. </props>
  8. </property>
  9. </bean>

3.16、 HandlerAdapter处理器适配器

HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。

3.16.1、 SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean通过此适配器进行适配、执行。

适配器配置如下:

  1. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

3.16.2、 HttpRequestHandlerAdapter

HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler接口的Bean通过此适配器进行适配、执行。

适配器配置如下:

  1. <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

Controller实现如下:

  1. public class ItemList2 implements HttpRequestHandler {
  2. @Override
  3. public void handleRequest(HttpServletRequest request,
  4. HttpServletResponse response) throws ServletException, IOException {
  5. // 商品列表
  6. List<Items> itemsList = new ArrayList<Items>();
  7. Items items_1 = new Items();
  8. items_1.setName("联想笔记本");
  9. items_1.setPrice(6000f);
  10. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  11. Items items_2 = new Items();
  12. items_2.setName("苹果手机");
  13. items_2.setPrice(5000f);
  14. items_2.setDetail("iphone5  苹果手机!");
  15. itemsList.add(items_1);
  16. itemsList.add(items_2);
  17. // 填充数据
  18. request.setAttribute("itemsList", itemsList);
  19. // 视图
  20. request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);
  21. }
  22. }

从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据:

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

3.17、 注解映射器和适配器

1.1.1、 Controller的代码

  1. @Controller
  2. public class ItemList3 {
  3. @RequestMapping("/queryItem.action")
  4. public ModelAndView queryItem() {
  5. // 商品列表
  6. List<Items> itemsList = new ArrayList<Items>();
  7. Items items_1 = new Items();
  8. items_1.setName("联想笔记本");
  9. items_1.setPrice(6000f);
  10. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  11. Items items_2 = new Items();
  12. items_2.setName("苹果手机");
  13. items_2.setPrice(5000f);
  14. items_2.setDetail("iphone6苹果手机!");
  15. itemsList.add(items_1);
  16. itemsList.add(items_2);
  17. // 创建modelAndView准备填充数据、设置视图
  18. ModelAndView modelAndView = new ModelAndView();
  19. // 填充数据
  20. modelAndView.addObject("itemsList", itemsList);
  21. // 视图
  22. modelAndView.setViewName("order/itemsList");
  23. return modelAndView;
  24. }
  25. }

3.17.1、 组件扫描器

使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan自动扫描标记@controller的控制器类,配置如下:

  1. <!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->
  2. <context:component-scan base-package="com.sihai.springmvc.controller.first"/>

3.17.2、

注解式处理器映射器,对类中标的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成象给前端控制器,HandlerMethod对象中封装url对应的方法Method。

的使用,推荐完成注解式处理器映射。

配置如下:

  1. <!--注解映射器 -->
  2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

注解描述:

@RequestMapping:定义请求url到处理器功能方法的映射

3.17.3、RequestMappingHandlerAdapter

注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

配置如下:

  1. <!--注解适配器 -->
  2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

3.17.4、<mvc:annotation-driven>

springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

3.18、 springmvc处理流程源码分析

1. 用户发送请求到DispatherServlet前端控制器

2. DispatherServlet调用HandlerMapping(处理器映射器)根据url查找Handler

3. DispatherServlet调用HandlerAdapter(处理器适配器)对HandlerMapping找到Handler进行包装、执行。HandlerAdapter执行Handler完成后,返回了一个ModleAndView(springmvc封装对象)

DispatherServlet 找一个合适的适配器:

适配器执行Hanlder

4. DispatherServlet拿着ModelAndView调用ViewResolver(视图解析器)进行视图解析,解析完成后返回一个View(很多不同视图类型的View)

视图解析:

5. DispatcherServlet进行视图渲染,将Model中数据放到request域,在页面展示

将model数据放在request域:

时间: 2024-07-31 20:02:19

springmvc经典教程(1)的相关文章

springmvc经典教程(2)

一.整合mybatis 为了更好的学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合. 整合目标:控制层采用springmvc.持久层使用mybatis实现. 1.1 需求 实现商品查询列表,从MySQL数据库查询商品信息. 1.2 jar包 包括:spring(包括springmvc).mybatis.mybatis-spring整合包.数据库驱动.第三方连接池. 1.3 Dao 目标: 1.spring管理SqlSessionFactor

转载 CSS3 经典教程系列:CSS3 盒阴影(box-shadow)详解

目标大纲 文章转载 CSS3 经典教程系列:CSS3 盒阴影(box-shadow)详解 IE中CSS-filter滤镜小知识大全

[Android]Android经典教程

第一季1.Android平台一日游2.搭建Android开发环境3.Say Hello To Android4.Activity初步5.Activity和Intent6.Android当中的常见控件7.Activity生命周期(一)8.Activity生命周期(二)9.Activity布局初步(一)10.Activity布局初步(二)11.Activity布局初步(三)12.Android常见控(二)13.Android常用控件(三)14.Handler的使用(一)15.Handler的使用(二

SpringMVC经典系列-14自定义SpringMVC的拦截器---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 这部分主要讲解SpringMVC的拦截器的部分,会带着大家完成定义拦截器的两种方式的实例,不多说了,开始-- SpringMVC的拦截器主要是用于拦截用户的请求,并且进行相应的处理,如:权限验证.判断登录等. 定义拦截器的两种方式,如下: 1. 实现接

SpringMVC经典系列-15对SpringMVC的总结---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 到此为止,关于SpringMVC部分已经基本讲述完了,我所讲述的知识点都是在项目中能经常使用到的,所讲述项目代码都是经过验证的,可能个人的表述不是很到位,希望大家海涵,如果大家发现其中有问题可以随时联系我的邮箱,还是那句话,我发博文主要是为了分享自己的

SpringMVC经典系列-12基于SpringMVC的文件上传---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 不知不觉已经把Spring的基础部分讲解完了,所讲述的都是在项目中经常用到的东西,是经得住考验的,接下来的部分主要是要讲述使用SpringMVC进行的文件上传.处理Ajax请求.自定义拦截器功能的实现,不多说了,首先讲解文件上传部分,开始--     

SpringMVC经典系列-13使用SpringMVC处理Ajax请求---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 这一部分主要讲解SpringMVC如何处理Ajax请求,是首先要讲解一下jackson类库,可以帮助我们在java对象和json.xml数据之间的互相转换.他可以将控制器返回的对象直接转换成json数据,供客户端使用,客户端也可以传送json数据到服务

WEKA使用教程(经典教程转载)

http://blog.csdn.net/yangliuy/article/details/7589306 WEKA使用教程(经典教程转载) 标签: lift算法csv数据挖掘class任务 2012-05-22 01:16 80161人阅读 评论(7) 收藏 举报  分类: 数据挖掘(25)  WEKA使用教程 目录 1. 简介2. 数据格式3.数据准备4. 关联规则(购物篮分析)5. 分类与回归6. 聚类分析 1. 简介 WEKA的全名是怀卡托智能分析环境(Waikato Environme

SpringMVC 基础教程 简单入门实例

SpringMVC 基础教程 简单入门实例 标签: Spring MVCspringmvcSpringMVC教程基础教程SpringMVC实例 2013-05-09 13:44 170403人阅读 评论(69) 收藏 举报  分类: Java(23)  Spring框架(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. spring MVC 入门教程二: 一个简单的入门实例教程 该实例的源码和实例中的jar 源码:http://download.csdn.net/detail/swi