Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,Spring MVC和Struts、Struts2非常类似。Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handler mappings、view resolution、locale以及theme resolution来处理请求并且转到对应的视图。这篇博文小编主要来讲解一下springmvc的相关知识,小编会从以下几个方面进行详细介绍:
a、mvc与springmvc有什么区别和联系
b、常用的mvc框架
c、mvc模式的优缺点
d、springmvc的体系结构
e、springmvc Demo
接着,小编就对以上列出的几点进行详细介绍,希望对有需要的小伙伴有帮助,还请小伙伴们多多指教。
mvc与springmvc有什么区别和联系
mvc是一种使用mvc(model+view+controller即:模型+视图+控制器)设计创建web应用程序的模式:
model(模型)表示应用程序核心,比如数据库记录列表;
view(视图)显示数据,比如数据库记录;
controller(控制器)处理输入,比如写入数据库记录;

下图是小编画的一个mvc模式处理流程如下所示:

解释一下mvc的处理流程,首先用户发出请求,给控制器controller,controller负责将用户的参数传递给业务模型model,model进行业务逻辑判断,和数据库的增删改查操作,最后,根据业务逻辑选择不同的视图view,并将结果反馈给用户,这就是mvc设计模式的处理流程,mvc分成三层,由助于管理复杂的业务程序,同时也简化了分组开发。不同的开发人员可同时开发view、控制器逻辑和业务逻辑。
说到spring mvc,小伙伴们可能会想到mvc,mvc和三层架构是什么关系呢?在小编目前的理解中,三层是三层,mvc是mvc,她们之间没有关系。三层是从整个应用程序架构的角度来分的三层,如果程序有需要,还可以再进行分层,三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑。比如将数据库操作代码封装到一层中,提供一些方法根据参数直接返回用户需要的相应数据,这样在处理具体的业务逻辑的时候,就不用关心数据的存储问题了。MVC是在应用程序(BS结构)的视图层划分出来的不同功能的几个模块。
mvc主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。MVC把纯净的界面展示逻辑(用户界面)独立到一些文件中(Views),把一些和用户交互的程序逻辑(Controller)单独放在一些文件中,在 Views 和 Controller 中传递数据使用一些专门封装数据的实体对象,这些对象,统称为Models。之所以说MVC和三层毫无关系,是因为它们二者使用范围不同:三层可以应用于任何语言、任何技术的应用程序;而MVC只是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,可以同时存在,也可根据情况使用其中一种。

常用的mvc框架

比较常用的mvc框架有struts和springmvc:

1)struts是java web mvc框架中的霸主,经过长达几年的发展,struts已经逐渐成长为一个稳定、成熟的架构,并且占有了mvc框架中最大的市场份额,但是struts某些技术特性上已经落后于新兴的mvc框架,面对springMVC、webWork2这些设计更加的精密,扩展性更强的框架,struts的霸主地位受到挑战。
2)springmvc通过一套mvc注解,让pojo成为处理请求的控制器,无须实现任何接口,同时,springmvc还支持rest风格的url请求,注解驱动以及rest风格的springmvc是spring3.0最出彩的功能之一,此外,springmvc在数据绑定、视图解析、本地处理及静态资料处理上都有许多不俗的表现,她在框架设计,扩展性、灵活性等方面超越了struts、webWork等mvc框架,从原来的追赶者一跃成为mvc的领跑者。

mvc模式的优缺点优点:
1)、耦合性低
2)、重用性高
3)、生命周期成本低
4)、部署快
5)、可维护性高
6)、有利于软件工程化管理
缺点:
1)、没有明确的定义
2)、不适合小型、中等规模的应用程序
3)、增加系统结构和实现的复杂性
4)、视图与控制器间的过于紧密的连接
5)、视图对模型数据的低效率访问
6)、一般高级的界面工具或构造器不支持模式

springmvc的体系结构

