转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html

前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

1需求

以案例作为驱动。

SpringMVC和MyBatis使用一个案例(商品订单管理)。

功能需求:商品列表查询

2环境准备

数据库环境:mysql5.6

java环境:

jdk1.7

MyEclipse2014

SpringMVC版本:spring3.2

需要spring3.2所有jar(一定要包括spring-webmvc-3.2.0.RELEASE.jar)

新建一个web项目,将所需jar包拷贝至lib下。

3配置前端控制器

在web.xml中配置前端控制器。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>SpringMVC</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.jsp</welcome-file>
  6. </welcome-file-list>
  7.  
  8. <!-- springmvc前端控制器 -->
  9. <servlet>
  10. <servlet-name>springmvc</servlet-name>
  11. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  12. <!-- contextConfigLocation配置springmvc加载的配置文件(该配置文件中配置了处理器映射器、适配器等等)
  13. 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(即springmvc-servlet.xml)
  14. -->
  15. <init-param>
  16. <param-name>contextConfigLocation</param-name>
  17. <param-value>classpath:springmvc.xml</param-value>
  18. </init-param>
  19. <!-- 表示servlet随服务启动 -->
  20. <load-on-startup>1</load-on-startup>
  21. </servlet>
  22.  
  23. <servlet-mapping>
  24. <servlet-name>springmvc</servlet-name>
  25. <!--Servlet拦截方式
  26. 方式一:*.action,访问以.action结尾由DispatcherServlet进行解析
  27. 方式二:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析。
  28. 使用此方式可以实现RESTful风格的url
  29. 方式三:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,
  30. 仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错
  31. -->
  32. <url-pattern>*.action</url-pattern>
  33. </servlet-mapping>
  34.  
  35. </web-app>

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

4配置处理器适配器

在classpath下的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. <!-- 处理器适配器
  17. 所有处理器适配器都实现HandlerAdapter接口
  18. -->
  19. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  20. </beans>

通过查看源码:

此适配器能执行实现Controller接口的Handler。

5开发Handler

需要实现Controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。

  1. public class ItemsController1 implements Controller{
  2.  
  3. @Override
  4. public ModelAndView handleRequest(HttpServletRequest request,
  5. HttpServletResponse response) throws Exception {
  6. //调用service查找数据库,查询商品列表,这里使用静态数据模拟
  7. List<Items> itemsList=new ArrayList<Items>();
  8. Items items_1=new Items();
  9. items_1.setName("联想笔记本");
  10. items_1.setPrice(6000f);
  11. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  12.  
  13. Items items_2 = new Items();
  14. items_2.setName("苹果手机");
  15. items_2.setPrice(5000f);
  16. items_2.setDetail("iphone6苹果手机!");
  17.  
  18. itemsList.add(items_1);
  19. itemsList.add(items_2);
  20.  
  21. //返回ModelAndView
  22. ModelAndView modelAndView=new ModelAndView();
  23. modelAndView.addObject("itemsList", itemsList);
  24. modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
  25. return modelAndView;
  26. }
  27.  
  28. }

6视图编写

创建/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. <form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
  13. 查询条件:
  14. <table width="100%" border=1>
  15. <tr>
  16. <td><input type="submit" value="查询"/></td>
  17. </tr>
  18. </table>
  19. 商品列表:
  20. <table width="100%" border=1>
  21. <tr>
  22. <td>商品名称</td>
  23. <td>商品价格</td>
  24. <td>生产日期</td>
  25. <td>商品描述</td>
  26. <td>操作</td>
  27. </tr>
  28. <c:forEach items="${itemsList }" var="item">
  29. <tr>
  30. <td>${item.name }</td>
  31. <td>${item.price }</td>
  32. <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
  33. <td>${item.detail }</td>
  34.  
  35. <td><a href="${pageContext.request.contextPath }/item/editItem.action?id=${item.id}">修改</a></td>
  36.  
  37. </tr>
  38. </c:forEach>
  39.  
  40. </table>
  41. </form>
  42. </body>
  43.  
  44. </html>

7配置Handler

