目录
二、Spring MVC基于Annotation开发-Spring MVC环境搭建
(一)在controller使用参数接收,请求有什么参数,方法就有什么参数
(二)在controller使用参数接收, @RequstParam改变controller方法接收请求参数和使用参数不一致
(三)在controller使用实体类作为参数接收,请求参数作为实体类的属性
1.SpringMVC处理json的框架是Jackson,要引入pom的依赖
SpringMVC是一个spring家族 MVC(Model View Controller 模型视图控制器)框架.
(一)创建maven工程
(二)添加依赖
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>5.3.8</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.3.8</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
-
- <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.0</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
(三)web.xml中配置前端控制器(核心控制器),其实就是一个Servlet
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
- <!--配置springmvc核心的DisPatcherServlet-->
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:springmvc.xml</param-value>
- </init-param>
- <!--tomcat 启动创建DisPatcherServlet-->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <!--正斜杠表示所有的请求-->
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <!--配置编码过滤器(springmvc提供的)-->
- <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>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*</url-pattern>
- </filter-mapping>
- </web-app>
(四)springmvc.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
- <!--扫描使用4大注解的类 @Controller @Service @Repository @Component ,纳入springmvc管理-->
- <context:component-scan base-package="com.tjetc"></context:component-scan>
-
- <!--配置让@RequestMapping生效-->
- <mvc:annotation-driven></mvc:annotation-driven>
-
- <!--图片资源等交给默认的Servlet处理, 也就是Tomcat处理-->
- <mvc:default-servlet-handler></mvc:default-servlet-handler>
-
-
- <!--配置视图解析器-->
- <!--视图解析器的作用是查找指定的视图-->
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!--配置视图-->
- <!--这里使用的是jstl视图-->
- <!--视图的作用是解析view的代码转换成html-->
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
- <!--配置前后缀的作用是简化返回页面的代码, 例如: @RequestMapping注解到方法中, return "hello", 实际上return "/hello.jsp"页面-->
- <!--配置前缀-->
- <property name="prefix" value="/"></property>
- <!--配置后缀-->
- <property name="suffix" value=".jsp"></property>
- </bean>
- </beans>
(五)HelloController
- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- //@RequestMapping 写在类上, controller里所有的方法映射加一个前缀
- @RequestMapping("user")
- public class HelloController {
- //@RequestMapping 作用: 访问的url映射到加上@RequestMapping 的方法上面
- //@RequestMapping 注解的值: url
- @RequestMapping("/hello")
- //Model 对象用途: 用来存储数据, 传输到页面中, 在页面中就可以获取数据
- public String hello(Model model) {
- //添加数据, 传输到页面
- model.addAttribute("msg", "hello spring!");
- //请求转发到页面, /index.jsp页面
- return "jsp/index";
- }
-
- @RequestMapping("order")
- public String order(Model model) {
- model.addAttribute("msg", "我是订单列表");
- //请求转发到/order.jsp页面
- return "jsp/order";
- }
- }
(六)index.jsp和order.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- <base href="<%=request.getContextPath()%>/">
- </head>
- <body>
- <%--使用el表达式获取model存储的值--%>
- <h1>${msg}</h1>
- </body>
- </html>
(七)运行效果


1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
login.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- <base href="<%=request.getContextPath()%>/">
- </head>
- <body>
- <form action="login" method="post">
- 用户名:<input type="text" name="username"><br>
- 密码:<input type="password" name="password"><br>
- <input type="submit" value="登录">
- </form>
- </body>
- </html>
welcome.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- <base href="<%=request.getContextPath()%>/">
- </head>
- <body>
- <h1>username=${username}</h1>
- <h1>password=${password}</h1>
- </body>
- </html>

- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- public class LoginController {
- @RequestMapping("login")
- public String login(String username, String password, Model model) {
- System.out.println("username=" + username);
- System.out.println("password=" + password);
- //登录判断 todo
- model.addAttribute("username", username);
- model.addAttribute("password", password);
- //请求转发到welcome.jsp页面
- return "jsp/welcome";
- }
- }

- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
-
- @Controller
- public class LoginController {
- @RequestMapping("login")
- public String login(@RequestParam(value = "username") String un,
- //required 表示是否需要提交的字段, false表示可以不提交字段,也可以提交, true表示必须要提交的字段, 不提交就会报400错误
- //defaultValue 表示默认值, 不提交字段, 使用默认值, 提交字段, 使用默认值, 在required = false情况下有意义
- @RequestParam(value = "password", required = false, defaultValue = "123456") String pd,
- Model model) {
- System.out.println("username=" + un);
- System.out.println("password=" + pd);
- //登录判断 todo
- model.addAttribute("username", un);
- model.addAttribute("password", pd);
- //请求转发到welcome.jsp页面
- return "jsp/welcome";
- }
- }

- package com.tjetc.model.param;
-
- public class User {
- private String username;
- private String password;
-
- public User() {
- }
-
- public User(String username, String password) {
- this.username = username;
- this.password = password;
- }
-
- 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{" +
- "username='" + username + '\'' +
- ", password='" + password + '\'' +
- '}';
- }
- }
- package com.tjetc.controller;
-
- import com.tjetc.model.param.User;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- public class LoginController {
- @RequestMapping("login")
- /**
- * 通过参数的实体类接收传过来的参数
- */
- public String login(User user, Model model) {
- System.out.println("username=" + user.getUsername());
- System.out.println("password=" + user.getPassword());
- //登录判断 todo
- model.addAttribute("username", user.getUsername());
- model.addAttribute("password", user.getPassword());
- //请求转发到welcome.jsp页面
- return "jsp/welcome";
- }
- }

url路径传参
success.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- <base href="<%=request.getContextPath()%>/">
- </head>
- <body>
- <h1>订单删除成功,path=${path},id=${id}</h1>
- </body>
- </html>
- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- @RequestMapping("order")
- public class OrderController {
- @RequestMapping("del/{path}/{id}")
- public String del(@PathVariable("path") String path,
- @PathVariable("id") int id,
- Model model) {
- System.out.println("path=" + path + "\n");
- System.out.println("id=" + id);
- model.addAttribute("path", path);
- model.addAttribute("id", id);
- return "jsp/success";
- }
- }

默认就是请求转发
success.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- <base href="<%=request.getContextPath()%>/">
- </head>
- <body>
- <h1>订单删除成功,path=${path},id=${id}</h1>
- </body>
- </html>
OrderController.java
- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- @RequestMapping("order")
- public class OrderController {
- @RequestMapping("del/{path}/{id}")
- public String del(@PathVariable("path") String path,
- @PathVariable("id") int id,
- Model model) {
- System.out.println("path=" + path + "\n");
- System.out.println("id=" + id);
- model.addAttribute("path", path);
- model.addAttribute("id", id);
- return "jsp/success";
- }
- }

- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- @RequestMapping("order")
- public class OrderController {
- @RequestMapping("aa")
- public String aa() {
- //重定向到订单删除
- //redirect:"重定向路径"
- return "redirect:/order/del/abc/36";
- }
- }

Spring MVC(Model View Controller)是 Spring 中一个重要的组成部分,而 Spring 视图和视图解析器则是 Spring MVC 中的组成部分。在介绍 Spring 视图和视图解析器前,我们先了解下在 Spring MVC 框架中,一个 Web 请求所需经历的六个阶段:
1.请求会首先被 Spring MVC 的前端请求分发器(Dispatcher)拦截。该拦截器是一个 Servlet, 需要在 web.xml 中配置,所有符合所配置的 URL 样式的访问请求,将都会被该拦截器拦截。Spring 提供了默认的分发器 org.springframework.web.servlet.DispatcherServlet,可以根据需要,决定是否需要定制自己的分发器。
2.在接收到访问请求后,分发器会根据开发人员在 Spring 配置文件或代码中的注解(Annotation),来查找合适的控制器。
3.分发器在查找到合适的控制器后,将请求转交给该控制器处理。
4.通常,控制器会调用相应服务类来处理业务逻辑,在将请求处理后,控制器需返回处理后的结果数据模型(Model)以及下一个需要显示的视图名。
5.在控制器处理结束并返回模型和视图名之后,Spring 会依次调用 Spring 容器中所注册的视图解析器,来查找符合条件的视图。
6.在获得 Spring 视图后,Spring 会根据该视图的配置信息,显示该视图。
①图 1.Spring MVC 处理流程

