SpringMVC概述

三层架构与MVC架构区别

三层架构

表示层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。 servlet层
业务逻辑层:对我们数据实现业务逻辑的封装 service层
数据访问层:对数据库访问操作 dao层
com.mayikt.servlet——表示层
com.mayikt.service——业务逻辑层
com.mayikt.dao——数据库访问层
image.png

MVC架构

M 代表 模型(Model)
1.MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
M 代表 模型(Model)(业务逻辑层+数据库访问组合)
模型就是数据,就是 dao,bean
模型是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
V 代表 视图(View)(前端)
视图就是网页, JSP,用来展示模型中的数据
视图是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
C 代表 控制器(controller)
控制器的作用就是把不同的数据(Model),显示在不同的视图(View)上,Servlet 扮演的就是这样的角色。
控制器是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

1、三层是基于业务逻辑来分的,而MVC是基于页面来分的
2、三层是软件架构,通过接口实现编程;MVC模式是一种复合设计模式,一种解决方案
3、三层模式是体系结构模式,MVC是设计模式
4、三层模式又可归于部署模式,MVC可归于表示模式

前后端分离开发模式

体现 让专业的人做专业的事情,前端代码由前端来完成,后端代码由我们后端来完成
后端程序只需要将接口数据提供给前端调用即可。
前端:vue、饿了么UI、网页数据 例如 html、js、css
后端:接口中数据 springmvc+mybatis
将前端和后端代码分开的
View视图层—-jsp、ftl、js、css
com.mayikt.controller——控制层springmvc 底层基于servlet 控制页面跳转、控制页面展示数据
com.mayikt.controller——返回json 给前端
com.mayikt.service——业务逻辑层
com.mayikt.dao——数据库访问层

image.png

SpringMVC概述

1.SpringMVC 是一种基于 Java 实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,它和 Struts2 都属于表现层的框架,属于 Spring FrameWork 的后续产品,Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
2.SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成 为最优秀的 MVC 框架,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
简单总结:SpringMVC是一种基于Java实现MVC模型轻量级框架, 底层基于Servlet封装。

SpringMVC环境搭建(注解启动方式)

创建maven工程
image.png

Maven依赖

  1. <!-- 整合springmvc框架依赖 -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>5.2.10.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>javax.servlet</groupId>
  9. <artifactId>javax.servlet-api</artifactId>
  10. <version>3.1.0</version>
  11. <scope>provided</scope>
  12. </dependency>

创建控制器层

  1. package com.mayikt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * @author 余胜军
  9. * @ClassName MayiktController
  10. * @qq 644064779
  11. * @addres www.mayikt.com
  12. * 微信:yushengjun644
  13. */
  14. @Controller
  15. public class MayiktController {
  16. /**
  17. * 1.@Controller作用
  18. * 需要在我们的类上加上@Controller注解 标记该类是为springmvc控制类
  19. * 2. @RequestMapping
  20. * 定义url映射
  21. * 3. @ResponseBody
  22. * 该接口返回我们的json数据
  23. */
  24. // /**
  25. // * 访问到该请求 返回json数据
  26. // *
  27. // * @return
  28. // */
  29. @RequestMapping("/getMayikt")
  30. @ResponseBody
  31. public Map<String, Object> getMayikt() {
  32. HashMap<String, Object> result = new HashMap<>();
  33. result.put("code", "200");
  34. result.put("msg", "ok");
  35. //访问该接口的 返回json数据
  36. return result;
  37. }
  38. // @RequestMapping("/getMayikt")
  39. // @ResponseBody
  40. // public String getMayikt() {
  41. // return "{code:'200',msg:'ok'}";
  42. // }
  43. }

创建配置类

  1. package com.mayikt.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. /**
  5. * @author 余胜军
  6. * @ClassName SpringMVCConfig
  7. * @qq 644064779
  8. * @addres www.mayikt.com
  9. * 微信:yushengjun644
  10. */
  11. @Configuration
  12. @ComponentScan("com.mayikt.controller")
  13. public class SpringMVCConfig {
  14. /**
  15. * 1.@Configuration 定义SpringMVCConfig.xml配置文件
  16. * 2.需要将我们的控制类注入到ioc容器 @ComponentScan("com.mayikt.controller")
  17. * @ComponentScan("com.mayikt.controller")将该包下所有的类 注入到IOC容器种
  18. * 3.在springmvc原理 所有请求过来先达到我们的 DispatcherServlet 分发具体控制类 方法执行
  19. */
  20. }

注册配置类

  1. package com.mayikt.config;
  2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  3. import org.springframework.web.context.WebApplicationContext;
  4. import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  5. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  6. import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
  7. /**
  8. * @author 余胜军
  9. * @ClassName ServletInitializer
  10. * @qq 644064779
  11. * @addres www.mayikt.com
  12. * 微信:yushengjun644
  13. */
  14. public class ServletInitializer extends AbstractDispatcherServletInitializer {
  15. @Override
  16. protected WebApplicationContext createServletApplicationContext() {
  17. // 注册我们的 springmvc config 配置类
  18. AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext
  19. = new AnnotationConfigWebApplicationContext();
  20. annotationConfigWebApplicationContext.register(SpringMVCConfig.class);
  21. return annotationConfigWebApplicationContext;
  22. }
  23. @Override
  24. protected String[] getServletMappings() {
  25. return new String[]{"/"};
  26. }
  27. @Override
  28. protected WebApplicationContext createRootApplicationContext() {
  29. return null;
  30. }
  31. }

maven tomcat插件运行

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.tomcat.maven</groupId>
  5. <artifactId>tomcat7-maven-plugin</artifactId>
  6. <configuration>
  7. <port>85</port>
  8. <path>/</path>
  9. <ignorePackaging>true</ignorePackaging>
  10. </configuration>
  11. </plugin>
  12. </plugins>
  13. </build>

image.png

搭建环境常见问题

1.扫包范围填写错误 @ComponentScan(“com.mayikt.controller”)
2.在控制类没有加上@Controller
导致接口访问404

SpringMVC环境搭建(xml启动方式)

springboot 全是注解方式启动

Maven依赖

  1. <dependencies>
  2. <!-- 整合springmvc框架依赖 -->
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-webmvc</artifactId>
  6. <version>5.2.10.RELEASE</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>javax.servlet</groupId>
  10. <artifactId>javax.servlet-api</artifactId>
  11. <version>3.1.0</version>
  12. <scope>provided</scope>
  13. </dependency>
  14. </dependencies>

