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入门教程之认识变量相关概 ...
随机推荐
- Struts2与Struts的区别
Struts2与Struts的区别 从Struts2的发展过程来看,Struts2继承了Struts与WebWork的血脉,Struts2取两者之精华,形成新德框架,但是struts2还是更多的继承了 ...
- SweetAlert – 替代 Alert 的漂亮的提示效果
Sweet Alert 是一个替代传统的 JavaScript Alert 的漂亮提示效果.SweetAlert 自动居中对齐在页面中央,不管您使用的是台式电脑,手机或平板电脑看起来效果都很棒.另外提 ...
- (转)JavaScript一:为什么学习JavaScript?
Web程序不论是B/S(Browser/Server)还是C/S(Client/Server)架构,分为客户端程序与服务器端程序两种.ASP.NET是开发服务器端程序的强大工具,但是有时候为了降低服务 ...
- AngularJS结合RequireJS做文件合并压缩的那些坑
我在项目使用了AngularJS框架,用RequireJS做异步模块加载(AMD),在做文件合并压缩时,遇到了一些坑,有些只是解决了,但不明白原因. 那些坑 1. build.js里面的paths必须 ...
- C#遍历得到checkboxlist选中值和设置选中项
得到选中项的value值并拼接成一个字符串返回 public string GetChecked(CheckBoxList checkList, string separator) { string ...
- kali 忘记登录密码后重置的方法
首先启动你的卡里系统,等出现引导界面时选择恢复模式.如下图: 再出来一个界面时,选择第二个并按E键进入编辑模式.如下图: 进入编辑模式后找到如下图的代码: 把ro改为rw,并且在.gz 后面写上ini ...
- [outlook]打开以后就自动进入安全模式的解决方法。Outlook start in safe mode.
给客户写了一个Outlook的add-in, 用现在时髦的话应该叫outlook的app. 这个add-in的作用就是把outlook中的email,直接上传到SharePoint中.想要代码的联系我 ...
- Base64与Bitmap转换
Base64与Bitmap互转 /** * 将base64转为bitmap * * @param string * @return */ public Bitmap stringtoBitmap(St ...
- iOS-UIScrollView和UIPageControl的综合实力,滚动图,轮播图
本代码主要实现图片之间的切换 目录结构 代码 ViewController.m文件 #import "ViewController.h" @interface ViewContro ...
- XML解析方案
在iOS中,解析XML的手段有很多 苹果原生 NSXMLParser:SAX方式解析,使用简单 第三方框架 libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析 GDa ...