通过以上 Spring MVC 的介绍,我们可以发现,视图和视图解析器将出现在整个请求处理流程中的最后部分。那么到底什么是视图和视图解析器?简而言之,视图是指 Spring MVC 中的 V(View),而视图解析器的功能则是依据指定的规则来查找相应的视图。
在开发中,视图通常就是 JSP、Velocity、FreeMarker等。Spring 默认提供了多种视图解析器,比如,我们可以使用最常用解析器 InternalResourceViewResolver 来查找 JSP 视图(与之相对应的视图类为 InternalResourceView)。通常,一个视图解析器只能查找一个或多个特定类型的视图,在遇到 Spring 不支持的视图或者我们要自定义视图查找规则的情况下,我们就可以通过扩展 Spring 来自定义自己所需的视图解析器。目前,视图解析器都需要实现接口 org.springframework.web.servlet.ViewResolver, 它包含方法 resolveViewName,该方法会通过视图名查找并返回 Spring 视图对象。表 1 列出了常用的 Spring 视图解析器。
①表 1.Spring 常用视图解析器列表

在多数项目中,InternalResourceViewResolver 是最常用的,该解析器可以返回指定目录下指定后缀的文件,它支持 JSP 及 JSTL 等视图技术。
在 Web 开发中,我们的前端显示可以是 JSP、Excel、Velocity 、FreeMarker等,在 Spring 中,不同的前端显示技术都有其对应的 Java 视图类,正如表 1 所提到的,InternalResourceView 可以代表 JSP 视图,FreeMarkerView 代表 FreeMarker 视图。目前,Spring 支持多种技术开发的视图,包括 JSP、JSTL、Excel,Velocity、FreeMarker 等
springmvc.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: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
- https://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/mvc
- https://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
- <!--配置视图解析器-->
- <!--视图解析器的作用是查找指定的视图-->
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!--配置视图-->
- <!--这里使用的是jstl视图-->
- <!--视图的作用是解析view的代码转换成html-->
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
- <!--配置前后缀的作用是简化返回页面的代码, 例如: @RequestMapping注解到方法中, return "hello", 实际上return "/hello.jsp"页面-->
- <!--配置前缀-->
- <property name="prefix" value="/"></property>
- <!--配置后缀-->
- <property name="suffix" value=".jsp"></property>
- </bean>
- </beans>
HelloController.java
- package com.tjetc.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- //@RequestMapping 写在类上, controller里所有的方法映射加一个前缀
- @RequestMapping("user")
- public class HelloController {
- //@RequestMapping 作用: 访问的url映射到加上@RequestMapping 的方法上面
- //@RequestMapping 注解的值: url
- @RequestMapping("/hello")
- //Model 对象用途: 用来存储数据, 传输到页面中, 在页面中就可以获取数据
- public String hello(Model model) {
- //添加数据, 传输到页面
- model.addAttribute("msg", "hello spring!");
- //请求转发到页面, /index.jsp页面
- return "jsp/index";
- }
-
- @RequestMapping("order")
- public String order(Model model) {
- model.addAttribute("msg", "我是订单列表");
- //请求转发到/order.jsp页面
- return "jsp/order";
- }
- }
index.jsp和order.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- <base href="<%=request.getContextPath()%>/">
- </head>
- <body>
- <%--使用el表达式获取model存储的值--%>
- <h1>${msg}</h1>
- </body>
- </html>
运行效果

从Controller得到json:当controller的方法返回一个对象(实体类对象,也可是集合对象),同时标注了@ResponseBody,jackson在后台默默将对象转化为json字符串
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.12.4</version>
- </dependency>
- <?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: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
- https://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/mvc
- https://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
- <!--扫描使用4大注解的类 @Controller @Service @Repository @Component ,纳入springmvc管理-->
- <context:component-scan base-package="com.tjetc"></context:component-scan>
-
- <!--配置让@RequestMapping生效, 也是Json的支持-->
- <mvc:annotation-driven></mvc:annotation-driven>
-
- <!--图片资源等交给默认的Servlet处理, 也就是Tomcat处理-->
- <mvc:default-servlet-handler></mvc:default-servlet-handler>
- </beans>
- package com.tjetc.controller;
-
- import com.tjetc.model.param.User;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- @Controller
- @RequestMapping("json")
- public class JsonController {
- @RequestMapping("get-user")
- @ResponseBody//把对象转换成json输出给前端
- public User getUser() {
- User user = new User("jack", "111");
- return user;
- }
-
- @RequestMapping("get-user-list")
- @ResponseBody
- public List<User> getUsers() {
- List<User> users = Arrays.asList(new User("tom", "1111"),
- new User("jack", "2222"),
- new User("jim", "3333"));
- return users;
- }
- }