在spring容器中(springmvc.xml)加载编写的Handler。

  1. <!-- 配置Handler -->
  2. <bean name="/queryItems.action" class="joanna.yan.ssm.controller.ItemsController1"/>

8配置处理器映射器

在classpath下的springmvc.xml中配置处理器映射器。

  1. <!-- 配置处理器映射器
  2. 将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
  3. -->
  4. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

9配置视图解析器

需要在springmvc.xml中配置解析jsp的视图解析器。

  1. <!-- 配置视图解析器
  2. 解析jsp视图,默认使用jstl标签,所有classpath下得有jstl的包
  3. -->
  4. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

10项目部署调试

将项目部署至Tomcat,访问http://localhost:8080/SpringMVC/queryItems.action

效果图:

从目前上面的代码来看,springmvc中一个类就一个方法,而struts中一个类可以写多个方法,很不方便。早期确实是这么干的,但是后来SpringMVC提倡用注解开发。

11.非注解的处理器映射器和适配器

11.1非注解的处理器映射器

前面我们配置的org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping是非注解的处理器映射器。这种映射器其实有一个问题就是要一个bean里面配置一个url。

现在我们再配置另一个非注解映射器

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,它会将url和handler集中进行配置。

  1. <!-- 配置Handler -->
  2. <bean id="ItemsController1" name="/queryItems.action" class="joanna.yan.ssm.controller.ItemsController1"/>
  3.  
  4. <!-- 配置处理器映射器
  5. 将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
  6. -->
  7. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  8.  
  9. <!-- 简单url映射
  10. simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版,
  11. 它可以将url和处理器bean的id进行统一映射配置。
  12. -->
  13. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  14. <property name="mappings">
  15. <props>
  16. <!-- 对ItemsController1进行url映射,url是/queryItems1.action -->
  17. <prop key="/queryItems1.action">ItemsController1</prop>
  18. <prop key="/queryItems2.action">ItemsController1</prop>
  19. </props>
  20. </property>
  21. </bean>

疑问:可以同时配置这两个映射器吗?

解答:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

11.2非注解的处理器适配器

前面我们配置的org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter是一个非注解的适配器。它要求你编写的Handler要实现Controller接口。

再说另一个非注解的适配器:

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter。它要求编写的Handler实现HttpRequestHandler接口。

  1. public class ItemsController2 implements HttpRequestHandler{
  2.  
  3. @Override
  4. public void handleRequest(HttpServletRequest request, HttpServletResponse response)
  5. throws ServletException, IOException {
  6. //调用service查找数据库,查询商品列表,这里使用静态数据模拟
  7. List<Items> itemsList=new ArrayList<Items>();
  8. Items items_1=new Items();
  9. items_1.setName("联想笔记本");
  10. items_1.setPrice(6000f);
  11. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  12.  
  13. Items items_2 = new Items();
  14. items_2.setName("苹果手机");
  15. items_2.setPrice(5000f);
  16. items_2.setDetail("iphone6苹果手机!");
  17.  
  18. itemsList.add(items_1);
  19. itemsList.add(items_2);
  20. //设置模型数据
  21. request.setAttribute("itemsList", itemsList);
  22. //设置转发的视图
  23. request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
  24.  
  25. // 从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据:
  26. // response.setCharacterEncoding("utf-8");
  27. // response.setContentType("application/json;charset=utf-8");
  28. // response.getWriter().write("json串");
  29. }
  30. }

在springmvc.xml中配置:

12.DispatcherServlet.properties

前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,则使用默认加载的。

13.注解的处理器映射器和适配器

在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。

在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。

在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。

在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

13.1配置注解映射器和适配器

  1. <!--注解映射器 -->
  2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  3. <!--注解适配器 -->
  4. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
  5. <!--使用mvc:annotation-driven代替上边注解映射器和注解适配器 配置
  6. mvc:annotation-driven默认加载很多的参数绑定方法,
  7. 比如json转换解析器就默认加载了,如果使用mvc:annotation-driven就不用配置上面的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
  8. 实际开发时使用mvc:annotation-driven
  9. -->
  10. <!-- <mvc:annotation-driven></mvc:annotation-driven> -->