springmvc.xml

image.png

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context.xsd">
  13. <!--1.配置spring创建容器时要扫描的包-->
  14. <context:component-scan base-package="com.mayikt.controller"></context:component-scan>
  15. <!--2.配置spring开启注解mvc 的支持-->
  16. <mvc:annotation-driven></mvc:annotation-driven>
  17. </beans>

web.xml配置

所有请求过来都是先达到我们的DispatcherServlet
springmvc 基于 Servlet封装

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  4. version="3.0">
  5. <!-- SpringMVC前端控制器 -->
  6. <servlet>
  7. <servlet-name>springmvc</servlet-name>
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9. <init-param>
  10. <param-name>contextConfigLocation</param-name>
  11. <param-value>classpath:spring-mvc.xml</param-value>
  12. </init-param>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>springmvc</servlet-name>
  16. <url-pattern>/</url-pattern>
  17. </servlet-mapping>
  18. </web-app>

定义控制器

  1. package com.mayikt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * @author 余胜军
  9. * @ClassName MayiktController
  10. * @qq 644064779
  11. * @addres www.mayikt.com
  12. * 微信:yushengjun644
  13. */
  14. @Controller
  15. public class MayiktController {
  16. /**
  17. * 1.@Controller作用
  18. * 需要在我们的类上加上@Controller注解 标记该类是为springmvc控制类
  19. * 2. @RequestMapping
  20. * 定义url映射
  21. * 3. @ResponseBody
  22. * 该接口返回我们的json数据
  23. */
  24. // /**
  25. // * 访问到该请求 返回json数据
  26. // *
  27. // * @return
  28. // */
  29. @RequestMapping("/getMayikt")
  30. @ResponseBody
  31. public String getMayikt() {
  32. return "{code:'200',msg:'ok'}";
  33. }
  34. }

外部tomcat运行

需要将这些jar包存入 tomcat lib目录 否则报错 找不到类

springmvc需要的依赖jar包.rar
apache-tomcat-8.5.78-windows-x64.zip
image.png

SpringMVC PostMan工具使用

PostMan简介

一 简介 Postman 是一款功能超级强大的用于发送 HTTP 请求的 Chrome插件 。做web页面开发和测试的人员会使用到该工具其主要特点 特点: 创建 + 测试:创建和发送任何的HTTP请求,使用PostMan发送 Get、Post、Delete请求等。
PostMan安装包下载:
Postman-win64-9.24.2-Setup.rar

SpringMVC 请求与响应

@RequestMapping

@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
如果加载方法上就是具体访问路径 如果加载类上就是我们访问的前缀
springmvc 定义url路径是不允许重复
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping’: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map ‘userController’ method com.mayikt.controller.UserController#add() to { /add}: There is already ‘orderController’ bean method com.mayikt.controller.OrderController#add() mapped.

  1. package com.mayikt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. /**
  6. * @author 余胜军
  7. * @ClassName UserController
  8. * @qq 644064779
  9. * @addres www.mayikt.com
  10. * 微信:yushengjun644
  11. */
  12. @Controller
  13. @RequestMapping("/user")
  14. public class UserController {
  15. /**
  16. * /add UserController.add OrderController.add?
  17. * 如果我们将@RequestMapping注解加在我们的类上面 是访问该接口前缀
  18. * 如果加在方法上就是我们具体的访问路径
  19. * /user/add
  20. * @return
  21. */
  22. @RequestMapping("/add")
  23. @ResponseBody
  24. public String add() {
  25. return "add ok";
  26. }
  27. @RequestMapping("/delete")
  28. @ResponseBody
  29. public String delete() {
  30. return "delete ok";
  31. }
  32. @RequestMapping("/select")
  33. @ResponseBody
  34. public String select() {
  35. return "delete ok";
  36. }
  37. }
  1. package com.mayikt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. /**
  6. * @author 余胜军
  7. * @ClassName OrderController
  8. * @qq 644064779
  9. * @addres www.mayikt.com
  10. * 微信:yushengjun644
  11. */
  12. @Controller
  13. @RequestMapping("/order")
  14. public class OrderController {
  15. @RequestMapping("/add")
  16. @ResponseBody
  17. public String add() {
  18. return "add ok";
  19. }
  20. @RequestMapping("/delete")
  21. @ResponseBody
  22. public String delete() {
  23. return "delete ok";
  24. }
  25. }

接受Get/Post请求参数

和Controller层方法的形参同名,那么可以直接通过参数名接收值 即可

  1. package com.mayikt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. /**
  7. * @author 余胜军
  8. * @ClassName MemberController
  9. * @qq 644064779
  10. * @addres www.mayikt.com
  11. * 微信:yushengjun644
  12. */
  13. @Controller
  14. public class MemberController {
  15. /**
  16. * addMember
  17. * <p>
  18. * RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete
  19. * method = RequestMethod.POST 设定该接口支持的类型 post
  20. *
  21. * @return
  22. */
  23. @RequestMapping(value = "/addMember", method = RequestMethod.POST)
  24. @ResponseBody
  25. public String addMemberPost(Integer id, String name) {
  26. System.out.println("id:" + id);
  27. System.out.println("name:" + name);
  28. return "ok";
  29. }
  30. /**
  31. * addMember
  32. * <p>
  33. * RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete
  34. * method = RequestMethod.POST 设定该接口支持的类型 post
  35. *
  36. * @return
  37. */
  38. @RequestMapping(value = "/addMember", method = RequestMethod.GET)
  39. @ResponseBody
  40. public String addMemberGet(Integer id, String name) {
  41. System.out.println("id:" + id);
  42. System.out.println("name:" + name);
  43. return "ok---get";
  44. }
  45. }

springmvc5种接受参数类型

1.普通参数
2.对象参数
3.嵌套对象参数
4.数组参数
5.集合普通参数

普通参数