(一)课堂练习
在controller写一个方法,该方法返回值是map集合
- package com.tjetc.controller;
-
- import com.tjetc.model.param.User;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- import java.util.Map;
-
- @Controller
- @RequestMapping("json")
- public class JsonController {
- @RequestMapping("get-user-map")
- @ResponseBody
- public Map<String, Object> getMap() {
- Map<String, Object> map = new HashMap<>();
- map.put("state", 0);
- map.put("msg", "成功");
- map.put("data", null);
- return map;
- }
- }

Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理。通常应用在权限验证、记录请求信息的日志、判断用户是否登录功能上。
实现HandlerInterceptor接口,实现接口提供三个方法:
preHandle:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作。返回true表示继续向下执行,返回false表示中断后续操作。
postHandle:该方法在控制器的处理请求方法调用之后,解析视图之前执行。可以通过此方法对请求域中的模型和视图做进一步的修改。
afterCompletion:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
- package com.tjetc.interceptor;
-
- import org.springframework.web.servlet.HandlerInterceptor;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
-
- /**
- * 自定义的登录拦截器
- */
- public class LoginInterceptor implements HandlerInterceptor {
- /**
- * 执行时机是在Controller类里对应的方法之前(例如: add、update、delete等方法)
- *
- * @param request
- * @param response
- * @param handler
- * @return
- * @throws Exception
- */
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- //判断session是否存储用户信息, 如果存储了表示登录过了, 放行, 如果没有存储过表示尾灯率或登录过期,返回false, 重定向到login.jsp页面
- HttpSession session = request.getSession();
- Object username = session.getAttribute("username");
- if (username != null) {
- //存在用户信息, 已登录, 放行, 返回true
- return true;
- } else {
- //未登录或登录过期, return false, 重定向到login.jsp页面, 并返回false
- response.sendRedirect(request.getContextPath() + "/jsp/login.jsp");
- return false;
- }
- }
- }
- <!--配置拦截器-->
- <mvc:interceptors>
- <mvc:interceptor>
- <!--拦截的url-->
- <mvc:mapping path="/user/**"/>
- <!--拦截到url执行哪个拦截器类-->
- <bean class="com.tjetc.interceptor.LoginInterceptor"></bean>
- </mvc:interceptor>
- </mvc:interceptors>
打开新的页面因为有session, 不用重新登录, 换个浏览器没了session存储username需要重新登录
只对/user/……有拦截作用

对其他不用user开头的路径不会有拦截作用

SSM:Spring+Spring MVC+Mybatis 三大框架整合
mapper,pojo,配置文件 ,映射文件
1.父容器是Spring容器
2.子容器SpringMVC容器
3.子容器的bean可以访问父容器的bean

