SpringMVC从入门到精通之第二章
这一章原本我是想写一个入门程序的,但是后来仔细想了一下,先从下面的图中的组件用代码来介绍,可能更效果会更加好一点。
第一节:开发准备
介绍之前先说下我的开发调试环境:
JDK 1.7的64位 、Eclipse Kepler(J2EE) 64位的、Tomcat 7.0.42 mysql 5.1、SQLyog(这是我的标配)
springmvc 版本 3.2(这个大家可以到网上自行下载最好要有源码)
第二节:开发与配置
第一步发送request请求,这个一步我就不说了,之前有看到慕课有很多朋友分享了http协议的介绍传送。
开发环境介绍过了,下面来创建一个工程:如下图 整个工程结构
在hanson.springmvc.pojo中新建一个Items类包含属性如下图:
用户发送请求到前端控制器。前端控制器需要在web.xml中配置:
- <!-- 配置前端控制器 -->
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--加载前端控制器配置文件 上下文配置位置 -->
- <init-param>
- <!-- 备注: contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加 载WEB-INF/[DispatcherServlet的Servlet
- 名字]-servlet.xml(例如springmvc-servlet.xml)。 -->
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext-servlet.xml</param-value>
- </init-param> <!-- 表示随WEB服务器启动 -->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <!-- 备注:可以拦截三种请求
- 第一种:拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action
- 此方法最简单,不会导致静态资源(jpg,js,css)被拦截.
- 第二种:拦截所有,设置为/,例如:/user/add /user/add.action此方法可以实现REST风格的url,
- 很多互联网类型的应用使用这种方式.但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示.需要特殊处理.
- 第三种:拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功. -->
- <url-pattern>*.action</url-pattern>
- </servlet-mapping>
工程结构图:
到这里前端配置器就算配置完了,目前这个配置足够我们学习springmvc了。
你需要知道的是:前端控制器的作用,如何配置,以及拦截什么样的请求。对于restful风格的请求我会在后面讲到。
第三节 Handler的开发
开发之前先说一说处理器适配器。说之前就得说一说适配器模式我们就拿生活中的例子来解释一下适配器模式,现在只有一个三相的插座,但是现在却有一个三相插头的洗衣机和一个二相插头的电视机,那么洗衣机当然没有问题,可以插到三相插座上,但是电视机却没办法插了,于是人们想出了一个适配器,这个适配器一头插在这个三相插座上,另外一端放出一个二相插座,然后电视就插在了这个适配器的二相插座上了,最后洗衣机,电视机都可以使用了。总结起来就是一句:将一个类的接口适配成用户所期待的。
加上之前说的,想要看清3D电影,就必须带上3D眼镜。
springmvc中也是这样要求处理器实现多种接口才能被处理器适配器执行。
下面来介绍几个处理器适配器,以及他们能够执行的处理器。
第一个:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter简单的处理器适配器,
此适配器能够执行实现org.springframework.web.servlet.mvc.Controller接口的处理器,来看下源码:
- public class SimpleControllerHandlerAdapter implements HandlerAdapter {
- public boolean supports(Object handler) {
- //该类支持Controller类型的处理器
- return (handler instanceof Controller);
- }
- public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- return ((Controller) handler).handleRequest(request, response); }
- public long getLastModified(HttpServletRequest request, Object handler) {
- if (handler instanceof LastModified) {
- return ((LastModified) handler).getLastModified(request); } return -1L;
- }
- }
既然要求这个适配器支持的类型是Controller类型的,那我们就实现这个接口
代码如下:
- package hanson.springmvc.web.controller;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.Controller;
- /** * *
- @ClassName: ItemsController1
- * @Description: TODO(简单的处理器适配器支持执行实现Controller接口的处理器)
- * @author: Hanson
- * @date: 2016年1月14日 下午11:59:06
- * */
- public class ItemsController1 implements Controller {
- @Override
- public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
- return null;
- }
- }
第四节
ModelAndView对象封装了模型数据和视图对象,有一个组件叫视图解析器,就是用来解析这个对象的,它可以把这个对象解析成两部分一个为Model另一个为View然后将model渲染到View上面(简单点就是将model里面的数据放到页面),最终返回给用户。
我用静态数据模拟一下这个实现。
- public ModelAndView handleRequest(HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- // 商品列表
- List<Items> itemsList = new ArrayList<Items>();
- Items items_2 = new Items();
- items_2.setName("苹果手机");
- items_2.setPrice(6088f);
- items_2.setDetail("iphone6s苹果手机!");
- itemsList.add(items_2);
- // 创建modelAndView:填充数据、设置视图
- ModelAndView modelAndView = new ModelAndView();
- // 填充数据
- modelAndView.addObject("itemsList", itemsList);// 类似request.setAttribute("","")
- modelAndView.addObject("message", "Hello World!");
- // 视图:逻辑名称
- modelAndView.setViewName("/itemsList");// request.getRequestDispatcher("url").forward(request, response);
- return modelAndView;
- }
jsp中代码:
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>查询商品列表</title>
- </head>
- <body>
- 商品列表:
- <table width="100%" border=1>
- <tr>
- <td>商品名称</td>
- <td>商品价格</td>
- <td>商品描述</td>
- </tr>
- <c:forEach items="${itemsList}" var="item">
- <tr>
- <td>${item.name} </td>
- <td>${item.price }</td>
- <td>${item.detail }</td>
- </tr>
- </c:forEach>
- </table>
- </body>
- </html>
再看工程结构:
第五节
下面我们来看看之前提到的视图解析器org.springframework.web.servlet.view.InternalResourceViewResolver类是用来解析jsp的它要求类路径下面有jstl的jar。
它需要在applicationContext-servlet.xml中配置:
- <!-- 配置视图解析器 -->
- <!-- InternalResourceViewResolver:支持JSP视图解析 -->
- <!-- viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar包; -->
- <!-- prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为: -->
- <!-- 前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello, -->
- <!-- 则最终返回的jsp视图地址 "WEB-INF/jsp/hello.jsp" -->
- <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>
重点:到这里你应该知道处理器适配器(简单的处理器适配器、处理器适配器执行处理器,处理器应该具备那些要求才能被执行,视图解析器、以及ModelAndView对象)
第六节
疑问?前端控制器要怎么才能根据URL找到处理器呢?
本节知识点:处理器映射器
前端控制器会去调用处理器映射器找到处理器。
现在来介绍一下处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping:
表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,
且指定bean的name为请求的url,且必须以.action结尾(web.xml配置)。
配置在:applicationContext-servlet.xml
- <!-- 配置BeanNameUrl处理器映射器 -->
- <!-- BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置, -->
- <!-- 且指定bean的name为请求的url,且必须以.action结尾。 -->
- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
- <!-- controller配置 --> <!-- name="/items1.action":前边配置的处理器映射器为BeanNameUrlHandlerMapping, -->
- <!-- 如果请求的URL 为“上下文/items1.action”将会成功映射到ItemList1控制器。 -->
- <bean name="/items1.action"
- class="hanson.springmvc.web.controller.ItemsController1" />
作者: HansonQ
链接:http://www.imooc.com/article/3975
来源:慕课网
SpringMVC从入门到精通之第二章的更多相关文章
- SpringMVC从入门到精通之第一章
第一节 简介:SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需通过中间整合层进行整合.SpringMVC是基于MVC的WEB框架.MVC设计模式在B/S下的应用: ...
- ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...
- SpringMVC从入门到精通之第四章
第一个知识点:@Controller注解,用于标识这个类是一个后端控制器(类似struts中的action),主要作用就是接受页面的参数,转发页面.中间的业务逻辑是调用业务类处理的这个就是MVC设计模 ...
- Google C++测试框架系列入门篇:第二章 开始一个新项目
上一篇:Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest? 原始链接:Setting up a New Test Project 词汇表 版本号:v_0.1 开始一个新项目 ...
- python从入门到实践 第二章
python变量赋值: python的变量赋值 可以是单引号 也可以是双引号python 变量赋值的时候不能加()的 比如 name = "My Name is GF"变量赋值的时 ...
- ActiveMQ 快速入门教程系列 第二章 发布-订阅者模式实现
第二章我们会介绍怎样实现一个发布者对多个订阅者的消息传递 Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息:而queue则 ...
- 网络安全从入门到精通 (第二章-6) 后端基础PHP—表单验证
本文内容: 什么是表单? 如何创建一个表单: 接收并验证: PHP和数据库交互 1,什么事表单? 表单在网页中主要负责数据采集. 表单由三部分组成: 表单标签:这里面包含了处理表单数据所用动态脚本的U ...
- SpringMVC从入门到精通之第三章
上一章节中首先讲解前端控制器DispatcherServlet的配置包括加载springmvc文件.拦截什么样的请求等还有两个组件:分别是适配器和映射器(另外再补充一组) 非注解的处理器映射器 处理器 ...
- Batch入门教程丨第二章:认识变量相关概念
在前两期的学习内容中,我们已经了解了Batch入门教程有关的知识和编程方法,如何编写和运行Windows Batch程序,脚本语言的入门方式等,今天我们将继续深入学习Batch入门教程之认识变量相关概 ...
随机推荐
- 【今日推荐】移动 Web 开发的10个最佳 JavaScript 框架
选择正确的 JavaScript 框架,对于开发移动 Web 应用程序是至关重要的,也是移动应用程序开发的一项重要任务.开发人员可以使用框架实现的功能高效地达到他们的开发目标.这些预实现的组件采用优秀 ...
- Method Draw – 很好用的 SVG 在线编辑器
Method Draw 是一款在线 SVG 编辑器,是 SVG Edit 的一个分支.Method Draw 的目的是改进 SVG Edit 的可用性和用户体验.它移除了 line-caps/corn ...
- java--POI解析excel兼容性问题
近日,使用POI解析excel,发现2003版本的excel解析与2007版本的excel解析存在问题.特此总结: 1.所需jar包 : 2.java类代码(读取excel文件): public vo ...
- 从客户端(?)中检测到有潜在危险的 Request.Path 值 的解决方案
public ActionResult A(string title) { return Redirect("B"+((String.IsNullOrEmpty(title))?& ...
- 理解React中es6方法创建组件的this
首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...
- SharePoint2013 错误
英文错误信息: This operation can be performed only on a computer that is joined to a server farm by users ...
- Android上的MVP:如何组织显示层的内容
MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于M ...
- NSNotificationCenter应用总结
通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,例如 View 加载完后会触发 viewDidLoad. Apple 还为我们提供了另一种通知响应方式,那就是 NSNot ...
- iOS 图片加载导致内存警告
虽然UITableView和UICollectionView都有cell复用机制,但是如果利用SDWebImage加载的图片本身过大且cell复用池中的个数比较多(cell的Size越小,复用池中的c ...
- mvc 开发razor模式注意事项
1 情景为:mvc模式开发的.cshtml画面,里面有@if语句,if语句里面还有其他的代码,画面总是报错:if模块中没有对应的"}",什么问题 跟踪了之后,判定cs语句没问题,那 ...