Spring MVC浅入浅出——不吹牛逼不装逼

前言

上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就是Controller层,这个就由SpringMVC来解决了。SpringMVC是Web层的一个框架,它是Spring的组成部分,可以先看看下面这张图:

SpringMVC工作原理

MVC模式在之前我已经写过博客了《Web开发模式》,学SpringMVC之前有必要先看一下MVC模式。

SpringMVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成,其工作流程如下:

  1. 客户端请求提交到DispatcherServlet;
  2. 由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller;
  3. DispatcherServlet将请求提交到Controller;
  4. Controller调用业务逻辑处理后返回ModelAndView;
  5. DispatcherServlet寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图;
  6. 视图负责将结果显示到客户端。

在SpringMVC工作流程中包含4个SpringMVC接口,即DispatcherServlet、HandlerMapping、Controller和ViewResolver。SpringMVC所有的请求都经过DispatcherServlet来统一分发,在DispatcherServlet将请求分发给Controller之前需要借助SpringMVC提供的HandlerMapping定位到具体的Controller。

HandlerMapping接口负责完成客户请求到Controller映射。

Controller接口将处理用户请求,这和Java 中Servlet扮演的角色是一致的。一旦Controller处理完用户请求,将返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

 

ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从而将相应结果渲染给客户。

基于注解的控制器

在使用Web应用开发时Controller是Web应用的核心,Controller实现类包含了对用户请求的处理逻辑,是用户请求和业务逻辑之间的桥梁就,是SpringMVC框架的核心部分,负责具体的业务逻辑处理。传统风格的控制器是实现Controller接口的类。传统风格的控制器不仅需要在配置文件中部署映射,而且只能编写一个处理方法,不够灵活。

基于注解的控制器具有以下两个优点:

  1. 在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求(动作),这就允许将相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。
  2. 基于注解的控制器不需要在配置文件中部署映射,仅需要使用RequestMapping注释类型注解一个方法进行请求处理。

在SpringMVC中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被SpringMVC框架扫描到,需要在配置文件中声明spring-context,并使用<context:component-scan/>元素指定控制器类的基本包(确保所有控制类都在基本包及其子包下)。示例如下:

<?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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--配置注解要扫描的包--><context:component-scan base-package="com.my"></context:component-scan><!--配置视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置前缀--><property name="prefix" value="/"></property><!--配置后缀--><property name="suffix" value=".jsp"></property></bean>
</beans>

  

说这么多,用实例说话吧

实例解说

Pom.xml

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!--spring核心依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.5.RELEASE</version></dependency></dependencies>

  

spring-config.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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--配置注解要扫描的包--><context:component-scan base-package="com.my"></context:component-scan><mvc:annotation-driven></mvc:annotation-driven><!--配置spring-jdbcTemplate--><!--配置数据源--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!--MySQL数据库驱动--><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><!--连接数据库的URL--><property name="url" value="jdbc:mysql://localhost:3306/bbb?useUnicode=true&characterEncoding=UTF-8"></property><!--连接数据库的用户名--><property name="username" value="root"></property><!--连接数据库的密码--><property name="password" value="root"></property></bean><!--配置JDBC模板--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--配置事务--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--注册事务注解驱动--><tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven><!--配置视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置前缀--><property name="prefix" value="/"></property><!--配置后缀--><property name="suffix" value=".jsp"></property></bean></beans>

  

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app><!--部署DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--表示容器在启动时立即加载servlet--><load-on-startup>1</load-on-startup><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-config.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><!--处理所有URL--><url-pattern>/</url-pattern></servlet-mapping><!--处理中文乱码--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--设置访问静态资源--><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.jpg</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.png</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.gif</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.mp3</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.mp4</url-pattern></servlet-mapping></web-app>

  

User

package com.my.pojo;public class User {private int id;private String username;private String password;public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}

  

UserDao

package com.my.dao;public interface UserDao {public void add();public void delete();public void update();public void query();}

  

UserDaoImpl

package com.my.dao.impl;import com.my.dao.UserDao;import com.my.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import java.util.List;@Repository("userDao")public class UserDaoImpl implements UserDao {@Autowired//使用配置文件中的JDBC模板private JdbcTemplate jdbcTemplate;@Overridepublic void add() {String insertSql = "insert into user values(null,?,?)";for (int i=0;i<15;i++){Object parem1[] = {"成功","123456"};jdbcTemplate.update(insertSql,parem1);}System.out.println("UserDao中的添加功能实现了");}@Overridepublic void delete() {String deleteSql = "delete from user where id=?";Object parem2[] = {5};jdbcTemplate.update(deleteSql,parem2);System.out.println("UserDao中的删除功能实现了");}@Overridepublic void update() {String updateSql = "update user set username=? , password=? where id =?";Object parem3[] = {"修改","654321",3};jdbcTemplate.update(updateSql,parem3);System.out.println("UserDao中的修改功能实现了");}@Overridepublic void query() {String selectSql = "select * from user";RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);List<User> list = jdbcTemplate.query(selectSql,rowMapper,null);System.out.println("UserDao中的查询功能实现了");for (User user : list){System.out.println(user);}}}

  

UserService

package com.my.service;public interface UserService {public void add();public void delete();public void update();public void query();}

  

UserServiceImpl

package com.my.service.impl;import com.my.dao.UserDao;import com.my.dao.impl.UserDaoImpl;import com.my.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao ;@Overridepublic void add() {userDao.add();}@Overridepublic void delete() {userDao.delete();}@Overridepublic void update() {userDao.update();}@Overridepublic void query() {userDao.query();}}

  