1.url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数;
2.如果发生url地址传参,地址参数名与形参变量名不同,使用@RequestParam绑定参数关系;
参数:
required:是否为必传参数
defaultValue:参数默认值
HTTP Status 400 - Required Integer parameter ‘mayiktAge’ is not present

  1. //springmvc5种接受参数类型
  2. //1.普通参数
  3. @RequestMapping("/demo01")
  4. @ResponseBody
  5. public String demo01(String name, Integer age) {
  6. return "name:" + name + ",age:" + age;
  7. }
  8. //1.普通参数
  9. /**
  10. * 1.@RequestParam("name")地址栏 传递参数名称name 方法形参名称mayiktName
  11. * 2.required 是否必须传递该参数 默认是为true 也就是需要传递该参数 required = false 不需要必须传递该参数
  12. * required
  13. */
  14. @RequestMapping("/demo02")
  15. @ResponseBody
  16. public String demo02(@RequestParam(name = "name", required = false) String mayiktName,
  17. @RequestParam(name = "age", required = false) Integer mayiktAge) {
  18. return "name:" + mayiktName + ",age:" + mayiktAge;
  19. }

对象参数

请求参数名与形参对象属性名相同,定义对象类型形参即可接收参数

嵌套对象参数

嵌套对象参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套对象属性参数

  1. /**
  2. * 使用对象来进行接受参数
  3. * 地址栏中传递的参数名称与对象中成员属性名称保持一致即可
  4. *
  5. * @param mayiktUser
  6. * @return
  7. */
  8. @RequestMapping("/demo03")
  9. @ResponseBody
  10. public String demo02(MayiktUserEntity mayiktUser) {
  11. return "name:" + mayiktUser.getUserName() + ",age:" + mayiktUser.getAge() + ",addres" +
  12. mayiktUser.getMayiktUserInfo().getAddres().getBytes("ISO-8859-1","UTF-8");
  13. }
  14. package com.mayikt.entity;
  15. /**
  16. * @author 余胜军
  17. * @ClassName MayiktUserEntity
  18. * @qq 644064779
  19. * @addres www.mayikt.com
  20. * 微信:yushengjun644
  21. */
  22. public class MayiktUserEntity {
  23. /**
  24. * ?userName=mayikt&age=22
  25. */
  26. private String userName;
  27. private Integer age;
  28. /**
  29. * ?mayiktUserInfo.addres=湖北武汉市
  30. */
  31. private MayiktUserInfoEntity mayiktUserInfo;
  32. public String getUserName() {
  33. return userName;
  34. }
  35. public void setUserName(String userName) {
  36. this.userName = userName;
  37. }
  38. public Integer getAge() {
  39. return age;
  40. }
  41. public void setAge(Integer age) {
  42. this.age = age;
  43. }
  44. public MayiktUserInfoEntity getMayiktUserInfo() {
  45. return mayiktUserInfo;
  46. }
  47. public void setMayiktUserInfo(MayiktUserInfoEntity mayiktUserInfo) {
  48. this.mayiktUserInfo = mayiktUserInfo;
  49. }
  50. }

数组参数

请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数
http://localhost:85/demo04?arrays=1&arrays=2

  1. @RequestMapping("/demo04")
  2. @ResponseBody
  3. public String demo02(String[] arrays) {
  4. return Arrays.toString(arrays);
  5. }

集合保存普通参数

请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
http://localhost:85/demo05?arrays=1&arrays=2
@RequestParam :同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据

  1. @RequestMapping("/demo05")
  2. @ResponseBody
  3. public String demo02(@RequestParam List<String> arrays) {
  4. return Arrays.toString(arrays.toArray());
  5. }

springmvc接受json数据