小编来简单的介绍一下springmvc的体系结构:
Model2就是jsp+servlet+javabean是经典的mvc模型的web应用变体,这个改变,主要源于http协议的无状态性,model2的目的和mvc一样,也是利用处理器分离模型、视图和控制达到不同层级间松耦合的效果,提高系统的灵活性、复用性、可维护性、在多数情况下,可以把model2和mvc等同起来,由于mvc就是基于model2实现的框架,所以她底层的机制也是mvc,我们通过上图来描述spring mvc的宏观体系结构,从接收请求到返回响应,spring mvc框架的众多组件大家各司其职,有条不紊的完成自己的工作,在整个框架中,一个非常关键的类,DispatcherServlet,她处于核心的位置,负责协调和组织不同组件,共同完成请求相应的工作,和大多数mvc框架一样,spring mvc通过一个前端servlet处理器,接收所有的请求,并将工作委派给其他组件进行具体处理,DispatcherServlet就是springmvc前端的servlet处理器,下面我们对springmvc请求处理的过程进行详细解释:
a、整个过程开始与客户端发送的一个http请求
b、DispatcherServlet类接收请求,会将请求的处理工作委托给具体的处理器Handler,或者,负责处理请求执行相应的业务逻辑,在这之前DispatcherServlet必须能够凭借请求信息也就是url或请求参数等按照某种机制找到请求对应的处理器,DispatcherServlet是通过查找handlermapping来完成这一工作的。
c、当DispatcherServlet从handlermapping中得到当前请求对应的处理器之后,他就将请求分配给这个处理器,处理器根据请求的信息执行相应的业务逻辑,一个设计良好的处理器应该通过调用service层的业务逻辑对象完成业务处理而非自己越俎代庖,spring提供了丰富的处理器类型,在真正处理业务逻辑前,有些处理器会事先执行两项预处理工作:
a、将httpservletrequest请求参数绑定到一个pojo对象中
b、对绑定了请求参数的pojo对象进行数据合法性校验
d、处理器完成业务逻辑的处理后返回一个modelandview对象给DispatcherServlet类,modelandview包含了视图逻辑名和渲染视图时需要用到的数据模型对象
e、由于modelandview中包含的是视图逻辑名,DispatcherServlet必须知道这个逻辑名对应的真实对象,这项视图解析的工作通过调用viewResolver来完成
f、当得到真实的视图对象后,DispatcherServlet将请求分配给view这个对象,从而完成渲染工作
g、最终客户端得到返回的相应,这可能是一个普通的html页面,也可能是一个excel电子表格,也可能是一个pdf等不同的视图形式,spring的视图类型是比较丰富和灵活的,以上就是springmvc的处理的流程。                                   springmvc Demo

用户登录系统进行密码验证,如果验证成功跳转到成功页面,如果失败,跳转到登录页面,提示失败原因,如下图所示:

第一步,编写pom.xml的代码,代码如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.howtodoinjava.demo</groupId>
    <artifactId>springmvcexample</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>springmvcexample Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring MVC support -->

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

        <!-- Tag libs support for view layer -->

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>springmvcexample</finalName>
    </build>
</project>

第二步、编写web.xml的代码,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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_2_5.xsd"
	id="WebApp_ID" version="2.5">
<display-name></display-name>
<listener>
	<listener-class>org.springframeword.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
	<param-name>contextConfigLoaction</param-name>
	<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<servlet>
	<servlet-name>spring</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfitLocation</param-name>
		<param-value>WEB-INF/spring-mvc.xml</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>spring</servlet-name>
	<url-pattern>*.html</url-pattern>
</servlet-mapping>

</web-app>

第三步、新建一个spring.mvc.xml,代码如下所示:

<?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="com.springmvc"/>

</beans>

第四步、新建jsp页面,分别是login.jsp和success.jsp,login.jsp页面代码如下所示:

<%@ 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>
	<form action="Login.html" method="post">
		<p>
			用户名:<input name="uname" type="text">
		</p>
		<p>
			密  码:<input name="upasswd" type="password">
		</p>
		<p>
			<input type="submit">
		</p>

	</form>
	<font color="red">${error}</font>

</body>
</html>

Success.jsp页面代码如下所示:

<%@ 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>
	<h1>登录成功</h1>

</body>
</html>

第五步、定义好了jsp页面就相当于定义好了mvc中的view,现在我们来继续编写m和c,新建包和类LoginController,代码如下所示:

package com.demo.springmvc.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.demo.springmvc.service.LoginService;

public class LoginController {

	@Resource
	LoginService service;

	@Resource
	HttpServletRequest request;

	@RequestMapping("index")
	public ModelAndView toLoginPage(){
		return new ModelAndView("WEB-INF/jsp/login.jsp");

	}
	@RequestMapping("login")
	public ModelAndView doLogin(){
		String loginPageUrl="WEB-INF/jsp/login.jsp";
		String successPageUrl="WEB-INF/jsp/success.jsp";

		String uname = request.getParameter("uname");
		String upasswd = request.getParameter("upasswd");

		return service.doLogin(loginPageUrl,successPageUrl,uname,upasswd);
	}

}