13.2开发注解Handler

使用注解的映射器和注解的适配器。(注解的映射器和注解的适配器必须配对使用)

  1. /**
  2. * 开发注解Handler
  3. * 使用@Controller标明它是一个控制器
  4. * @author Joanna.Yan
  5. *
  6. */
  7. @Controller
  8. public class ItemsController3{
  9.  
  10. //商品查询列表
  11. //@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url
  12. //一般建议将url和方法名写成一样,方便维护
  13. @RequestMapping("/queryItems")
  14. public ModelAndView queryItems() throws Exception{
  15. //调用service查找数据库,查询商品列表,这里使用静态数据模拟
  16. List<Items> itemsList=new ArrayList<Items>();
  17. Items items_1=new Items();
  18. items_1.setName("联想笔记本");
  19. items_1.setPrice(6000f);
  20. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  21.  
  22. Items items_2 = new Items();
  23. items_2.setName("苹果手机");
  24. items_2.setPrice(5000f);
  25. items_2.setDetail("iphone6苹果手机!");
  26.  
  27. itemsList.add(items_1);
  28. itemsList.add(items_2);
  29. //返回ModelAndView
  30. ModelAndView modelAndView=new ModelAndView();
  31. modelAndView.addObject("itemsList", itemsList);
  32. //指定视图
  33. modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
  34. return modelAndView;
  35. }
  36. //定义其它方法
  37. //商品添加
  38. //商品修改
  39. }

13.3在spring容器中加载Handler

  1. <!-- 对于注解的Handler可以单个配置
  2. 实际开发中建议使用组件扫描
  3. -->
  4. <!-- <bean class="joanna.yan.ssm.controller.ItemsController3" /> -->
  5. <!-- 可以扫描controller、service、...
  6. 这里让扫描controller,指定controller的包
  7. -->
  8. <context:component-scan base-package="joanna.yan.ssm.controller"></context:component-scan>

如果此文对您有帮助,微信打赏我一下吧~

Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(十四)——SpringMVC和MyBatis整合

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7010363.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十三)--S ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...

  4. Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(九)--My ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--My ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...

随机推荐

  1. Springmvc的工作流程

    1.向服务器发送http请求,请求被前端控制器DispatcherServlet捕获. 2.DispatcherServlet根据servlet.xml中的配置进行URL解析后,得到(URL),然后根 ...

  2. final修饰的变量是引用不能变还是对象的内容不能变?

    int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...

  3. Laravel 中使用 Redis 数据库

    一.前言 Redis 是一个开源高效的键值对存储系统,它通常用作为一个数据结构服务器来存储键值对,它可以支持字符串.散列.列表.集合.有序集合. 1. 安装 predis/predis 在 Larav ...

  4. iOS开发 - Swift实现清除缓存功能

    前言: 开发移动应用时,请求网络资源是再常见不过的功能.如果每次都去请求,不但浪费时间,用户体验也会变差,所以移动应用都会做离线缓存处理,其中已图片缓存最为常见. 但是时间长了,离线缓存会占用大量的手 ...

  5. C#控制台程序使用Log4net日志组件

    1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例   项目源码在文章底部 2.首先创建一个控制台程序,引入Log4n ...

  6. SSH 远程执行任务

    SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进 ...

  7. Kafka学习-Producer和Customer

    在上一篇kafka入门的基础之上,本篇主要介绍Kafka的生产者和消费者. Kafka 生产者 kafka Producer发布消息记录到Kakfa集群.生产者是线程安全的,可以在多个线程之间共享生产 ...

  8. MySQL编译安装错误提示合集

    1>安装mysql在初始化的时候,出现/usr/local/mysql/bin/mysqld:error while loading shared libraries:libaio.so.1 : ...

  9. Samba文件共享服务

    Samba起源: 早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序:NFS ...

  10. Cisco Packet Tracer做单臂路由的过程

    Cisco Packet Tracer版本:6.0.0.0045 单臂路由 VLAN规划 switch 0上配置:Switch>enSwitch(config)#vlan 2 #创建vlan2S ...