开启接受json数据

  1. @Configuration
  2. @ComponentScan("com.mayikt.controller")
  3. @EnableWebMvc
  4. public class SpringMVCConfig {

maven依赖

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>
  4. <version>2.9.0</version>
  5. </dependency>

接受参数加上@RequestBody MayiktUserEntity mayiktUserEntity 标记 接受json数据
自动根据json数据反序列化成对象mayiktUserEntity
1.以实体类方式接收
image.png

  1. {
  2. "userName":"mayikt",
  3. "age":22,
  4. "mayiktUserInfo":{
  5. "addres":"yushengjun"
  6. }
  7. }
  1. /**
  2. * 接受json数据(以实体类方式)
  3. * {
  4. * "userName":"mayikt",
  5. * "age":22
  6. * }
  7. *
  8. * @return
  9. */
  10. @RequestMapping("/demo06")
  11. @ResponseBody
  12. public String demo06(@RequestBody MayiktUserEntity mayiktUserEntity) {
  13. return mayiktUserEntity.toString();
  14. }

2.以Map接收
json数据 key是为 Map的key value Map的value
需要注意json数据value与Map集合value类型保持一致否则报错

  1. @RequestMapping("/demo08")
  2. @ResponseBody
  3. public String demo08(@RequestBody Map<String, String> paramMap) {
  4. return paramMap.toString();
  5. }

3.以List接收

  1. [
  2. {
  3. "userName": "mayikt",
  4. "age": "20"
  5. },
  6. {
  7. "userName": "mayikt",
  8. "age": "22"
  9. }
  10. ]
  1. @RequestMapping("/demo10")
  2. @ResponseBody
  3. public String demo10(@RequestBody List<MayiktUserEntity> list) {
  4. return list.toArray().toString();
  5. }
  1. <h1>HTTP Status 415 - </h1>
  2. <HR size="1" noshade="noshade">
  3. <p><b>type</b> Status report</p>
  4. <p><b>message</b> <u></u></p>
  5. <p><b>description</b> <u>The server refused this request because the request entity is in a format not supported by
  6. the requested resource for the requested method.</u></p>

没有开启@EnableWebMvc

springmvc响应json数据

1.在接口上加上@ResponseBody 根据该方法返回值 返回对应json数据 底层 根据返回值 序列化成json数据。
2.@RestController 标记该控制类所有接口都是返回json数据
@Controller
@ResponseBody

  1. @RestController
  2. public class MayiktRestController {

使用HttpServletRequest 获取参数

springmvc底层基于Servlet
Servlet HttpServletRequest HttpServletResponse

获取httprequest/response三种方式
1.public String mayikt(HttpServletRequest request,HttpServletResponse response)
2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
3. @Autowired
private HttpServletRequest request;

  1. /**
  2. * 获取到我们的 HttpServletRequest httpServletRequest
  3. *
  4. * @param id
  5. * @param name
  6. * @param httpServletRequest
  7. * @return
  8. */
  9. @RequestMapping(value = "/httprequestDemo01", method = RequestMethod.GET)
  10. @ResponseBody
  11. public String httprequestDemo01(Integer id, String name, HttpServletRequest httpServletRequest) {
  12. System.out.println("id:" + id);
  13. System.out.println("name:" + name);
  14. String reqId = httpServletRequest.getParameter("id");
  15. String reqName = httpServletRequest.getParameter("name");
  16. System.out.println("reqId:" + reqId);
  17. System.out.println("reqName:" + reqName);
  18. /**
  19. * 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  20. */
  21. // 从ThreadLocal获取HttpServletRequest springmvc 底层基于Servlet 提前缓存好了ttpServletRequest
  22. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  23. return "ok---get";
  24. }
  25. /**
  26. * 获取到我们的 HttpServletRequest httpServletRequest
  27. *
  28. * @param id
  29. * @param name
  30. * @return
  31. */
  32. @RequestMapping(value = "/httprequestDemo02", method = RequestMethod.GET)
  33. @ResponseBody
  34. public String httprequestDemo02(Integer id, String name) {
  35. System.out.println("id:" + id);
  36. System.out.println("name:" + name);
  37. /**
  38. * 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  39. */
  40. // 从ThreadLocal获取HttpServletRequest springmvc 底层基于Servlet 提前缓存好了ttpServletRequest
  41. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  42. String reqId = request.getParameter("id");
  43. String reqName = request.getParameter("name");
  44. System.out.println("reqId:" + reqId);
  45. System.out.println("reqName:" + reqName);
  46. return "ok---get";
  47. }

springmvc restful简单介绍

什么是restful

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格规范。基于这个风格设计的软件可以更简洁,更有层次。
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
传统方式操作资源:通过不同的参数来实现不同的效果,post 和 get。
http://127.0.0.1/mayikt/getUser?id=1 查询,GET 用户id是为1信息
http://127.0.0.1/mayikt/saveUser 新增,POST
http://127.0.0.1/mayikt/updateUser 更新,POST
http://127.0.0.1/mayikt/deleteUser?id=1 删除,GET
(查询、删除)get 写操作(新增、修改)Post

使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果
例如:请求地址一样,但是实现的效果不一样 例如
发送请求get 执行查询、 发送POST 执行新增、发送PUT执行更新、发送DELETE
执行删除
http://127.0.0.1/user/1 查询,GET
http://127.0.0.1/user 新增数据,POST
http://127.0.0.1/user 更新,PUT
http://127.0.0.1/user/1 删除,DELETE
根据发送不同的类型 判断 访问不同的接口

restful案例演示

在@RequestMapping的value中使用URI template({变量名}),然后在@RequestMapping注解方法的需要绑定的参数前,使用@PathVariable指定变量名(如果变量名和参数名一致也可以不指定),从而将URL中的值绑定到参数上。
@RequestMapping组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

  1. package com.mayikt.controller;
  2. import com.mayikt.entity.MayiktUserEntity;
  3. import org.springframework.web.bind.annotation.*;
  4. /**
  5. * @author 余胜军
  6. * @ClassName MayiktRestfulController
  7. * @qq 644064779
  8. * @addres www.mayikt.com
  9. * 微信:yushengjun644
  10. */
  11. @RestController
  12. public class MayiktUserRestfulController {
  13. /**
  14. * Restful api 请求地址都是一样 根据不同请求方法判断
  15. * User 增加/删除/修改/查询 api接口
  16. * 提供根据id查询接口 ---请求方法类型 get 指定请求类型 是为get
  17. * /user/{id} /user/1
  18. */
  19. // @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
  20. @GetMapping(value = "/user/{id}")
  21. public MayiktUserEntity getUser(@PathVariable("id") Integer id) {
  22. System.out.println("[getUser] id:" + id);
  23. return new MayiktUserEntity("mayikt" + id, 22);
  24. }
  25. /**
  26. * 根据id删除数据 发送请求类型 delete
  27. *
  28. * @param id
  29. * @return
  30. */
  31. // @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
  32. @DeleteMapping(value = "/user/{id}")
  33. public String deleteUser(@PathVariable("id") Integer id) {
  34. System.out.println("[deleteUser] id:" + id);
  35. return "ok:id" + id;
  36. }
  37. /**
  38. * 新增添加数据 Post类型 传递 json数据
  39. *
  40. * @return
  41. */
  42. // @RequestMapping(value = "/user", method = RequestMethod.POST)
  43. @PostMapping(value = "/user")
  44. public String addUser(@RequestBody MayiktUserEntity mayiktUserEntity) {
  45. System.out.println("[addUser] mayiktUserEntity:" + mayiktUserEntity);
  46. return "ok";
  47. }
  48. /**
  49. * 修改数据 put类型 传递 json数据
  50. *
  51. * @return
  52. */
  53. // @RequestMapping(value = "/user", method = {RequestMethod.PUT})
  54. @PutMapping(value = "/user")
  55. public String updateUser(@RequestBody MayiktUserEntity mayiktUserEntity) {
  56. System.out.println("[updateUser] mayiktUserEntity:" + mayiktUserEntity);
  57. return "ok";
  58. }
  59. /**
  60. * @RequestMapping 没有指定请求方法 则 包含所有请求类型 get、put、post等 指定请求方法类型 method = RequestMethod.PUT
  61. */
  62. }

springmvc 整合jsp技术(过时 了解该技术)

核心配置

  1. package com.mayikt.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.ComponentScan;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
  6. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  7. import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
  8. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  9. import org.springframework.web.servlet.view.InternalResourceViewResolver;
  10. /**
  11. * @author 余胜军
  12. * @ClassName SpringMVCConfig
  13. * @qq 644064779
  14. * @addres www.mayikt.com
  15. * 微信:yushengjun644
  16. */
  17. @Configuration
  18. @ComponentScan("com.mayikt.controller")
  19. @EnableWebMvc
  20. public class SpringMVCConfig implements WebMvcConfigurer {
  21. /**
  22. * 1.@Configuration 定义SpringMVCConfig.xml配置文件
  23. * 2.需要将我们的控制类注入到ioc容器 @ComponentScan("com.mayikt.controller")
  24. * @ComponentScan("com.mayikt.controller")将该包下所有的类 注入到IOC容器种
  25. * 3.在springmvc原理 所有请求过来先达到我们的 DispatcherServlet 分发具体控制类 方法执行
  26. *
  27. *
  28. * @Configuration
  29. * SpringMVCConfig.java @Configuration
  30. * springmvc.xml=== SpringMVCConfig.java
  31. * -->
  32. */
  33. //WebMvcConfigurer
  34. @Bean
  35. public InternalResourceViewResolver resourceViewResolver() {
  36. InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
  37. //请求视图文件的前缀地址
  38. internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
  39. //请求视图文件的后缀
  40. internalResourceViewResolver.setSuffix(".jsp");
  41. internalResourceViewResolver.setExposeContextBeansAsAttributes(true);
  42. return internalResourceViewResolver;
  43. }
  44. /**
  45. * 视图配置
  46. *
  47. * @param registry
  48. */
  49. public void configureViewResolvers(ViewResolverRegistry registry) {
  50. registry.viewResolver(resourceViewResolver());
  51. }
  52. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  53. configurer.enable();
  54. }
  55. }

webapp 目录下创建 WEB-INF/jsp 存放jsp

定义控制器

  1. package com.mayikt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.servlet.ModelAndView;
  6. import javax.servlet.http.HttpServletRequest;
  7. /**
  8. * @author 余胜军
  9. * @ClassName MayiktJspController
  10. * @qq 644064779
  11. * @addres www.mayikt.com
  12. * 微信:yushengjun644
  13. */
  14. @Controller
  15. public class MayiktJspController {
  16. @RequestMapping("/mayiktJsp")
  17. public String mayiktJsp() {
  18. return "mayikt";
  19. }
  20. }

定义jsp页面

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: mayikt
  4. Date: 2022/7/29
  5. Time: 16:12
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>mayikt</title>
  12. </head>
  13. <body>
  14. springmvc整合jsp
  15. </body>
  16. </html>

spring+springmvc+mybatis整合

项目技术需求分析

1.使用ssm+layui技术开发 对用户表数据实现增删改查
采用前后端分离架构模式

image.png
image.png

SSM环境的整合之提供增删改查

整合数据库表结构

  1. CREATE TABLE `mayikt_users` (
  2. `id` int NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  4. `age` int DEFAULT NULL,
  5. `addres` varchar(255) DEFAULT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb3;

整合maven依赖

spring/springmvc/mybatis

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.mayikt</groupId>
  6. <artifactId>mayikt-ssm02</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <name>mayikt-ssm02 Maven Webapp</name>
  10. <!-- FIXME change it to the project's website -->
  11. <url>http://www.example.com</url>
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <maven.compiler.source>1.7</maven.compiler.source>
  15. <maven.compiler.target>1.7</maven.compiler.target>
  16. </properties>
  17. <dependencies>
  18. <!--整合springmvc -->
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>5.2.10.RELEASE</version>
  23. </dependency>
  24. <!--整合mybatis -->
  25. <dependency>
  26. <groupId>org.mybatis</groupId>
  27. <artifactId>mybatis</artifactId>
  28. <version>3.5.6</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-jdbc</artifactId>
  33. <version>5.2.10.RELEASE</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.mybatis</groupId>
  37. <artifactId>mybatis-spring</artifactId>
  38. <version>1.3.0</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>mysql</groupId>
  42. <artifactId>mysql-connector-java</artifactId>
  43. <version>8.0.13</version>
  44. </dependency>
  45. <!--使用alibaba数据源 -->
  46. <dependency>
  47. <groupId>com.alibaba</groupId>
  48. <artifactId>druid</artifactId>
  49. <version>1.1.16</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>javax.servlet</groupId>
  53. <artifactId>javax.servlet-api</artifactId>
  54. <version>3.1.0</version>
  55. <scope>provided</scope>
  56. </dependency>
  57. <!--使用@ResponseBody 能够响应数据 -->
  58. <dependency>
  59. <groupId>com.fasterxml.jackson.core</groupId>
  60. <artifactId>jackson-databind</artifactId>
  61. <version>2.9.0</version>
  62. </dependency>
  63. </dependencies>
  64. <build>
  65. <plugins>
  66. <plugin>
  67. <groupId>org.apache.tomcat.maven</groupId>
  68. <artifactId>tomcat7-maven-plugin</artifactId>
  69. <version>2.1</version>
  70. <configuration>
  71. <port>80</port>
  72. <path>/</path>
  73. </configuration>
  74. </plugin>
  75. </plugins>
  76. </build>
  77. </project>

实体类层

com.mayikt.entity

数据库访问层

com.mayikt.mapper

业务逻辑层

com.mayikt.service

控制层

com.mayikt.controller

SSM环境的整合之配置整合

JdbcConfig

  1. package com.mayikt.config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  6. import org.springframework.transaction.PlatformTransactionManager;
  7. import javax.sql.DataSource;
  8. /**
  9. * @author 余胜军
  10. * @ClassName JdbcConfig
  11. * @qq 644064779
  12. * @addres www.mayikt.com
  13. * 微信:yushengjun644
  14. */
  15. public class JdbcConfig {
  16. /**
  17. * 定义数据源配置
  18. *
  19. * @return
  20. */
  21. @Bean
  22. public DataSource dataSource() {
  23. DruidDataSource druidDataSource = new DruidDataSource();
  24. druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
  25. druidDataSource.setUrl("jdbc:mysql://localhost:3306/mayikt?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT");
  26. druidDataSource.setUsername("root");
  27. druidDataSource.setPassword("root");
  28. return druidDataSource;
  29. }
  30. /**
  31. * 整合事务
  32. *
  33. * @param dataSource
  34. * @return
  35. */
  36. @Bean
  37. public PlatformTransactionManager platformTransactionManager(@Autowired DataSource dataSource) {
  38. DataSourceTransactionManager dataSourceTransactionManager =
  39. new DataSourceTransactionManager();
  40. dataSourceTransactionManager.setDataSource(dataSource);
  41. return dataSourceTransactionManager;
  42. }
  43. }

MybatisConfig

  1. package com.mayikt.config;
  2. import org.mybatis.spring.SqlSessionFactoryBean;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import javax.sql.DataSource;
  6. /**
  7. * @author 余胜军
  8. * @ClassName MybatisConfig
  9. * @qq 644064779
  10. * @addres www.mayikt.com
  11. * 微信:yushengjun644
  12. */
  13. public class MybatisConfig {
  14. /**
  15. * mybatis相关配置
  16. *
  17. * @param dataSource
  18. * @return
  19. */
  20. @Bean
  21. public SqlSessionFactoryBean sqlSessionFactory(@Autowired DataSource dataSource) {
  22. SqlSessionFactoryBean sqlSessionFactoryBean =
  23. new SqlSessionFactoryBean();
  24. sqlSessionFactoryBean.setDataSource(dataSource);
  25. // 实体层包
  26. sqlSessionFactoryBean.setTypeAliasesPackage("com.mayikt.entity");
  27. return sqlSessionFactoryBean;
  28. }
  29. }

SpringConfig

  1. package com.mayikt.config;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.context.annotation.ComponentScan;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.FilterType;
  6. import org.springframework.context.annotation.Import;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.transaction.annotation.EnableTransactionManagement;
  9. /**
  10. * @author 余胜军
  11. * @ClassName SpringConfig
  12. * @qq 644064779
  13. * @addres www.mayikt.com
  14. * 微信:yushengjun644
  15. */
  16. @Configuration
  17. @ComponentScan({"com.mayikt.service"})
  18. //开启事务
  19. @EnableTransactionManagement
  20. @Import({MybatisConfig.class, JdbcConfig.class})
  21. @MapperScan("com.mayikt.mapper")
  22. public class SpringConfig {
  23. }

SpringMVCConfig

  1. package com.mayikt.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  5. /**
  6. * @author 余胜军
  7. * @ClassName SpringMVCConfig
  8. * @qq 644064779
  9. * @addres www.mayikt.com
  10. * 微信:yushengjun644
  11. */
  12. @EnableWebMvc
  13. @Configuration
  14. @ComponentScan("com.mayikt.controller")
  15. public class SpringMVCConfig {
  16. }

ServletConfig

  1. package com.mayikt.config;
  2. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  3. /**
  4. * @author 余胜军
  5. * @ClassName ServletConfig
  6. * @qq 644064779
  7. * @addres www.mayikt.com
  8. * 微信:yushengjun644
  9. */
  10. public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
  11. protected Class<?>[] getRootConfigClasses() {
  12. return new Class[]{SpringConfig.class};
  13. }
  14. protected Class<?>[] getServletConfigClasses() {
  15. return new Class[]{SpringMVCConfig.class};
  16. }
  17. protected String[] getServletMappings() {
  18. return new String[]{"/"};
  19. }
  20. }

接口响应状态码

统一规范返回数据的格式,此处以json格式为例。返回数据应包含:返回状态码、返回状态信息、具体数据。
格式规范如下:

  1. {
  2. "code":"200",
  3. "msg":"ok",
  4. "data": {
  5. //json格式的具体数据
  6. }
  7. }

查询到数据

  1. {
  2. "code":"200",
  3. "msg":"ok",
  4. "data": {
  5. "userName":"mayikt",
  6. "age":22
  7. }
  8. }

前端 ajax技术 if(code==200){
“data”: {
“userName”:”mayikt”,
“age”:22
}
}
没有查询到数据

  1. {
  2. "code":"500",
  3. "msg":"fail",
  4. "data": {
  5. }
  6. }

新增数据

  1. {
  2. "code":"500",
  3. "msg":"插入失败",
  4. "data": {
  5. }
  6. }

前端:if(code==200){
alert(“ “msg”:”插入成功””)
}

Api Code状态码

1** 服务器收到请求,需要请求者继续执行操作
2** 操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

如何封装接口响应状态码

  1. package com.mayikt.controller;
  2. import java.util.HashMap;
  3. /**
  4. * @author 余胜军
  5. * @ClassName BaseController
  6. * @qq 644064779
  7. * @addres www.mayikt.com
  8. * 微信:yushengjun644
  9. */
  10. public class BaseController {
  11. /**
  12. * 提供处理请求响应成功的情况下
  13. *
  14. * @param data
  15. * @return
  16. */
  17. public HashMap<String, Object> setResultOk(Object data) {
  18. return setResult(200, "ok", data);
  19. }
  20. public HashMap<String, Object> setResultSuccess(String msg) {
  21. return setResult(200, msg, null);
  22. }
  23. /**
  24. * 提供处理请求失败情况下
  25. *
  26. * @param msg
  27. * @return
  28. */
  29. public HashMap<String, Object> setResultError(String msg) {
  30. return setResult(500, msg, null);
  31. }
  32. /**
  33. * @param code code 200 处理成功 500 处理失败
  34. * @param msg 响应错误内容
  35. * @param data 响应的数据
  36. * @return
  37. */
  38. public HashMap<String, Object> setResult(Integer code, String msg, Object data) {
  39. HashMap<String, Object> result = new HashMap<>();
  40. result.put("code", code);
  41. result.put("msg", msg);
  42. result.put("data", data);
  43. return result;
  44. }
  45. }

整合全局捕获异常

当系统发生错误时,统一将系统错误日志 返回输出

  1. package com.mayikt.controller;
  2. import org.springframework.web.bind.annotation.ControllerAdvice;
  3. import org.springframework.web.bind.annotation.ExceptionHandler;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import javax.servlet.http.HttpServletRequest;
  6. import java.util.Map;
  7. @ControllerAdvice
  8. public class GlobalExceptionHandler extends BaseController {
  9. @ResponseBody
  10. @ExceptionHandler(value = Exception.class)
  11. public Map<String, Object> handleException(HttpServletRequest h, Exception e) {
  12. System.out.println("自定义异常:" + e);
  13. return setResultError("系统发生了错误!");
  14. }
  15. }

整合前端layui

前后端分离架构模式

前端—-页面编写好 数据源来自于 后端接口 layui或者vue等
将接口编写好即可(springmvc)

使用layui画出首页界面

html/js/css
https://layuion.com/docs/element/table.html
引入css

  1. <!-- 引入layui css -->
  2. <link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui-v2.5.6/css/layui.css" />
  3. <!-- 引入layui js -->
  4. <script src="https://www.layuicdn.com/layui-v2.5.6/layui.js"></script>
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>开始使用 layui</title>
  7. <!-- 引入layui css -->
  8. <link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui-v2.5.6/css/layui.css" />
  9. <!-- 引入layui js -->
  10. <script src="https://www.layuicdn.com/layui-v2.5.6/layui.js"></script>
  11. </head>
  12. <body>
  13. <table class="layui-table">
  14. <colgroup>
  15. <col width="150">
  16. <col width="200">
  17. <col>
  18. </colgroup>
  19. <thead>
  20. <tr>
  21. <th>学生ID</th>
  22. <th>学生名称</th>
  23. <th>学生年龄</th>
  24. <th>学生地址</th>
  25. <th>操作</th>
  26. </tr>
  27. </thead>
  28. <tbody>
  29. <tr>
  30. <td>1</td>
  31. <td>mayikt</td>
  32. <td>22</td>
  33. <td>湖北武汉市</td>
  34. <td><a>删除</a></td>
  35. </tr>
  36. </tbody>
  37. </table>
  38. </body>
  39. </html>

首页使用ajax调用后端接口读取数据

1.前端使用ajax技术 调用后端接口 获取到数据
2.jquery 解析数据并且渲染在页面中

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>首页</title>
  7. <link href="https://www.layuicdn.com/layui-v2.5.6/css/layui.css" rel="stylesheet">
  8. </head>
  9. <body>
  10. <!-- 你的 HTML 代码 -->
  11. <script src="https://www.layuicdn.com/layui-v2.5.6/layui.js"></script>
  12. <table class="layui-table" id="userData">
  13. </table>
  14. <script src="http://static.mayikt.com/jquery-1.11.1.min.js?t=3fe80cb6-7883-4054-bb2d-714ba66c2887"></script>
  15. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  16. <script>
  17. initData();
  18. function initData() {
  19. axios({
  20. // 请求方式
  21. method: 'GET',
  22. // 请求的地址
  23. url: 'http://127.0.0.1/user/getUsersAll'
  24. }).then(function (result) {
  25. // 1. 调用 axios 方法得到的返回值是 Promise 对象
  26. var userHtml = " <colgroup>\n" +
  27. " <col width=\"150\">\n" +
  28. " <col width=\"200\">\n" +
  29. " <col>\n" +
  30. " </colgroup>\n" +
  31. " <thead>\n" +
  32. " <tr>\n" +
  33. " <th>用户ID</th>\n" +
  34. " <th>用户名称</th>\n" +
  35. " <th>用户年龄</th>\n" +
  36. " <th>用户地址</th>\n" +
  37. " <th>操作</th>\n" +
  38. " </tr>\n" +
  39. " </thead>\n" +
  40. " <tbody>\n";
  41. var code = result.data.code;
  42. if (code == "200") {
  43. var data = result.data.data;
  44. for (var i = 0; i < data.length; i++) {
  45. userHtml += " <tr>\n" +
  46. " <td>" + data[i].id + "</td>\n" +
  47. " <td>" + data[i].name + "</td>\n" +
  48. " <td>23</td>\n" +
  49. " <td>湖北武汉</td>\n" +
  50. " <td><a>删除</a></td>\n" +
  51. " </tr>\n" +
  52. "\n";
  53. }
  54. }
  55. userHtml += " </tbody>";
  56. $("#userData").html(userHtml);
  57. })
  58. }
  59. </script>
  60. </body>
  61. </html>

后端提供查询所有用户数据接口

  1. /**
  2. * 查询所有用户数据结构
  3. *
  4. * @return
  5. */
  6. @GetMapping("/getUsersAll")
  7. public Map<String, Object> getUsersAll() {
  8. List<UserEntity> listUsers = userService.getUsersAll();
  9. return setResult(200, "ok", listUsers);
  10. }

前后端分离解决跨域问题

CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当一个资源去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问的那个资源就会遇到跨域问题
跨域问题是浏览器的一种安全策略,访问需要遵循同源策略:

URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议 不允许
http://www.a.com/a.js
http://192.168.110.11/b.js
域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 不允许

1.使用 jsonp 但是不支持post请求 ( 不推荐使用)
2.使用SpringMVC @CrossOrigin 注解(推荐)
3.基于网关解决跨域的问题 (推荐)
4.基于Nginx 根据不同项目访问(推荐)
5.使用SpringMVC @CrossOrigin 注解 解决跨域问题
response.getHeaders().set(“Access-Control-Allow-Origin”,”*”);
image.png

根据选择id删除用户数据

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>开始使用 layui</title>
  7. <!-- 引入layui css -->
  8. <link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui-v2.5.6/css/layui.css"/>
  9. <script src="http://static.mayikt.com/jquery-1.11.1.min.js?t=3fe80cb6-7883-4054-bb2d-714ba66c2887"></script>
  10. <!-- 引入layui js -->
  11. <script src="https://www.layuicdn.com/layui-v2.5.6/layui.js"></script>
  12. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  13. </head>
  14. <body>
  15. <table class="layui-table" id="userData">
  16. </table>
  17. <script>
  18. //初始化数据
  19. initData();
  20. function initData() {
  21. // 通过程序追加html
  22. // 利用ajax技术 调用到后端接口 拼接 table里面 html 元素
  23. var userListHtml = " <colgroup>\n" +
  24. " <col width=\"150\">\n" +
  25. " <col width=\"200\">\n" +
  26. " <col>\n" +
  27. " </colgroup>\n" +
  28. " <thead>\n" +
  29. " <tr >\n" +
  30. " <th>学生ID</th>\n" +
  31. " <th>学生名称</th>\n" +
  32. " <th>学生年龄</th>\n" +
  33. " <th>学生地址</th>\n" +
  34. " <th>操作</th>\n" +
  35. " </tr>\n" +
  36. " </thead>\n" +
  37. " <tbody>\n";
  38. axios({
  39. // 请求方式
  40. method: 'GET',
  41. // 请求的地址
  42. url: 'http://127.0.0.1/user/getUsersAll',
  43. }).then(function (result) {
  44. var code = result.data.code;
  45. var data = result.data.data;
  46. if (code == "200") {
  47. for (var i = 0; i < data.length; i++) {
  48. userListHtml += " <tr id=" + data[i].id + ">\n" +
  49. " <td>" + data[i].id + "</td>\n" +
  50. " <td>" + data[i].name + "</td>\n" +
  51. " <td>" + data[i].age + "</td>\n" +
  52. " <td>" + data[i].addres + "</td>\n" +
  53. " <td><a href='#' onclick='deleteUserInfo(" + data[i].id + ")'>删除</a></td>\n" +
  54. " </tr>\n";
  55. }
  56. }
  57. userListHtml += " </tbody>";
  58. $("#userData").html(userListHtml);
  59. });
  60. }
  61. function deleteUserInfo(id) {
  62. axios({
  63. // 请求方式
  64. method: 'delete',
  65. // 请求的地址
  66. url: 'http://127.0.0.1/user02/deleteById/' + id,
  67. }).then(function (result) {
  68. var code = result.data.code;
  69. if (code == "200") {
  70. alert('删除成功');
  71. $("#" + id).remove();
  72. }
  73. });
  74. }
  75. </script>
  76. </body>
  77. </html>


  1. function getUrlParam(name)
  2. {
  3. var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
  4. var r = window.location.search.substr(1).match(reg); //匹配目标参数
  5. if (r!=null)
  6. return unescape(r[2]);
  7. return null; //返回参数值
  8. }

新增用户数据

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>新增用户数据</title>
  6. <!-- 引入layui css -->
  7. <link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui-v2.5.6/css/layui.css"/>
  8. <script src="http://static.mayikt.com/jquery-1.11.1.min.js?t=3fe80cb6-7883-4054-bb2d-714ba66c2887"></script>
  9. <!-- 引入layui js -->
  10. <script src="https://www.layuicdn.com/layui-v2.5.6/layui.js"></script>
  11. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  12. </head>
  13. <body>
  14. <form class="layui-form" action="">
  15. <div class="layui-form-item">
  16. <label class="layui-form-label">用户名称</label>
  17. <div class="layui-input-block">
  18. <input type="text" name="name" required lay-verify="required" placeholder="请输入用户名称" autocomplete="off"
  19. class="layui-input">
  20. </div>
  21. </div>
  22. <div class="layui-form-item">
  23. <label class="layui-form-label">用户年龄</label>
  24. <div class="layui-input-block">
  25. <input type="text" name="age" required lay-verify="required" placeholder="请输入用户年龄" autocomplete="off"
  26. class="layui-input">
  27. </div>
  28. </div>
  29. <div class="layui-form-item layui-form-text">
  30. <label class="layui-form-label">用户地址</label>
  31. <div class="layui-input-block">
  32. <textarea name="addres" placeholder="请输入地址" class="layui-textarea"></textarea>
  33. </div>
  34. </div>
  35. <div class="layui-form-item">
  36. <div class="layui-input-block">
  37. <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
  38. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  39. </div>
  40. </div>
  41. </form>
  42. <script>
  43. //Demo
  44. layui.use('form', function () {
  45. var form = layui.form;
  46. //提交
  47. form.on('submit(formDemo)', function (data) {
  48. layer.msg(JSON.stringify(data.field));
  49. axios({
  50. method: "POST",
  51. url: "http://127.0.0.1/user/insertUser/",
  52. data: JSON.stringify(data.field),
  53. headers: {
  54. 'Content-Type': 'application/json;charset=UTF-8'
  55. }
  56. }).then(resp => {
  57. var code = resp.data.code;
  58. if (code == "200") {
  59. alert("新增数据成功");
  60. window.location.href = "index.html";
  61. } else {
  62. alert("新增数据失败");
  63. }
  64. })
  65. return false;
  66. });
  67. });
  68. </script>
  69. </body>
  70. </html>

修改数据

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>修改用户数据</title>
  6. <!-- 引入layui css -->
  7. <link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui-v2.5.6/css/layui.css"/>
  8. <script src="http://static.mayikt.com/jquery-1.11.1.min.js?t=3fe80cb6-7883-4054-bb2d-714ba66c2887"></script>
  9. <!-- 引入layui js -->
  10. <script src="https://www.layuicdn.com/layui-v2.5.6/layui.js"></script>
  11. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  12. </head>
  13. <body>
  14. <form class="layui-form" action="">
  15. <div class="layui-form-item">
  16. <label class="layui-form-label">用户ID</label>
  17. <div class="layui-input-block">
  18. <input type="text" name="id" id="id" required lay-verify="required"
  19. autocomplete="off"
  20. class="layui-input">
  21. </div>
  22. </div>
  23. <div class="layui-form-item">
  24. <label class="layui-form-label">用户名称</label>
  25. <div class="layui-input-block">
  26. <input type="text" name="name" id="name" required lay-verify="required" placeholder="请输入用户名称"
  27. autocomplete="off"
  28. class="layui-input">
  29. </div>
  30. </div>
  31. <div class="layui-form-item">
  32. <label class="layui-form-label">用户年龄</label>
  33. <div class="layui-input-block">
  34. <input type="text" name="age" id="age" required lay-verify="required" placeholder="请输入用户年龄"
  35. autocomplete="off"
  36. class="layui-input">
  37. </div>
  38. </div>
  39. <div class="layui-form-item layui-form-text">
  40. <label class="layui-form-label">用户地址</label>
  41. <div class="layui-input-block">
  42. <textarea name="addres" id="addres" placeholder="请输入地址" class="layui-textarea"></textarea>
  43. </div>
  44. </div>
  45. <div class="layui-form-item">
  46. <div class="layui-input-block">
  47. <button class="layui-btn" lay-submit lay-filter="formDemo">立即修改</button>
  48. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  49. </div>
  50. </div>
  51. </form>
  52. <script>
  53. getIdUserInfo();
  54. function getIdUserInfo() {
  55. //1.获取地址栏参数
  56. var id = getUrlParam("id");
  57. //2.发送ajax请求
  58. axios({
  59. // 请求方式
  60. method: 'get',
  61. // 请求的地址
  62. url: 'http://127.0.0.1/user/getById/' + id,
  63. }).then(function (result) {
  64. var code = result.data.code;
  65. if (code == "200") {
  66. var data = result.data.data;
  67. // 修改 input标签对应的value值
  68. $("#name").val(data.name);
  69. $("#age").val(data.age);
  70. $("#addres").val(data.addres);
  71. $("#id").val(data.id);
  72. } else {
  73. alert("查询用户信息数据失败!");
  74. }
  75. })
  76. }
  77. function getUrlParam(name) {
  78. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
  79. var r = window.location.search.substr(1).match(reg); //匹配目标参数
  80. if (r != null)
  81. return unescape(r[2]);
  82. return null; //返回参数值
  83. }
  84. </script>
  85. <script>
  86. //Demo
  87. layui.use('form', function () {
  88. var form = layui.form;
  89. //提交
  90. form.on('submit(formDemo)', function (data) {
  91. layer.msg(JSON.stringify(data.field));
  92. axios({
  93. method: "PUT",
  94. url: "http://127.0.0.1/user/updateUser/",
  95. data: JSON.stringify(data.field),
  96. headers: {
  97. 'Content-Type': 'application/json;charset=UTF-8'
  98. }
  99. }).then(resp => {
  100. var code = resp.data.code;
  101. if (code == "200") {
  102. alert("修改数据成功");
  103. window.location.href = "index.html";
  104. } else {
  105. alert("修改数据失败");
  106. }
  107. })
  108. return false;
  109. });
  110. });
  111. </script>
  112. </body>
  113. </html>