【SSH系列】深入浅出SpringMvc+入门Demo
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的更多相关文章
- SpringMVC 入门demo
(1)新建Spring项目 (2)添加所需要的jar包 spring的5+2: spring-core.jar spring.beans.jar spring-context.jar spring-e ...
- springmvc入门demo
目录结构: package com.wyl; import org.springframework.stereotype.Controller; import org.springframework. ...
- 【SSH系列】初识spring+入门demo
学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...
- Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例
前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web 应用),这便是SpringMVC:Spring MVC是Spri ...
- Maven+SpringMVC+Dubbo 简单的入门demo配置
转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...
- 【SSH系列】---Hibernate的基本映射
开篇前言 在前面的博文中,小编分别介绍了[SSH系列]-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及h ...
- 【SSH系列】-- Hibernate持久化对象的三种状态
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
- SpringMVC札集(01)——SpringMVC入门完整详细示例(上)
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
随机推荐
- iOS 同一个workspace下创建多个项目编程
在iOS开发中,相关联的多个项目可能会放在同一个workspace下进行开发,那习惯了一个项目在一个工作空间下的同学该怎么快速开撸呢? 只需要三步而已! 第一步,先用Xcode在目标目录下创建一个wo ...
- 关于手机APP开发的一些常见误解
移动应用不适用于小型企业和创业公司 如果你想要开发一款移动APP,那么在前期开发一种偏见的态度并不是一个好主意.如果你认为移动APP只有跨国公司和大企业创业者才会去开发,那么你可能错过了成功的捷径.而 ...
- [LeetCode] Optimal Division 最优分隔
Given a list of positive integers, the adjacent integers will perform the float division. For exampl ...
- 从零开始搭建支持http2的web服务
前段时间开始,公司各项业务开始陆续接入http2,关于http2的优点与所适用的场景网上有很多的文档可以查阅,这里我主要是总结分享一下如何从0到1搭建http2服务. 这里先说明一下,要完成http2 ...
- 实验吧_拐弯抹角(url伪静态)&Forms
拐弯抹角 先贴代码 <?php // code by SEC@USTC echo '<html><head><meta http-equiv="chars ...
- 计蒜客模拟赛5 D2T2 蚂蚁搬家
很久很久以前,有很多蚂蚁部落共同生活在一片祥和的村庄里.但在某一天,村庄里突然出现了一只食蚁兽,蚂蚁们为了保全性命而决定搬家. 然而这个村庄四面环山,想要离开这个村庄必须要从地洞里离开,村子里一共有 ...
- 计蒜客NOIP2017提高组模拟赛(三)day1
火山喷发 火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 n 个生物分别具有 A1,A2,⋯,An点生命值,一次火山喷发总计 MM 轮 ...
- 【集训第四天·继续刷题】之 lgh怒刚ypj
继续水题,终于完全掌握了伸展树了,好心痛QAQ. 1.codevs1343 蚱蜢 区间最大值查询+单点移动 最大值查询维护一个mx数组就行,单点移动么,先删除在插入 CODE: /* PS: 比较ma ...
- Git常用命令及常见问题解决
$ mkdir xxx ----创建xxx目录 $ cd learngit ----切到xxx目录下 $ pwd ----查看当前文件所在目录 $ gi ...
- C语言程序设计第五次作业——循环结构
(一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...