第六步、新建包和类LoginService,代码如下所示:

package com.demo.springmvc.service;

import org.springframework.web.servlet.ModelAndView;

public class LoginService {

	public ModelAndView doLogin(String loginPageUrl, String successPageUrl,String uname, String upasswd) {
		if(uname == null||"".equals(uname)){
			return new ModelAndView(loginPageUrl,"error","用户名不能为空");

		}
		if(uname == null||"".equals(upasswd)){
			return new ModelAndView(loginPageUrl,"error","密码不能为空");

		}

		if(uname.equals("admin") && upasswd.equals("123")){
			return new ModelAndView(successPageUrl);
		}
		return new ModelAndView(loginPageUrl,"error","用户名或者密码错误");
	}

}

小编寄语:该博文小编主要简单的介绍了springmvc的相关知识,分别从五个方面进行了介绍,mvc与springmvc有什么区别和联系、常用的mvc框架、mvc模式的优缺点、springmvc的体系结构、springmvc Demo,初次学习和接触springMvc,还有很多需要完善的地方,在下篇博文中,小编将继续介绍ssh的相关知识,敬请期待。

【SSH系列】深入浅出SpringMvc+入门Demo的更多相关文章

  1. SpringMVC 入门demo

    (1)新建Spring项目 (2)添加所需要的jar包 spring的5+2: spring-core.jar spring.beans.jar spring-context.jar spring-e ...

  2. springmvc入门demo

    目录结构: package com.wyl; import org.springframework.stereotype.Controller; import org.springframework. ...

  3. 【SSH系列】初识spring+入门demo

    学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...

  4. Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例

    前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web 应用),这便是SpringMVC:Spring MVC是Spri ...

  5. Maven+SpringMVC+Dubbo 简单的入门demo配置

    转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...

  6. 【SSH系列】---Hibernate的基本映射

    开篇前言       在前面的博文中,小编分别介绍了[SSH系列]-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及h ...

  7. 【SSH系列】-- Hibernate持久化对象的三种状态

    在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...

  8. SpringMVC札集(01)——SpringMVC入门完整详细示例(上)

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  9. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

随机推荐

  1. LOB对象在数据泵导出、导入后查询对象数量发现丢失

    问题描述:问题:源库的某个Schema使用数据泵Expdp元数据整体导出,在目标库导入且成功后,逻辑验证用户对象,发现缺失.分析查询后,缺失的对象,都是LOB类型(并不是所有的LOB都无法导入,是大部 ...

  2. 基于webpack的React项目搭建(一)

    前言 工欲善其事,必先利其器.为了更好的学习React,我们先简要的把开发环境搭建起来.本文主要介绍使用webpack搭建React项目,如果你对React或es6的基础语法还不了解,建议先去学习学习 ...

  3. [Luogu 2265]路边的水沟

    Description LYQ市有一个巨大的水沟网络,可以近似看成一个n*m的矩形网格,网格的每个格点都安装了闸门,我们将从水沟网络右下角的闸门到左上角的闸门的一条路径称为水流. 现给定水沟网的长和宽 ...

  4. [JSOI2007]合金

    Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新 ...

  5. [SDOI2017]序列计数

    题目描述 Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知道,有多少个序 ...

  6. 洛谷P2405 non天平

    题目背景 non最近正在为自己的体重而苦恼,他想称量自己的体重.于是,他找来一个天平与许多砝码. 题目描述 砝码的重量均是n的幂次,n^1.n^2.n^3.n^4.n^5的……non想知道至少要多少个 ...

  7. hdu 5895 广义Fibonacci数列

    Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  8. APIO 2015

    老师让我们打这套题练练手.感觉这套题还是挺有意思的,比国内某些比赛不知道高到哪里去.最后我拿了284/300,貌似比赛是IOI赛制啊,强行被当成OI赛制做了,不然我T3可能还能多骗点. T1.scul ...

  9. [BZOJ]1046 上升序列(HAOI2007)

    和字典序有关的题型啊. Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < x ...

  10. SpringCloud学习之zuul

    一.为什么要有网关 我们先看一个图,如果按照consumer and server(最初的调用方式),如下所示 这样我们要面临如下问题: 1. 用户面临着一对N的问题既用户必须知道每个服务.随着服务的 ...