UserController

package com.my.controller;import com.my.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.stereotype.Controller;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/user")public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/add")public String add(){userService.add();return "index";}@RequestMapping("/delete")public String delete(){userService.delete();return "index";}@RequestMapping("/update")public String update(){userService.update();return "index";}@RequestMapping("/query")public String query(){userService.query();return "index";}}

  

测试结果

结束

欲看下文如何,请看下回讲解。

*****************************************************************************************************

我的博客园地址:https://www.cnblogs.com/zyx110/

转载请说明出处

我不能保证我所说的都是对的,但我能保证每一篇都是用心去写的,我始终认同“分享的越多,你的价值增值越大”,欢迎大家关注我的技术分享“Java匹马行天下”和学习心得分享“匹马行天下”,在分享中进步,越努力越幸运,人生赢在转折处,改变从现在开始!

支持我的朋友们记得点波推荐哦,您的肯定就是我前进的动力。

转载于:https://www.cnblogs.com/zyx110/p/11319843.html

Spring MVC浅入浅出——不吹牛逼不装逼相关推荐

  1. Spring的数据库编程浅入浅出——不吹牛逼不装逼

    Spring的数据库编程浅入浅出--不吹牛逼不装逼 前言 上文书我写了Spring的核心部分控制反转和依赖注入,后来又衔接了注解,在这后面本来是应该写Spring AOP的,但我觉得对于初学者来说,这 ...

  2. Spring注解浅入浅出——不吹牛逼不装逼

    Spring注解浅入浅出--不吹牛逼不装逼 前情提要 上文书咱们说了<Spring浅入浅出>,对Spring的核心思想看过上篇的朋友应该已经掌握了,此篇用上篇铺垫,引入注解,继续深入学习. ...

  3. Spring浅入浅出——不吹牛逼不装逼

    Spring浅入浅出--不吹牛逼不装逼 前言: 今天决定要开始总结框架了,虽然以前总结过两篇,但是思维是变化的,而且也没有什么规定说总结过的东西就不能再总结了,是吧.这次总结我命名为浅入浅出,主要在于 ...

  4. Angular浅入深出系列 - 写在前面

    本系列目录: 写在前面 基础知识 控制器(Controller) 作用域(Scope) 集合(Collection) 模块(Module) 依赖注入(Dependency Injection) 服务( ...

  5. [科普]浅入浅出Liunx Shellcode

    创建时间:2008-05-13 文章属性:原创 文章提交: pr0cess  (pr0cess_at_cnbct.org) 浅入浅出Liunx Shellcode /*---------------- ...

  6. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

  7. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

  8. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  9. 浅入浅出深度学习理论实践

    全文共9284个字,40张图,预计阅读时间30分钟. 前言 之前在知乎上看到这么一个问题:在实际业务里,在工作中有什么用得到深度学习的例子么?用到 GPU 了么?,回头看了一下自己写了这么多东西一直围 ...

最新文章

  1. 两台笔记本如何不走路由而是通过无线网卡互联
  2. 【数据结构与算法】常用算法
  3. java猜字母讲解_java_猜字母游戏
  4. A new start!
  5. 共享马扎的火爆,原来是一场营销!
  6. java隔一个逗号读入文件_将逗号分隔的文本文件读入HashMap,其中文件在多行Java中具有相同的键...
  7. 4-算法冒泡排序 插入排序
  8. AttackerKB:免费的众筹漏洞评估知识库
  9. 测试思路系列:《谷歌的软件测试之道》读书笔记
  10. DSSM模型的原理简介,预测两个句子的语义相似度
  11. 龙星电脑横机制版软件_龙星制版软件下载 龙星电脑横机是什么系统
  12. Mybatis的一级缓存和二级缓存执行顺序
  13. 静态空间管理和动态空间管理
  14. Oracle dmp文件解析
  15. (简单)华为P20 EML-AL00的USB调试模式在哪里打开的步骤
  16. 计算机基础知识学习第七课,7、新建文件夹--电脑基础知识
  17. 【思维导图】对外经济贸易大学公开课:企业财务报表分析
  18. java hasnext_Java Page.hasNext方法代码示例
  19. html鼠标悬停改变背景,js设置鼠标悬停改变背景色实现详解_哒哒_前端开发者
  20. 联想计算机网络唤醒是怎么回事,笔记本开启网络唤醒功能设置的操作方法

热门文章

  1. php 地址获取百度经纬度,根据百度api获取一个地址的经纬度
  2. mysql+分页脚本_MySql实现分页查询的SQL
  3. Python入门--列表元素的判断及遍历,判断指定元素在列表中是否存在,列表元素的遍历,
  4. 递归法:递归实现排列型
  5. UnityShader4:UnityShader的形式
  6. 2017百度之星初赛:B-1006. 小小粉丝度度熊(贪心+尺取)
  7. 图像识别讲解 以一个简单的图像识别任务为例
  8. flashtorch:卷积神经网络的可视化
  9. c#图像处理-图像预览全解
  10. 贺利坚老师汇编课程55笔记:带借位减法指令SBB