- <?xml version="1.0" encoding="UTF-8"?>
- <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/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>com.tjetc</groupId>
- <artifactId>20220625ssm</artifactId>
- <version>1.0-SNAPSHOT</version>
-
- <dependencies>
- <!--spring-context-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>5.3.8</version>
- </dependency>
- <!--spring-mvc-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.3.8</version>
- </dependency>
- <!--spring事务-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>5.3.8</version>
- </dependency>
- <!--spring-jdbc-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>5.3.8</version>
- </dependency>
- <!--mybatis-->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.5.7</version>
- </dependency>
- <!--mybatis-spring整合-->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>2.0.6</version>
- </dependency>
- <!--mysql驱动-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.21</version>
- </dependency>
- <!--数据源-->
- <dependency>
- <groupId>com.zaxxer</groupId>
- <artifactId>HikariCP</artifactId>
- <version>4.0.3</version>
- </dependency>
- <!--单元测试-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>5.3.8</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter</artifactId>
- <version>5.7.2</version>
- <scope>test</scope>
- </dependency>
- <!-- aspectj 依赖-->
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <version>1.9.7</version>
- </dependency>
- <!--mybatis的分页插件-->
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper</artifactId>
- <version>5.1.9</version>
- </dependency>
- <!--处理json-->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.12.4</version>
- </dependency>
- <!--字符串处理-->
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.11</version>
- </dependency>
- <!--上传文件-->
- <dependency>
- <groupId>commons-fileupload</groupId>
- <artifactId>commons-fileupload</artifactId>
- <version>1.4</version>
- </dependency>
- <!--JSTL-->
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
- </dependencies>
-
- </project>
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
- http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
-
- <!--配置加载spring容器配置文件同时配置spring的监听器-->
- <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>
-
- <!--配置springmvc核心的DisPatcherServlet-->
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:springmvc.xml</param-value>
- </init-param>
- <!--tomcat 启动创建DisPatcherServlet-->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <!--正斜杠表示所有的请求-->
- <url-pattern>/</url-pattern>
- </servlet-mapping>
-
-
- <!--配置编码过滤器(springmvc提供的)-->
- <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>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*</url-pattern>
- </filter-mapping>
- </web-app>
- <?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:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- https://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/aop
- https://www.springframework.org/schema/aop/spring-aop.xsd">
-
- <!--spring 容器负责管理业务层和持久层的类-->
- <!--1、配置扫描三大注解类-->
- <!--扫描带有@Service @Repository @Component 注解类, 纳入spring容器的管理, 所以要排除@Controller注解的类-->
- <context:component-scan base-package="com.tjetc">
- <!--排除@Controller注解的类-->
- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
-
- <!--2、配置加载的properties文件和数据源-->
- <!--加载多个properties配置文件-->
- <context:property-placeholder location="classpath*:*.properties"></context:property-placeholder>
-
- <!--配置HikariCP数据源-->
- <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
- <property name="driverClassName" value="${jdbc.driverName}"></property>
- <property name="jdbcUrl" value="${jdbc.url}"></property>
- <property name="username" value="${jdbc.username}"></property>
- <property name="password" value="${jdbc.password}"></property>
- </bean>
-
- <!--3、配置事务-->
- <!--事务管理器-->
- <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
-
- <!--配置事务通知-->
- <tx:advice id="txAdvice" transaction-manager="txManager">
- <tx:attributes>
- <!--添加使用事务-->
- <tx:method name="add*" propagation="REQUIRED"/>
- <!--更新使用事务-->
- <tx:method name="update*" propagation="REQUIRED"/>
- <!--删除使用事务-->
- <tx:method name="del*" propagation="REQUIRED"/>
- <!--其他方法是使用只读事务, 可以提高效率-->
- <tx:method name="*" read-only="true"/>
- </tx:attributes>
- </tx:advice>
-
- <!--配置aop-->
- <aop:config>
- <!--配置切入点, 对service包和子孙包下所有的业务类(service)使用事务-->
- <aop:pointcut id="txPointCut" expression="execution(* com.tjetc.service..*.*(..))"/>
- <!--配置通知-->
- <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor>
- </aop:config>
-
- <!--4、配置mybatis-->
- <!--配置sqlSessionFactory-->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!--配置mybatis.xml的配置文件-->
- <property name="configLocation" value="classpath:mybatis.xml"></property>
- <!--配置mybatis.xml的数据源-->
- <property name="dataSource" ref="dataSource"></property>
- <!--配置mapper映射文件的文件-->
- <property name="mapperLocations" value="classpath:com/tjetc/dao/*.xml"></property>
- </bean>
-
- <!--配置mybatis扫描映射接口-->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
- <!--mybatis对spring支持,扫描mapper下的Mapper接口,生成代理bean交给spring管理-->
- <property name="basePackage" value="com.tjetc.dao"></property>
- </bean>
- </beans>
- jdbc.driverName=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
- jdbc.username=root
- jdbc.password=123456
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name="com.tjetc.entity"/>
- </typeAliases>
- <plugins>
- <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
- </plugins>
- </configuration>
- <?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: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
- https://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/mvc
- https://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
- <!--springmvc子容器只管理控制层-->
- <!--扫描使用注解的类 @Controller ,纳入springmvc管理-->
- <context:component-scan base-package="com.tjetc.controller
- "></context:component-scan>
-
- <!--配置让@RequestMapping生效, 也是Json的支持-->
- <mvc:annotation-driven></mvc:annotation-driven>
-
- <!--图片资源等交给默认的Servlet处理, 也就是Tomcat处理-->
- <mvc:default-servlet-handler></mvc:default-servlet-handler>
-
- <!--配置视图解析器-->
- <!--视图解析器的作用是查找指定的视图-->
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!--配置视图-->
- <!--这里使用的是jstl视图-->
- <!--视图的作用是解析view的代码转换成html-->
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
- <!--配置前后缀的作用是简化返回页面的代码, 例如: @RequestMapping注解到方法中, return "hello", 实际上return "/hello.jsp"页面-->
- <!--配置前缀-->
- <property name="prefix" value="/"></property>
- <!--配置后缀-->
- <property name="suffix" value=".jsp"></property>
- </bean>
-
- <!-- <!–配置拦截器–>-->
- <!-- <mvc:interceptors>-->
- <!-- <mvc:interceptor>-->
- <!-- <!–拦截的url–>-->
- <!-- <mvc:mapping path="/user/**"/>-->
- <!-- <!–拦截到url执行哪个拦截器类–>-->
- <!-- <bean class="com.tjetc.interceptor.LoginInterceptor"></bean>-->
- <!-- </mvc:interceptor>-->
- <!-- </mvc:interceptors>-->
- </beans>
- package com.tjetc.entity;
-
- public class User {
- private Long id;
- private String username;
- private String password;
-
- public User() {
- }
-
- public User(String username, String password) {
- this.username = username;
- this.password = password;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long 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 + '\'' +
- '}';
- }
- }
- <?xml version="1.0" encoding="utf-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.tjetc.mapper.UserMapper">
- <insert id="add" parameterType="User">
- insert into USER (username,password) values (#{username},#{password});
- </insert>
- <select id="list" resultType="User">
- select * from USER
- </select>
- </mapper>
- package com.tjetc.mapper;
-
- import com.tjetc.entity.User;
-
- import java.util.List;
-
- public interface UserMapper {
- void add(User user);
-
- List<User> findAll();
- }
- package com.tjetc.service;
-
- import com.tjetc.entity.User;
-
- import java.util.List;
-
- public interface UserService {
- void add(User user);
-
- List<User> list();
- }
- package com.tjetc.service.impl;
-
- import com.tjetc.entity.User;
- import com.tjetc.mapper.UserMapper;
- import com.tjetc.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- @Service
- public class UserServiceImpl implements UserService {
- @Autowired
- private UserMapper userMapper;
- @Override
- public void add(User user) {
- userMapper.add(user);
- }
-
- @Override
- public List<User> list() {
- return userMapper.list();
- }
- }
- package com.tjetc.controller;
-
- import com.tjetc.entity.User;
- import com.tjetc.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- import java.util.List;
-
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- private UserService userService;
- @RequestMapping("/add")
- public String add(User user){
- userService.add(user);
- return "redirect:/user/list";
- }
- @RequestMapping("/list")
- public String list(Model model){
- List<User> list=userService.list();
- model.addAttribute("list", list);
- return "list";
- }
- }
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>add</title>
- </head>
- <body>
- <form action="/user/add" method="post">
- 用户名:<input type="text" name="username"/><br/>
- 密码:<input type="password" name="password"/><br/>
- <input type="submit" value="提交"/><br/>
- </form>
- </body>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <html>
- <head>
- <title>list</title>
- </head>
- <body>
-
- <table>
- <tr>
- <th>序号</th>
- <th>用户名</th>
- <th>密码</th>
- </tr>
- <c:forEach items="${list}" var="s">
- <tr>
- <td>${s.id}</td>
- <td>${s.username}</td>
- <td>${s.password}</td>
- </tr>
- </c:forEach>
- </table>
- </body>
- <?xml version="1.0" encoding="utf-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.tjetc.mapper.UserMapper">
- <insert id="add" parameterType="User">
- insert into USER (username,password) values (#{username},#{password})
- </insert>
- <select id="list" parameterType="string" resultType="User">
- select * from USER where username like '%${username}%'
- </select>
- <select id="findById" parameterType="int" resultType="User">
- select * from USER where id=#{id}
- </select>
- <update id="update" parameterType="user">
- update user set username =#{username},password=#{password} where id=#{id}
- </update>
- <delete id="del" parameterType="int">
- delete from user where id=#{id}
- </delete>
- </mapper>
- package com.tjetc.mapper;
-
- import com.tjetc.domain.User;
-
- import java.util.List;
-
- public interface UserMapper {
- void add(User user);
-
- List<User> list(String username);
-
- User findById(int id);
-
- void update(User user);
-
- void del(int id);
- }
- package com.tjetc.service;
-
- import com.github.pagehelper.PageInfo;
- import com.tjetc.entity.User;
-
- public interface UserService {
- void add(User user);
-
- PageInfo<User> list(String username, Integer curPage, int pageSize);
-
- User findById(int id);
-
- void update(User user);
-
- void del(int id);
- }
- package com.tjetc.service.impl;
-
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import com.tjetc.entity.User;
- import com.tjetc.mapper.UserMapper;
- import com.tjetc.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- @Service
- public class UserServiceImpl implements UserService {
- @Autowired
- private UserMapper userMapper;
- @Override
- public void add(User user) {
- userMapper.add(user);
- }
-
- @Override
- public PageInfo<User> list(String username, Integer curPage, int pageSize) {
- PageHelper.startPage(curPage, pageSize);
- List<User> list = userMapper.list(username);
- PageInfo<User> pageInfo = new PageInfo<>(list);
- return pageInfo;
- }
-
- @Override
- public User findById(int id) {
- return userMapper.findById(id);
- }
-
- @Override
- public void update(User user) {
- userMapper.update(user);
- }
-
- @Override
- public void del(int id) {
- userMapper.del(id);
- }
- }
- package com.tjetc.controller;
-
- import com.github.pagehelper.PageInfo;
- import com.tjetc.entity.User;
- import com.tjetc.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- import java.util.List;
-
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- private UserService userService;
- @RequestMapping("/add")
- public String add(User user){
- userService.add(user);
- return "redirect:/user/list";
- }
- @RequestMapping("/list")
- public String list(Integer curPage,String username,Model model){
- curPage=curPage==null?1:curPage;
- username=username==null?"":username;
- int pageSize=2;
- PageInfo<User> pageInfo = userService.list(username, curPage, pageSize);
- model.addAttribute("page", pageInfo);
- model.addAttribute("username", username);
- return "list";
- }
- @RequestMapping("/{id}")
- public String findById(@PathVariable("id") int id,Model model){
- User user=userService.findById(id);
- model.addAttribute("user", user);
- return "update";
- }
- @RequestMapping("/update")
- public String update(User user){
- userService.update(user);
- return "redirect:/user/list";
- }
- @RequestMapping("/delete/{id}")
- public String del(@PathVariable("id") int id){
- userService.del(id);
- return "redirect:/user/list";
- }
- }
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>add</title>
- </head>
- <body>
- <form action="/user/add" method="post">
- 用户名:<input type="text" name="username"/><br/>
- 密码:<input type="password" name="password"/><br/>
- <input type="submit" value="提交"/><br/>
- </form>
- </body>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <html>
- <head>
- <title>list</title>
- <base href="${pageContext.request.contextPath}/">
- <script type="text/javascript">
- function paging(curPage) {
- location.href="user/list?curPage="+curPage+"&username="+document.getElementById("username").value;
- }
- function update(id) {
- location.href="user/"+id;
- }
- function del(id) {
- location.href="user/delete/"+id;
- }
- </script>
- </head>
- <body>
- <div>
- 用户名:<input type="text" id="username" value="${username}"/><button type="button" onclick="paging(1)">搜索</button>
- </div>
- <table>
- <tr>
- <th>序号</th>
- <th>用户名</th>
- <th>密码</th>
- <th>操作</th>
- </tr>
- <c:forEach items="${page.list}" var="s">
- <tr>
- <td>${s.id}</td>
- <td>${s.username}</td>
- <td>${s.password}</td>
- <td>
- <button onclick="update(${s.id})">修改</button>
- <button onclick="del(${s.id})">删除</button>
- </td>
- </tr>
- </c:forEach>
- <tr>
- <td colspan="10">
- ${page.pageNum}/${page.pages}
- <button onclick="paging(1)">首页</button>
- <button onclick="paging(${page.prePage})">上一页</button>
- <button onclick="paging(${page.nextPage})">下一页</button>
- <button onclick="paging(${page.pages})">尾页</button>
- </td>
- </tr>
- </table>
- </body>
- </html>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>add</title>
- </head>
- <body>
- <form action="/user/update" method="post">
- <input type="hidden" name="id" value="${user.id}">
- 用户名:<input type="text" name="username" value="${user.username}"/><br/>
- 密码:<input type="password" name="password" value="${user.password}"/><br/>
- <input type="submit" value="提交"/><br/>
- </form>
- </body>
- </html>