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. C# 枚举器

    1:枚举器和可枚举类型 我们知道使用foreach可以遍历数组中的元素.那么为什么数组可以被foreach语句处理呢,下面我们就进行讨论一下这个问题. 2:使用foreach语句 我们知道当我们使用f ...

  2. TCP/IP学习笔记(二):TCP连接的建立与终止

    TCP连接的三次握手: (1)请求短发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号ISN(1415535521),报文段中SYN=1:TCP规定:SYN报文段不能携带数据,但是要消耗一个 ...

  3. win10+ ubuntu12.04双系统安装教程与遇到的问题

    1. 准备ISO. 参考:网站http://mirrors.ustc.edu.cn/ubuntu-releases/precise/ 下载 ubuntu-12.04.5-desktop-amd64.i ...

  4. python--元祖和字典

    一.1:元祖:tuple  在python中,元祖也是一个list, 它和list的区别是list中的元素可以修改,而元祖中的元素不可以修改. 2:元祖的定义:用小括号() 二.1.字典  字典全程d ...

  5. git中的merge与rebase

    之前一直对git的merge与rebase很困惑,而且一般也只使用merge而不是使用rebase.今天受高人指点理清了两者的区别. 首先对于两者而言,他们的结果是一样的,差异在于合并的方式(产生的结 ...

  6. Shell的基本命令(第一天),根据w3c学习得

    Shell是一种应用程序,提供一个界面访问操作系统内核的服务. 1:编写shell脚本 vi test.sh #!/bin/bash #指定这个脚本需要什么解释器来执行 echo "Hell ...

  7. “百度杯”CTF比赛 九月场_Code(PhpStorm)

    题目在i春秋ctf大本营 打开链接是一张图片,审查元素发现关键词base64,图片的内容都以base64加密后的形式呈现,查看url形式,应该是一个文件读取的漏洞 这里我们可以采用url/index. ...

  8. [ZJOI 2008]泡泡堂BNB

    Description 题库链接 双方 \(n\) 人,给出每人的战斗力,赢一场加 \(2\) 分,平局 \(1\) 分,失败不得分.求最大和最小的得分. \(1\leq n\leq 100000\) ...

  9. [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  10. bzoj 5212: [Zjoi2018]历史

    Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有n个城市,这n个城市被恰好n?1条双向道路联通,即任意两个城 ...