Spring MVC
REST
REST( Representational State Transfer ,表述性状态传递),是 Roy Fielding 博士在2000年提出的一种软件架构风格(即描述了一个架构样式的网络系统,如 web 应用程序)。REST 是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
RESTful 是一种网络应用程序的设计风格和开发方式,基于 HTTP ,可以使用 XML 格式定义或 JSON 格式定义。RESTful 适用于移动互联网厂商作为业务接口的场景,实现第三方 OTT 调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
REST 是一组架构约束条件和原则。而满足这些约束条件和原则的应用程序或设计则是 RESTful 。
RESTful 特点
1、每一个 URI( Uniform Resource Identifier ,统一资源标识符)代表1种资源
2、客户端使用 GET 、POST 、PUT 、DELETE 4个表示操作方式的动词对服务端资源进行操作
- GET 用于获取资源
- POST 用于新增资源
- PUT 用于更新资源
- DELETE 用于删除资源
3、通过操作资源的表现形式来操作资源
4、资源的表现形式是 XML 或者 HTML
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息
RESTful 风格的四种请求方式实现
在 HTTP 协议中,GET 、POST 、PUT 、DELETE 4个表示操作方式的动词,而对应的操作为 GET 用于获取资源,POST 用于新增资源,PUT 用于更新资源,DELETE 用于删除资源。
在 Spring MVC 中,可以使用占位符的方式实现 RESTful 风格。
实现结果
/某路径/731 ——— HTTP GET :得到 id = 731 的一条数据
/某路径/731 ——— HTTP PUT :更新 id = 731 的一条数据
/某路径/731 ——— HTTP DELETE :删除 id = 731 的一条数据
/某路径 ————— HTTP POST :新增一条数据
简单示例:
首先,使用 @RequestMapping 注解映射请求中的 method 参数实现四种请求方式的调用
packagecn.edu.springmvcdemo.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;@ControllerpublicclassRestfulDemo{@RequestMapping("/restful")publicStringrestfulTest(){return"restful";}@RequestMapping(value ="/getTest",method =RequestMethod.GET)publicStringgetTest(){System.out.println("执行了 getTest 方法!!!");return"accessing";}@RequestMapping(value ="/putTest",method =RequestMethod.PUT)publicStringputTest(){System.out.println("执行了 putTest 方法!!!");return"redirect:/restful";}@RequestMapping(value ="/deleteTest",method =RequestMethod.DELETE)publicStringdeleteTest(){System.out.println("执行了 deleteTest 方法!!!");return"redirect:/restful";}@RequestMapping(value ="/postTest",method =RequestMethod.POST)publicStringpostTest(){System.out.println("执行了 postTest 方法!!!");return"accessing";}}
接着,在 web.xml 中配置过滤器来指定的 post 请求转变为所需的 put 或 delete 请求
<!-- 配置过滤器:将指定的 post 请求转变为所需的 put 或 delete 请求 --><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><!-- 拦截所有请求 --><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
然后,创建 restful.jsp ,以 GET 请求和 put 请求为例
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2023/7/31
Time: 21:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body>
<%-- <a>标签默认为 GET 请求 --%>
<ahref="${pageContext.request.contextPath}/getTest">getTest</a><formaction="${pageContext.request.contextPath}/putTest"method="post">
<%-- 将 post 请求转变为 put 请求,name 属性值必须为 _method ,delete 请求同理 --%>
<inputtype="hidden"name="_method"value="put"/>
更新:<inputtype="text"/><inputtype="submit"value="提交"/></form></body></html>
再创建 accessing.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><h2>成功执行!</h2></body></html>
最后,测试结果
1.点击 getTest 链接
跳转成功,执行 GET 请求
2.输入内容,点击提交
返回原来页面,执行 PUT 请求
结果如图:
附
下面实现 Spring + Spring MVC + JDBCTemplate 的整合,并通过 RESTful 风格获取所有用户信息。
简单示例:
首先,在 pom.xml 中添加依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.25</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.25</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.25</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java --><dependency><groupId>com.mchange</groupId><artifactId>mchange-commons-java</artifactId><version>0.2.20</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency>
接着,在 resources 中创建 spring 配置文件 applicationContext.xml ,并在 web.xml 中配置 contextLoaderListener 和加入 spring 配置文件
<!-- 配置 contextLoaderListener ,并加入 spring 配置文件 applicationContext.xml --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
然后,对 spring 配置文件 applicationContext.xml 和 springmvc 配置文件 springmvc.xml 进行配置。这里要防止两个配置文件在扫描包时有重合现象
<!-- spring 配置文件 --><!-- 排除扫描 Controller 和 ControllerAdvice 包。这样,spring 和 springmvc 扫描的包既不重复也不缺少 --><context:component-scanbase-package="cn.edu.springmvcdemo"><context:exclude-filtertype="annotation"expression="org.springframework.stereotype.Controller"/><context:exclude-filtertype="annotation"expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan>
<!-- springmvc 配置文件 --><!-- 指定只扫描 Controller 和 ControllerAdvice 包 --><context:component-scanbase-package="cn.edu.springmvcdemo"use-default-filters="false"><context:include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/><context:include-filtertype="annotation"expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan>
注:Spring IoC 容器与 Spring MVC IoC 容器为父子关系,即全局变量和局部变量的关系
再在 resources 目录下创建 jdbc.properties ,并对 spring 配置文件 applicationContext.xml 进行连接 MySQL 数据库的基本信息的配置
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springmvcdemo?useSSL=false&serverTimezone=UTC
jdbc.user=root
jdbc.password=0123
acquireIncrement=5
initialPoolSize=10
minPoolSize=5
maxPoolSize=100
maxStatements=2
maxStatementsPerConnection=5
<!-- 在 Bean 的外部属性文件的使用中有所提及 --><!-- 使用context命名空间,通过 location 属性指定 properties 文件位置 --><context:property-placeholderlocation="classpath:jdbc.properties"/><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"><!-- 连接MySQL数据库的基本信息的配置 --><!-- 驱动程序类名:com.mysql.jdbc.Driver --><propertyname="driverClass"value="${jdbc.driverClass}"/><!-- JDBC URL:jdbc:mysql://<host>:<port>/<database_name> --><propertyname="jdbcUrl"value="${jdbc.url}"/><!-- 数据库用户名 --><propertyname="user"value="${jdbc.user}"/><!-- 数据库用户密码 --><propertyname="password"value="${jdbc.password}"/><!-- 若数据库中的连接数量不足时,向数据库申请的连接数量 --><propertyname="acquireIncrement"value="${acquireIncrement}"/><!-- 初始化数据库连接池时连接的数量 --><propertyname="initialPoolSize"value="${initialPoolSize}"/><!-- 数据库连接池最小的数据库连接数 --><propertyname="minPoolSize"value="${minPoolSize}"/><!-- 数据库连接池最大的数据库连接数 --><propertyname="maxPoolSize"value="${maxPoolSize}"/><!-- C3P0数据库连接池可以维护的Statement数量 --><propertyname="maxStatements"value="${maxStatements}"/><!-- 每个连接同时可以使用Statement的数量 --><propertyname="maxStatementsPerConnection"value="${maxStatementsPerConnection}"/></bean><!-- 配置jdbcTemplate,注入dataSource --><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"ref="dataSource"/></bean><!-- 配置namedParameterJdbcTemplate,注入dataSource --><beanid="namedParameterJdbcTemplate"class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-argtype="javax.sql.DataSource"ref="dataSource"/></bean>
配置完成后,创建名字为 springmvcdemo 的数据库,再创建名字为 user 的数据表和表信息
在 model 层中创建与数据表 user 一一映射的实体类 User
packagecn.edu.springmvcdemo.model;publicclassUser{privateint id;privateString name;privateint age;privateString grade;publicUser(){super();}publicUser(int id,String name,int age,String grade){this.id = id;this.name = name;this.age = age;this.grade = grade;}publicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){return age;}publicvoidsetAge(int age){this.age = age;}publicStringgetGrade(){return grade;}publicvoidsetGrade(String grade){this.grade = grade;}@OverridepublicStringtoString(){return"User{"+"id="+ id +", name='"+ name +'\''+", age="+ age +", grade='"+ grade +'\''+'}';}}
在 dao 层中创建接口 UserDao ,定义获取所有用户信息的方法
packagecn.edu.springmvcdemo.dao;importcn.edu.springmvcdemo.model.User;importjava.util.List;publicinterfaceUserDao{publicList<User>selectAll();}
同时,创建接口 UserDao 的实现类
packagecn.edu.springmvcdemo.dao;importcn.edu.springmvcdemo.model.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.BeanPropertyRowMapper;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.jdbc.core.RowMapper;importorg.springframework.stereotype.Repository;importjava.util.List;@Repository("userDao")publicclassUserDaoImplimplementsUserDao{@AutowiredprivateJdbcTemplate jdbcTemplate;@OverridepublicList<User>selectAll(){String sql ="SELECT `id`,`name`,`age`,`grade` FROM `user`;";RowMapper<User> rowMapper =newBeanPropertyRowMapper<>(User.class);List<User> list = jdbcTemplate.query(sql,rowMapper);return list;}}
同理,在 sevice 层中创建接口 UserSevice ,定义获取所有用户信息的方法,而 UserSevice 的实现类则调用 UserDao 方法即可
在 controller 层中通过 RESTful 风格获取所有用户信息
packagecn.edu.springmvcdemo.controller;importcn.edu.springmvcdemo.model.User;importcn.edu.springmvcdemo.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.ui.ModelMap;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importjava.util.List;@ControllerpublicclassUserController{@AutowiredprivateUserService userService;@RequestMapping(value ="/users",method =RequestMethod.GET)publicStringgetSelectAll(ModelMap modelMap){List<User> users = userService.selectAll();
modelMap.put("users",users);return"user";}}
创建 user.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2023/8/1
Time: 18:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><h3>用户信息</h3><table><tr><td>用户编号</td><td>用户姓名</td><td>用户年龄</td><td>用户班级</td></tr><c:forEachvar="user"items="${users}"><tr><td>${user.id}</td><td>${user.name}</td><td>${user.age}</td><td>${user.grade}</td></tr></c:forEach></table></body></html>
结果如图:
版权归原作者 啊Q老师 所有, 如有侵权,请联系我们删除。