【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注册,订阅类似于消息队列的注册 ...
随机推荐
- 学习HTML的第三次课
浏览器的地址栏中有字数限制,大约为200个字符. 1.表单:<form action="" method=""></form> 属性: ...
- [LeetCode] Optimal Division 最优分隔
Given a list of positive integers, the adjacent integers will perform the float division. For exampl ...
- 注意类型转换——Effective C++
注意类型转换: C++提供了四种新式类型转换: const_cast<T>(expression); static_cast<T>(expression); dynamic_c ...
- 【USACO 5.3.1】量取牛奶 迭代
Description 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就 ...
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- 二叉树的基本操作(含Huffman树)
大二时候写的烂代码,翻出来复习复习(o(╯□╰)o). 代码: #include <stdio.h> #include <stdlib.h> #define Max_Size ...
- C语言程序设计第五次作业——循环结构1
(一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...
- 前端工程师:电信专业转前端是如何拿到阿里、腾讯offer的?
1.个人情况 ● 211本科 985硕士 电信专业 女生 ● 16年3月开始学习前端 ● 16年7月开始实习,共五家实习经历(不是特别厉害的厂) ● 秋招拿到两个offer(阿里.腾讯).没错只有这两 ...
- bootstrap的模态框
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 读书笔记-《Maven实战》-2018/4/18
第五章:坐标和依赖 1.每个依赖中可以包含的元素有: groupId,artifactId,version: 这三个元素是Maven项目最重要的元素.Maven需要根据这三个坐标找到需要的依赖. ty ...