作为一个 J2EE 的开发者,我们基本上是开发基于 WEB 的应用系统。事实上,工作流,状态管理以及验证都是需要解决的重要功能。而 HTTP 协议的无状态性决定了这些功能都不容易实现。 Spring 的 WEB 框架就是来帮助我们解决这些问题的。使用 Spring ,我们可以让 WEB 框架自动将传递进来的请求参数填充到模型对象中,同时提供验证和错误处理。还可以管理用户在 WEB 表单中创建的对象的状态。在了解 SpringMVC 之前,我们先来复习下 MVC.
MVC 从逻辑上把应用分为模型组件,视图组件和控制器组件。其中控制器组件又可以细分为:前端控制器组件和后端控制器组件。
我们来看一下 MVC 的基本工作流程:
首先是客户端(通常是浏览器)发出一个请求。第一个接受这个请求的组件一般是一个前端控制器。它将不同的请求交给不同的后端控制器来处理,而在后端控制器里面又可以调用相应的模型对象来处理具体的业务逻辑,最后再返回一个特定的视图响应给客户端。
现在大家应该可以理解 MVC 的设计思想了。拿我们比较熟悉的 struts 框架来说,前端控制器就是 ActionServlet, 后端控制器就是 Action. 请求的 URL 和后端控制器的映射关系在 struts-config.xml 上的 <action-mappings> 里面配置,模型对象就是我们平常写的 DAO/DTO ,返回的视图类型一般就是 jsp 了。
那么,在 spring MVC 中又是怎样的呢 ? ,我们先按上面对号入座地说一下。第一个接受这个请求的前端控制器叫 DispatcherServlet ,后端控制器叫 Controller 。负责处理请求 URL 和后端控制器映射的叫 HandMapping ,它有多种类型,比较灵活,也是在一个 xml 文件上进行配置。负责业务逻辑处理的模型对象一般也是我们平常写的 DAO/DTO 组件。只是它最后的返回更灵活, Controller 返回一个 ModelAndView 对象给 DispatcherServlet , ModelAndView 可以携带一个视图对象,也可以携带一个视图对象的逻辑名。如果携带的是一个视图对象的逻辑名,那 DispatcherServlet 需要一个 ViewResolver 来查找用于渲染回应的视图对象。最后, DispatcherServlet 将请求分派给 ModelAndView 对象指定的视图对象。视图对象负责渲染返回给客户的回应。
我们学习知识,一样要注意运用类比迁移的方法。有人说,我学会了 struts ,但学不会 springMVC 。这是说不过去的。因为二者的思想完全一致。所以,我们只需要学习它们不一样的地方就可以啦。好,我们现在先跑一个最简单的例子,让大家对构建 SpringMVC 的基本步骤有个直观的认识。大家要边跑边跟 struts 做比较。
(1) 建立动态 web 工程,导入 spring 的 jar 包。
(2) 配置 DispatcherServlet
DispatcherServlet 是 SpringMVC 的核心,将下面 Servlet 的注册信息登记在 web.xml 中。一定要记住: Servlet 跟伴侣一样,要结婚,先得注册登记!
< servlet >
< servlet-name > test </ servlet-name > < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >
< load-on-startup > 1 </ load-on-startup >
</ servlet >
< servlet-mapping >
< servlet-name > test </ servlet-name >
< url-pattern > *.do </ url-pattern >
</ servlet-mapping >
(3) 编写 Controller ,做核心配置文件,并配置 url 和 Controller 的映射
package com.wepull.test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
request.setAttribute( "hello" , "welcome to spring!" );
return new ModelAndView( " welcome " );
}
}
我们知道 Struts 有个 XML 格式的核心配置文件, springMVC 当然也有,在 WEB-INF 下新建一 XML 文件 : test -servlet.xml. 注意,这里的 test 取决于 servlet 的名字 . 当 DispatcherServlet 载入后,它将试图从这个文件中载入应用上下文。
<? xml version = "1.0" encoding = "UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
<!-- 缺省映射处理器,不需要明确声明,但声明后就非常清楚使用的是哪个映射处理器 --> < bean id = "beanNameUrlMapping"
class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" >
</ bean >
<!-- 这里的 name 属性有两个职责,既定义 Bean 的名字,也定义需要这个控制器处理的 URL 样式 -->
< bean name = "/hello.do"
class = "com.wepull.test.HelloController" >
</ bean >
</ beans >
上面可能有人奇怪,为什么不用 id 属性,而设置 name 属性。这里是因为 URL 中含有 XML id 属性非法字符——特别是斜杠( / ) ;
(4) 配置一个视图解析器将控制器与 JSP 结合起来。
将解析器的配置片段加到上面的 test-servlet.xml 中。
< bean id = "viewResolver"
class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name = "prefix" value = "/WEB-INF/jsp/" />
< property name = "suffix" value = ".jsp" />
</ bean >
InternalResourceViewResolver 在 ModelAndView 返回的视图名前加上 prefix 属性配置的前缀 , 再在最后加上 suffix 属性配置的后缀。由于 HelloController 返回的 ModelAndView 中视图名为 welcome, 所以 InternalResourceViewResolver 将在 /WEB-INF/jsp/welcome.jsp 处查找视图。
(5) 编写呈现给用户的 jsp 文件。
/WEB-INF/jsp/welcome.jsp
<%@ page contentType = "text/html; charset=UTF-8" %>
<%@ page isELIgnored = "false" %>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
< title > Hello World! </ title >
</ head >
< body >
< h2 >
${hello}
</ h2 >
</ body >
</ html >
完成后启动服务器,在浏览器地址栏上输入 http://locahost:8080/projectName/hello.do 就可以访问了。
对照一下,我们发现 SpringMVC 跟 Struts 大同小异。只是有两处映射, SpringMVC 做的相对灵活。哪两处呢?
(1) url 和动作 ( 后端控制器 ) 的映射。
springMVC 里有个映射处理器 (HandlerMapping) 的概念。它实际上是一个处理器映射 Bean, 用来将一个控制器指定到一个 URL 上。 Spring 提供了三种有用的 HandlerMapping 的实现:
—— BeanNameUrlHandlerMapping
根据控制器的名字将控制器映射到 URL
—— SimpleUrlHandlerMapping
用上下文配置文件中定义的属性集合将控制器映射到 URL
—— CommonsPathMapHandlerMapping
使用控制器代码中的元数据将控制器映射到 URL
(2) 逻辑视图名和视图对象的映射。
springMVC 里还有个视图解析器 (ViewResolver) 的概念。它决定了 ModelAndView 对象的逻辑视图名如何解析成一个用于将结果渲染给用户的视图 Bean..Spring 有四种 ViewResolver 实现:
—— InternalResourceViewResolver
将逻辑视图名解析成一个用模板文件 ( 如 JSP 和 Velocity 模板 ) 渲染的视图对象
—— BeanNameViewResolver
将逻辑视图名解析成一个 DispatcherServlet 应用上下文中的视图 Bean
—— ResourceBundleViewResolver
将逻辑视图名解析成一个 ResourceBundler 中的视图对象
—— XmlViewResolver
从一个 XML 文件中解析视图 Bean, 这个文件是从 DispatcherServlet 应用上下文中分离出来的。
好啦,今天就算是 SpringMVC 的一个入门。建议大家将 Struts 和 SpringMVC 对照着学习,那样效果会更好。与人分享,集思广益。希望大家都能够学习快乐,工作顺心。下次再见。
分享到:
相关推荐
Spring MVC 是一个广泛应用于GUI 开发的设计模式,是目前业界主流的Web 开发框架,也是一种热门的开发技能。 本书分两大部分,详细介绍了Servlet 和JSP 的核心技术,以及Spring MVC 的实践应用。
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发...
11.1 Spring MVC概述 Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。它与Struts2框架一样,都属于MVC框架,但其使用和性能等方面比Struts2更加优异。 11.1 Spring MVC概述 是Spring框架的一...
3 IOC:控制反转,谓之“依赖关系的转移”,如果以前都是依赖于实现,那么现在反转为依赖于抽象吧,其实它的核心思想就是要面向接口编程,至于何谓接口何谓抽象,以及它们的好处,多看看设计模式吧,这里就不费口舌...
spring初学这可以参考的用户登录注册简单的例子,mvc设计模式的spring框架,适合初学者,比较简单,容易理解和入门
此外,我们还对Spring技术所涉及到的各种Java技术、Java设计模式进行了适时的介绍,通过这些背景知识的准备,读者在理解Spring的各项原理时将不会有任何的障碍。 =============================================...
5.1.3使用Spring MVC的AbstractSecurityWebApplicationInitializer 32 5.2 HttpSecurity 32 5.3 Java配置和表单登录 34 5.4授权请求 35 5.5处理注销 36 5.5.1 LogoutHandler 37 5.5.2 LogoutSuccessHandler 37 5.5.3...
该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis(redis缓存)、quartz(集群任务实现)、shiro(权限管理)、oauth2(四种认证模式)、shign(接口参数防篡改重放)、encoder(用户...
此外,我们还对Spring技术所涉及到的各种Java技术、Java设计模式进行了适时的介绍,通过这些背景知识的准备,读者在理解Spring的各项原理时将不会有任何的障碍。 =============================================...
此外,我们还对Spring技术所涉及到的各种Java技术、Java设计模式进行了适时的介绍,通过这些背景知识的准备,读者在理解Spring的各项原理时将不会有任何的障碍。 =============================================...
这是一种设计模式,将责任进行拆分 , 不同的组件负责不同的事情 好处: 结构清晰 更好维护( Old : 大量使用jsp的年代 , 只应该负责显示就行了) 坏处: 更加复杂了 入门体验 创建一个web项目 编写web.xml,在其中注册一个...
项目简介:JeeSite 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE)采用经典开发模式,让初学者能够更快的入门并投入到团队...
MVC(模型、视图、控制器)设计模式开发 Web 应用程序。 为了熟悉 Spring MVC 应用程序,以下 Spring 注释很有用。 @Controller - 该注解定义了 Web 应用程序的控制器,模型将与数据库和视图进行通信,以通过 JSP 或...
1.7设计模式面试题 1.8Tomcat、Servlet面试题 1.9多线程面试题 1.10MyBatis面试题 1.11Spring MVC面试题 1.12Spring Boot面试题 1.13Spring Cloud面试题 2、中间件面试题 3、数据库&SQL面试题 ...
本次课程的主要内容:掌握系统框架设计原理,工厂模式,委托模式的实现,Spring的IOC依赖注入技术,Struts2,Hibernate与Spring的整合,ApplicationContext读取资源文件的3种方法,多个配置文件的加载与导入,静态...
14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...
J2eeFAST是一个Java EE企业级快速开发平台,基于经典技术组合(Spring Boot,Spring MVC,Apache Shiro,MyBatis-Plus,Freemarker,Bootstrap,AdminLTE)采用经典开发模式,让初学者能够Swift进行入门并从事在线...
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,...
14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...