前言
上文书说了 Spring 相关的知识, 对 Spring 来了个浅入浅出, 大家应该了解到, Spring 在三层架构中主做 Service 层, 那还有 web 层, 也就是 Controller 层, 这个就由 SpringMVC 来解决了. SpringMVC 是 Web 层的一个框架, 它是 Spring 的组成部分, 可以先看看下面这张图:
SpringMVC 工作原理
MVC 模式在之前我已经写过博客了《Web 开发模式》, 学 SpringMVC 之前有必要先看一下 MVC 模式.
SpringMVC 框架主要由 DispatcherServlet, 处理器映射, 控制器, 视图解析器, 视图组成, 其工作流程如下:
客户端请求提交到 DispatcherServlet;
由 DispatcherServlet 控制器寻找一个或多个 HandlerMapping, 找到处理请求的 Controller;
DispatcherServlet 将请求提交到 Controller;
Controller 调用业务逻辑处理后返回 ModelAndView;
DispatcherServlet 寻找一个或多个 ViewResolver 视图解析器, 找到 ModelAndView 指定的视图;
视图负责将结果显示到客户端.
在 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 接口的类. 传统风格的控制器不仅需要在配置文件中部署映射, 而且只能编写一个处理方法, 不够灵活.
基于注解的控制器具有以下两个优点:
在基于注解的控制器类中可以编写多个处理方法, 进而可以处理多个请求(动作), 这就允许将相关的操作编写在同一个控制器类中, 从而减少控制器类的数量, 方便以后的维护.
基于注解的控制器不需要在配置文件中部署映射, 仅需要使用 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/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
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/mvc
- http://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/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
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/mvc
- http://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;
- }
- @Override
- public 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;
- @Override
- public 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 中的添加功能实现了");
- }
- @Override
- public void delete() {
- String deleteSql = "delete from user where id=?";
- Object parem2[] = {5};
- jdbcTemplate.update(deleteSql,parem2);
- System.out.println("UserDao 中的删除功能实现了");
- }
- @Override
- public void update() {
- String updateSql = "update user set username=? , password=? where id =?";
- Object parem3[] = {"修改","654321",3};
- jdbcTemplate.update(updateSql,parem3);
- System.out.println("UserDao 中的修改功能实现了");
- }
- @Override
- public 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;
- @Service
- public class UserServiceImpl implements UserService {
- @Autowired
- private UserDao userDao ;
- @Override
- public void add() {
- userDao.add();
- }
- @Override
- public void delete() {
- userDao.delete();
- }
- @Override
- public void update() {
- userDao.update();
- }
- @Override
- public 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 {
- @Autowired
- private 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/
来源: https://www.cnblogs.com/zyx110/p/11319843.html