【SSH系列】深入浅出SpringMvc+入门Demo

时间:2023-01-11 04:54:09

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模式处理流程如下所示:

【SSH系列】深入浅出SpringMvc+入门Demo

解释一下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的体系结构

【SSH系列】深入浅出SpringMvc+入门Demo

小编来简单的介绍一下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

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

【SSH系列】深入浅出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的相关知识,敬请期待。