Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块
spring framework中的spring web MVC模块
1.概述
- spring web mvc是spring框架中的一个模块
- spring web mvc实现了web的MVC架构模式,可以被用于开发web网站
- spring web mvc 实现web网站的原理,如下图:
2.使用spring web mvc开发web应用的步骤
step1:在自己的工程中引入spring web mvc模块
step2:配置spring web mvc模块 中的DispatcherServlet,告诉他要拦截哪些请求
step3:编写controller类
3.spring web mvc中相关知识点
3.1关于spring web mvc 中的DispatcherServlet
DispatcherServlet是spring web mvc 模块的核心部分,DispatcherServlet有如下功能
接收用户请求,并将其分发给controller中的handling method
The
DispatcherServlet
is an actualServlet
(it inherits from theHttpServlet
base class),- 一个web application中可以有多个DispatcherServlet 实例,
- 每个DispatcherServlet实例都有他自己的
WebApplicationContext实例
,TheWebApplicationContext
is an extension of the plainApplicationContext
that has some extra features necessary for web applications.- WebApplicationContext有如下功能:
- it is capable of resolving themes (see Section 22.9, “Using themes”)
- WebApplicationContext有如下功能:
所有的WebApplicationContext实例都继承自root
WebApplicationContext实例
,- The root
WebApplicationContext
应该包含 all the infrastructure【基础】 beans that should be shared between your other contexts and Servlet instances. These inherited beans can be overridden in the servlet-specific scope, and you can define new scope-specific beans local to a given Servlet instance. -
Figure 22.2. Typical context hierarchy in Spring Web MVC
- It is also possible to have just one root context for single DispatcherServlet scenarios.
Figure 22.3. Single root context in Spring Web MVC
Table 22.1. Special bean types in the WebApplicationContext
Bean type Explanation Maps incoming requests to handlers and a list of pre- and post-processors (handler interceptors) based on some criteria the details of which vary by
HandlerMapping
implementation. The most popular implementation supports annotated controllers but other implementations exists as well.HandlerAdapter
Helps the
DispatcherServlet
to invoke a handler mapped to a request regardless of the handler is actually invoked. For example, invoking an annotated controller requires resolving various annotations. Thus the main purpose of aHandlerAdapter
is to shield theDispatcherServlet
from such details.Maps exceptions to views also allowing for more complex exception handling code.
Resolves logical String-based view names to actual
View
types.Resolves the locale a client is using and possibly their time zone, in order to be able to offer internationalized views
Resolves themes your web application can use, for example, to offer personalized layouts
Parses multi-part requests for example to support processing file uploads from HTML forms.
Stores and retrieves the "input" and the "output"
FlashMap
that can be used to pass attributes from one request to another, usually across a redirect.要想
DispatcherServlet
能够拦截到用户的请求,还需要做一些相应的配置,如使用URL mapping的方式将用户请求映射到DispatcherServlet。可以有多种方法来使得用户请求被映射到DispatcherServlet上,
方法一,直接继承spring MVC 模块的WebApplicationInitializer接口,来配置spring MVC模块的DispatcherServlet,使其可以接收到用户请求
将用户请求以URL方式映射到spring web mvc模块的 DispatcherServlet 上,从而使得用户请求能够通过DispatcherServlet被转交给controller来进行处理,并得到处理结果作为响应反馈给用户
- 下面的例子中all requests starting with
/example
will be handled by theDispatcherServlet
instance namedexample
. /*
1)WebApplicationInitializer
is an interface provided by Spring MVC that ensures your code-based configuration is detected and automatically used to initialize any Servlet 3 container.
2)
*/
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("example", new DispatcherServlet());
registration.setLoadOnStartup(1);
registration.addMapping("/example/*");
} }使用上述方法(即Java代码的方法)配置URL映射,将用户请求交给DispatcherServlet来分发给对应的Controller,这与传统情况下使用web.xml文件配置相应映射的效果是一样的,如本例中上述代码的效果和下面的web.xml的配置代码是等价的(传统模式下使用web.xml配置用户请求URL,使得用户请求能够被Servlet拦截(如被spring web mvc的DispatcherServlet拦截))
- 方法二:传统模式下使用web.xml将用户请求URL映射待DispatcherServlet上
- 传统模式下在web.xml中配置请求URL和servlet的映射关系,如下所示:
<!--上面的Java代码和传统模式下web.xml文件下这一段代码是等效的 都是将用户请求/example/*交给web应用的servlet(例子中指的是spring web mvc中的DispatcherServlet)去处理 让servlet把接收到的用户请求交给controller层相应的handling method去处理--> <web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping> </web-app>- You can customize individual
DispatcherServlet
instances by adding Servlet initialization parameters (init-param
elements) to the Servlet declaration in theweb.xml
file. See the following table for the list of supported parameters.
Parameter Explanation contextClass
Class that implements
WebApplicationContext
, which instantiates the context used by this Servlet. By default, theXmlWebApplicationContext
is used.contextConfigLocation
String that is passed to the context instance (specified by
contextClass
) to indicate where context(s) can be found. The string consists potentially of multiple strings (using a comma as a delimiter) to support multiple contexts. In case of multiple context locations with beans that are defined twice, the latest location takes precedence.namespace
Namespace of the
WebApplicationContext
. Defaults to[servlet-name]-servlet
.
方法三,实现WebApplicationInitializer接口
import org.springframework.web.WebApplicationInitializer; public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml"); ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
} }(推荐使用本方法)方法四,继承AbstractAnnotationConfigDispatcherServletInitializer类(方法三中所提及的WebApplicationInitializer接口的实现类)
example1,使用Java-based Spring configuration:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override
protected Class<?>[] getRootConfigClasses() {
return null;
} @Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { MyWebConfig.class };
} @Override
protected String[] getServletMappings() {
return new String[] { "/" };
} }example2,If using XML-based Spring configuration, you should extend directly from
AbstractDispatcherServletInitializer
:public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { @Override
protected WebApplicationContext createRootApplicationContext() {
return null;
} @Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
} @Override
protected String[] getServletMappings() {
return new String[] { "/" };
} }AbstractDispatcherServletInitializer
also provides a convenient way to addFilter
instances and have them automatically mapped to theDispatcherServlet
:public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { // ... @Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
} }
3.2 Implementing Controllers
方法一:annotion-based Controller
概述:使用 @RequestMapping
, @RequestParam
,@ModelAttribute
,等注解可以定义一个类为controller类,使得该类可以处理用户的请求。
编程思路:
- step1,要想spring能够识别上述注解,必须要先在配置文件中开启上述注解的识别方式
<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="org.springframework.samples.petclinic.web"/> <!-- ... --> </beans>
- step2,The
@Controller
annotation indicates that a particular class serves the role of a controller.- The ServletDispatcher scans such annotated classes for mapped methods and detects @RequestMapping annotations (see the next section).
- step3,
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping - 例如,
@Controller
public class HelloWorldController { @RequestMapping("/helloWorld")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello World!");
return "helloWorld";
}
}@Controller
@RequestMapping("/appointments")
public class AppointmentsController { private final AppointmentBook appointmentBook; @Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
} @RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
} @RequestMapping(path = "/{day}", method = RequestMethod.GET)
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) {
return appointmentBook.getAppointmentsForDay(day);
} @RequestMapping(path = "/new", method = RequestMethod.GET)
public AppointmentForm getNewForm() {
return new AppointmentForm();
} @RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
if (result.hasErrors()) {
return "appointments/new";
}
appointmentBook.addAppointment(appointment);
return "redirect:/appointments";
}
}上面的例子和下面的例子等价:
@Controller
@RequestMapping("/appointments")
public class AppointmentsController { private final AppointmentBook appointmentBook; @Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
} @GetMapping
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
} @GetMapping("/{day}")
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) {
return appointmentBook.getAppointmentsForDay(day);
} @GetMapping("/new")
public AppointmentForm getNewForm() {
return new AppointmentForm();
} @PostMapping
public String add(@Valid AppointmentForm appointment, BindingResult result) {
if (result.hasErrors()) {
return "appointments/new";
}
appointmentBook.addAppointment(appointment);
return "redirect:/appointments";
}
}In the above example,
@RequestMapping
is used in a number of places. The first usage is on the type (class) level, which indicates that all handler methods in this controller are relative to the/appointments
path. Theget()
method has a further@RequestMapping
refinement: it only acceptsGET
requests, meaning that an HTTPGET
for/appointments
invokes this method. Theadd()
has a similar refinement, and thegetNewForm()
combines the definition of HTTP method and path into one, so thatGET
requests forappointments/new
are handled by that method.The
getForDay()
method shows another usage of@RequestMapping
: URI templates. (See the section called “URI Template Patterns”).A
@RequestMapping
on the class level is not required. Without it, all paths are simply absolute, and not relative. The following example from the PetClinic sample application shows a multi-action controller using@RequestMapping
:@Controller
public class ClinicController { private final Clinic clinic; @Autowired
public ClinicController(Clinic clinic) {
this.clinic = clinic;
} @RequestMapping("/")
public void welcomeHandler() {
} @RequestMapping("/vets")
public ModelMap vetsHandler() {
return new ModelMap(this.clinic.getVets());
} }
- step1,要想spring能够识别上述注解,必须要先在配置文件中开启上述注解的识别方式
实际使用实例:
- spring-projects Org on Github,网站上有一些使用注解方式开发的controllers实例,包括MvcShowcase, MvcAjax, MvcBasic, PetClinic, PetCare, and others.
Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块的更多相关文章
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用Spring Framework开发自己的应用程序
1.直接基于spring framework开发自己的应用程序: 1.1参考资料: Spring官网spring-framework.4.3.5.RELAESE的Reference Documenta ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->关于spring framework中的beans
Spring framework中的beans 1.概述 bean其实就是各个类实例化后的对象,即objects spring framework的IOC容器所管理的基本单元就是bean spring ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系
XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中web相关的知识(概述)
Spring Framework中web相关的知识 1.概述: 参考资料:官网documentation中第22小节内容 关于spring web mvc: spring framework中拥有自 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework概述
Spring Framework是什么? it is a potential one-stop-shop for building your enterprise-ready applications ...
- Spring Framework------>version4.3.5----->Reference学习心得----->总结
1.Spring Framework概述: 有很多可用版本,网址http://projects.spring.io/spring-framework/ 2.Spring Framework ...
- Spring官方文档翻译——15.1 介绍Spring Web MVC框架
Part V. The Web 文档的这一部分介绍了Spring框架对展现层的支持(尤其是基于web的展现层) Spring拥有自己的web框架--Spring Web MVC.在前两章中会有介绍. ...
- Spring boot学习1 构建微服务:Spring boot 入门篇
Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
随机推荐
- C++设计模式-TemplateMethod模板方法模式
Template模板方法模式作用:定义一个操作中的算法的骨架.而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 其关键是将通用算法(逻辑)封装在抽象基 ...
- IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)
在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...
- vi和vim 的常用操作
到文件末尾: ESC + shift G : 到文件头: G + G: 整块模式 快捷键 [不使用鼠标,来选择块] v 字符选择,会将光标经过的地方反白选择! V ...
- POS管理系统之出入库单分页查询
JSP: <html> <head> <title>My JSP 'inOutKuPage.jsp' starting page</title> ...
- JavaScript笔记:对象及数组
一.对象 在javascript中,对象是拥有属性和方法的一种基本数据类型 1.创建object 创建object实例有如下两种方式: 使用new操作符后跟object构造函数创建,如下代码: var ...
- 阿里云 esc 云服务器无缘无故的一次/usr/bin 目录丢失导致整个服务无法启动 # ./shutdown.sh ./shutdown.sh: line 41: dirname:command not found cannot find /catalina.sh the find /catalina.sh The file is absent or does not have execute
总结上个星期服务器环境上的一个问题,一直再忙AR.防近视的项目没时间整理.刚好忙完项目认真回顾8月30发生的一个让人奇葩的问题. 早上把项目上的一些问题优化完,快到中午吃饭的时间频繁的启动导致/usr ...
- Dell_R710 centos5.4 网卡(BCM5709)中断故障解决
环境:Dell R710 Centos 5.4 i386 现象:正常运行中无故断网,没有规律 原因:RedHat As5.X 版本中的Broadcom NetXtreme II BCM 5709 ...
- 采用TCP协议的PIC32MZ ethernet bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 趁热打铁,在上一PIC ...
- .NET (一)委托第一讲:什么是委托
1.为什么要使用委托? 生活中的委托就是委托他人帮我们去办一件事情,程序中的委托类似.看下面的例子 class Class1 { static void Main(String[] args) { L ...
- activemq的几种基本通信方式总结
简介 在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择.这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨.activem ...