SpringMVC笔记

一、基本配置流程

1. pom.xml 的配置

导入maven依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

可能用到的maven:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

解决无法打包问题:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

2. web.xml 的配置

<?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">

    <!--注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--匹配所有的请求-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
特别注意: /  和  /*  的区别:

1. <url-pattern> / </url-pattern> 不会匹配到.jsp,只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类

2. <url-pattern> /* </url-pattern> 会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错

这里需要使用<url-pattern>  /  </url-pattern>

3. springmvc-servlet.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--添加处理映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    <!--添加处理适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    <!--添加视图解析器-->
    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!--后缀-->
        <property name="suffix" value=".jsp" />
    </bean>
    
</beans>

4. 创建Controller 类

实现Controller接口,重写handleRequest () 方法

package com.lindom.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模式和视图
        ModelAndView mv = new ModelAndView();
        //封装对象,放在ModelAndView中
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello");  //  /WEB-INF/jsp/hello.jsp
        return mv;
    }
}

5. 在 springmvc.servlet.xml 里注册Controller类的bean

<bean id="/hello" class="com.lindom.controller.HelloController" />

6. 创建对应的 jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

二、使用注解开发

1. pom.xml 的配置 (不变)

2. web.xml 的配置 (不变)

<?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">

    <!--注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--匹配所有的请求-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3. springmvc-servlet.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">

    <!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
    <context:component-scan base-package="com.lindom.controller" />
    <!--让SpringMVC不处理静态资源-->
    <mvc:default-servlet-handler />
    <!--支持mvc注解驱动
    在spring中一般采用@RequestMapping注解来完成映射关系,想要使@RequestMapping注解生效
    必须向上下文中注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter实例
    这两个实例分别在类级别和方法级别处理
    而annotation-driven配置帮助我们自动完成上述两个实例的注入
    -->
    <mvc:annotation-driven />

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!--后缀-->
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

4. 创建Controller 类

@Controller :必须在类名上加,代表这是一个Controller类
@RequestMapping: 如果类名和方法名上都加了,如下例,代表需要访问http://localhost:8080/HelloController/h1
				如果只在方法名上加,则直接访问http://localhost:8080/h1
package com.lindom.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/HelloController")
public class HelloController {

    @RequestMapping("/h1")
    public String sayHello(Model model){
        //向模型中添加属性msg与值,可以在JSP页面中取出并渲染
        model.addAttribute("msg","hello,SpringMVC!我是锋神");
        //web-inf/jsp/hello.jsp  代表跳转的路径
        return "hello";
    }
}

5. 创建对应的 jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

三、复杂配置详解

1. RestFul 风格

@Controller
public class ControllerDemo01 {
    //默认情况
    @RequestMapping("/t1")
    public String test01(Model model){
        model.addAttribute("msg","test1哈哈哈哈哈!");
        return "lin";
    }
	//注意 @PathVariable 注解
    @RequestMapping("/t2/{a}/{b}")
    public String test02(Model model, @PathVariable int a, @PathVariable int b){
        int res = a + b;
        model.addAttribute("msg","test2哈哈哈哈哈!"+res);
        return "lin";
    }
    //我们使用浏览器地址栏进行访问默认是Get请求,会报错405:
    @RequestMapping(value = "/t3",method = RequestMethod.POST)
    public String test03(Model model){
        model.addAttribute("msg","test3哈哈哈哈哈!");
        return "lin";
    }
	//这里使用 @GetMapping 注解
    @GetMapping("/t4")
    public String test04(Model model){
        model.addAttribute("msg","test4哈哈哈哈哈!");
        return "lin";
    }
    //重定向不走WEB-INF,而且不走视图解析器
    @RequestMapping("/t5")
    public String test05(Model model){
        model.addAttribute("msg","test5哈哈哈哈哈!");
        return "redirect:/feng.jsp";
    }
    //转发能走WEB-INF,而且走视图解析器(默认是转发)
    @RequestMapping("/t6")
    public String test06(Model model){
        model.addAttribute("msg","test6哈哈哈哈哈!");
        return "lin";
    }
}
WEB-INF下面的内容都是只能由服务器级别才能访问,客户端并不能访问。
什么是客户端级别?什么是服务器级别呢?

1. 转发就是服务器级别,浏览器的地址不会变,因为,客户端发送一个请求,服务器受理之后,发现要请求内容还要再去别的请求,
那么转发就是服务器自己去处理完成。不麻烦客户端(浏览器)了,所以客户端上面的地址栏不会改变。
2. 重定向:就是客户端级别的。服务器收到请求后,发现还要去请求别的内容,但是服务器自己不想处理,
那么就告诉客户端,你自己去处理吧,那么客户端就去请求那个别的内容了。所以客户端(浏览器)地址栏就会改变了。

2. 处理提交数据

@RequestParam :当前端传来的参数名与我们方法参数名不一致时,便可使用@RequestParam给方法参数名取与前端传来的参数名一致的名字

这里建议都使用上@RequestParam注解,方便开发时更好的辨认出这些前端传来的参数
@RequestMapping("/con1")
public String test01(@RequestParam("username")String name, @RequestParam("age")int age, Model model){
    System.out.println(name);
    model.addAttribute("msg",name);
    model.addAttribute("msg2",age);
    return "test";
}

3. 数据显示到前端

三种方法:
1. Model
2. ModelMap
3. ModelAndView

三者的区别:
1. Model 只有寥寥几个方法只适合用于储存数据,简化了对Model对象的操作和理解
2. ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,还继承 LinkedMap 的方法和特性
3. ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转

4. 乱码问题

SpringMVC提供了一个过滤器,直接在web.xml 里配置

特别注意:这里必须使用 <url-pattern> /* </url-pattern> 才能对jsp文件也进行过滤

在web.xml 配置:

<!--解决乱码问题-->
<filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

5. Json

前端转换json

使用JSON.stringify(user) 和 JSON.parse(json) 进行转换

<script type="text/javascript">

    //编写一个js的对象
    var user = {
        name : "林梓锋",
        age : 18,
        sex : "男"
    };

    //将js对象转换成json字符串
    var json = JSON.stringify(user);
    console.log(json);    
	//{"name":"林梓锋","age":18,"sex":"男"}

    //将json字符串转换为js对象
    var user2 = JSON.parse(json);
    console.log(user2);  
    /*Object
        age: 18
        name: "林梓锋"
        sex: "男"
    */

<script>

Controller返回JSON数据

  1. 导入jackson jar包
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.9.8</version> 
</dependency>

2.解决乱码问题,这时之前的配置乱码的操作不起作用。有两种方式解决!

​ 第一种:在注解里配置,十分繁琐

//produces:指定响应体返回类型和编码 
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")

​ 第二种:在springmvc-servlet.xml 里进行配置,推荐使用

<mvc:annotation-driven> 
    <mvc:message-converters register-defaults="true"> 
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 
            <constructor-arg value="UTF-8"/> 
        </bean> 
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageCon verter"> 
            <property name="objectMapper"> 
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> 
                   <property name="failOnEmptyBeans" value="false"/> 
                </bean> 
            </property> 
        </bean> 
    </mvc:message-converters>
</mvc:annotation-driven>
  1. 使用Controller 返回json对象
@ResponseBody  :加此注解不会走视图解析器,会直接返回一个字符串
ObjectMapper对象 :与 JSON 有关的类
writeValueAsString(user) 方法: 将对象转为Json 
@Controller
public class UserController {
   @RequestMapping("/j1")
   @ResponseBody //加此注解不会走视图解析器,会直接返回一个字符串
   public String test01() throws JsonProcessingException {

       ObjectMapper mapper = new ObjectMapper();
       User user = new User("锋神说", 88, "男");
       String s = mapper.writeValueAsString(user);
       return s;
   }
}
@RestController : 使用此注解相当于将所有方法都加上@ResponseBody 注解, 十分便捷
@RestController
public class DateController {

 @RequestMapping("/j2")
 public String test02(){

     ObjectMapper mapper = new ObjectMapper();
     Date date = new Date();
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     String s = sdf.format(date);
     return s;
 }
}

6. ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。
jQuery.ajax(...) 部分参数:
url:请求地址 
type:请求方式,GET、POST(1.9.0之后用method)
headers:请求头 
data:要发送的数据 
contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www- form-urlencoded; charset=UTF-8") 
async:是否异步 
timeout:设置请求超时时间(毫秒) 
beforeSend:发送请求前执行的函数(全局) 
complete:完成之后执行的回调函数(全局) 
success:成功之后执行的回调函数(全局)
error:失败之后执行的回调函数(全局) 
accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型 
dataType:将服务器端返回的数据转换成指定类型 
"xml": 将服务器端返回的内容转换成xml格式 
"text": 将服务器端返回的内容转换成普通文本格式
"html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含 JavaScript标签,则会尝试去执行。 "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成 普通文本格式
"json": 将服务器端返回的内容转换成相应的JavaScript对象 
"jsonp": JSONP 格式使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数

​ 1.下载jQuery.ajax 包并导入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnMKqHcO-1600068860614)(C:\Users\Lin\AppData\Roaming\Typora\typora-user-images\image-20200810120426385.png)]

User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;
}

AjaxController.java

package com.lindom.controller;
import com.lindom.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RestController
public class AjaxController {

    @RequestMapping("/a1")
    public void ajax1(String name, HttpServletResponse response) throws IOException {
        if ("admin".equals(name)){
            response.getWriter().print("true");
        }else {
            response.getWriter().print("false");
        }
    }

    @RequestMapping("/a2")
    public List<User> ajax2(){
        List<User> list = new ArrayList<User>();
        list.add(new User("锋哥1号",1,"男"));
        list.add(new User("锋哥2号",2,"男"));
        list.add(new User("锋哥3号",3,"男"));
        return list;
    }

    @RequestMapping("/a3")
    //这里的名字name需要与data:{'name':$("#pwd").val()},这里的相同
    public String ajax3(String name , String pwd){
        String msg = "";
        if (name != null){
            if ("admin".equals(name)){
                msg = "OK";
            }else {
                msg = "用户名输入错误";
            }
        }
        if (pwd != null){
            if ("12345".equals(pwd)){
                msg = "OK";
            }else {
                msg = "密码输入错误";
            }
        }
        //由于@RestController注解,将msg转成json格式返回
        return msg;
    }
}

j1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <script src="jQuery/jquery-1.12.3.js"></script>
    <script>
      function al() {
          $.post({
              url:"${pageContext.request.contextPath}/a1",
              data:{'name':$("#txtName").val()},
              success:function (data) {
                  alert(data);
              }
          });
      }
    </script>
  </head>
  <body>
    <%--onblur:失去焦点触发事件--%>
    用户名:<input type="text" id="txtName" οnblur="al()" />
  </body>
</html>

j2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>

    <script src="jQuery/jquery-1.12.3.js"></script>
    <script>
        $(function () {
            $("#btn").click(function () {
                $.post("${pageContext.request.contextPath}/a2",function (data) {
                    console.log(data);
                    var HTML1 = "";
                    for (var i = 0; i < data.length; i++) {
                        HTML1 += "<tr>" +
                                 "<td>" + data[i].name + "</td>" +
                                 "<td>" + data[i].age + "</td>" +
                                 "<td>" + data[i].sex + "</td>" +
                                 "</tr>"
                    }
                    $("#content").html(HTML1);
                });
            });
        });
    </script>

</head>

<body>
<input type="button" id="btn" value="获取数据" />
<table width="80%" align="center">
    <tr>
        <td>姓名</td>
        <td>年龄</td>
        <td>性别</td>
    </tr>
    <tbody id="content">
    </tbody>

</table>
</body>
</html>

j3.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>j3</title>
    <script src="jQuery/jquery-1.12.3.js"></script>
    <script>
        function a1() {
            $.post({
                url:"${pageContext.request.contextPath}/a3",
                data:{'name':$("#name").val()},
                success:function (data) {
                    if (data.toString() === 'OK') {
                        $("#userInfo").css("color","green");
                    }else {
                        $("#userInfo").css("color","red");
                    }
                    $("#userInfo").html(data);
                }
            });
        }
        function a2() {
            $.post({
                url:"${pageContext.request.contextPath}/a3",
                data:{'pwd':$("#pwd").val()},
                success:function (data) {
                    if (data.toString() === 'OK') {
                        $("#pwdInfo").css("color","green");
                    }else {
                        $("#pwdInfo").css("color","red");
                    }
                    $("#pwdInfo").html(data);
                }
            });
        }
    </script>
</head>
<body>
<p>
    用户名:<input type="text" id="name" οnblur="a1()" />
    <span id="userInfo"></span>
</p>
<p>
    密码: <input type="password" id="pwd" οnblur="a2()" />
    <span id="pwdInfo"></span>
</p>

</body>
</html>

四、整合SSM

1. 基本环境搭建

  • 数据库环境:
CREATE DATABASE `ssmbuild`; 
USE `ssmbuild`; 
DROP TABLE IF EXISTS `books`;

CREATE TABLE `books` ( 
    `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id', 
    `bookName` VARCHAR(100) NOT NULL COMMENT '书名', 
    `bookCounts` INT(11) NOT NULL COMMENT '数量', 
    `detail` VARCHAR(200) NOT NULL COMMENT '描述', 
    KEY `bookID` (`bookID`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8 

INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES (1,'Java',1,'从入门到放弃'), 
(2,'MySQL',10,'从删库到跑路'), 
(3,'Linux',5,'从进门到进牢');
  • pom.xml
<!--数据库驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<!--Mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.5</version>
</dependency>
<!--Spring-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<!--Junit-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<!--Lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <!--<scope>provided</scope>-->
</dependency>

Maven资源过滤设置

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>
  • 建立基本结构和配置框架

    com.lindom.pojo

    com.lindom.mapper

    com.lindom.service

    com.lindom.controller

    mybatis-config.xml

    <?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>
    
    </configuration>
    

    applicationContext.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    

2. Mybaits层编写

  • 数据库配置文件:database.properties

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm?useSSL=false&serverTimezone=Hongkong&UseUnicode=true&characterEncoding=utf-8&autoReconnect=true
    jdbc.username=root
    jdbc.password=991021
    
  • Mybatis核心配置文件:mybatis-config.xml

    <?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.lindom.pojo" />
        </typeAliases>
    
        <mappers>
            <mapper resource="com/lindom/mapper/BookMapper.xml" />
        </mappers>
    </configuration>
    
  • com.lindom.pojo

    Books.java

    package com.lindom.pojo;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Books {
        private int bookID;
        private String bookName;
        private int bookCounts;
        private String detail;
    }
    
  • com.lindom.mapper

    BookMapper.java

    package com.lindom.mapper;
    
    import com.lindom.pojo.Books;
    
    import java.util.List;
    
    public interface BookMapper {
        //增加一个Book
        int addBook(Books book);
    
        //根据id删除一个Book
        int deleteBookById(int id);
    
        //更新Book
        int updateBook(Books books);
    
        //根据id查询,返回一个Book
        Books queryBookById(int id);
    
        //查询全部Book,返回list集合
        List<Books> queryAllBook();
    
        //根据书名查书
        Books queryBookByName(String name);
    }
    

    BookMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <!--suppress ALL -->
    <mapper namespace="com.lindom.mapper.BookMapper">
    
        <!--增加一个Book-->
        <insert id="addBook" parameterType="Books">
            insert into books (bookName,bookCounts,detail) values (#{bookName},#{bookCounts},#{detail})
        </insert>
    
        <!--根据id删除一个Book-->
        <delete id="deleteBookById" >
            delete from ssm.books where bookID = #{bookID}
        </delete>
    
        <!--更新Book-->
        <update id="updateBook" parameterType="Books">
            update ssm.books set bookName = #{bookName}, bookCounts = #{bookCounts}, detail = #{detail} where bookID = #{bookID}
        </update>
    
        <!--根据id查询,返回一个Book-->
        <select id="queryBookById" resultType="Books">
            select * from ssm.books where bookID = #{bookID}
        </select>
    
        <!--查询全部Book-->
        <select id="queryAllBook" resultType="books">
            select * from ssm.books
        </select>
    
        <!--根据书名查书-->
        <select id="queryBookByName" resultType="books">
            select * from ssm.books where bookName like "%"#{bookName}"%"
        </select>
    </mapper>
    
  • com.lindom.service

    BookService.java

    package com.lindom.service;
    import com.lindom.pojo.Books;
    import java.util.List;
    
    //底下需要去实现,调用dao层
    public interface BookService {
    
        //增加一个Book
        int addBook(Books book);
    
        //根据id删除一个Book
        int deleteBookById(int id);
    
        //更新Book
        int updateBook(Books books);
    
        //根据id查询,返回一个Book
        Books queryBookById(int id);
    
        //查询全部Book,返回list集合
        List<Books> queryAllBook();
    
        //根据书名查书
        Books queryBookByName(String name);
    }
    

    BookServiceImpl.java

    package com.lindom.service;
    import com.lindom.mapper.BookMapper;
    import com.lindom.pojo.Books;
    import java.util.List;
    
    public class BookServiceImpl implements BookService {
    
        //调用dao层的操作,设置一个set接口,方便Spring管理
        private BookMapper bookMapper;
    
        public void setBookMapper(BookMapper bookMapper) {
            this.bookMapper = bookMapper;
        }
        public int addBook(Books book) {
            return bookMapper.addBook(book);
        }
        public int deleteBookById(int id) {
            return bookMapper.deleteBookById(id);
        }
        public int updateBook(Books books) {
            return bookMapper.updateBook(books);
        }
        public Books queryBookById(int id) {
            return bookMapper.queryBookById(id);
        }
        public List<Books> queryAllBook() {
            return bookMapper.queryAllBook();
        }
        public Books queryBookByName(String name) {
            return bookMapper.queryBookByName(name);
        }
    }
    

3. Spring层编写

  • Spring整合Mybatis的配置文件

    spring-mapper.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置整合mybatis -->
        <!-- 1.关联数据库文件 -->
        <context:property-placeholder location="classpath:database.properties" />
    
        <!-- 2.数据库连接池 -->
        <!--数据库连接池
            dbcp 半自动化操作 不能自动连接
            c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
        -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!-- 配置连接池属性 -->
            <property name="driverClass" value="${jdbc.driver}" />
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="user" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
    
            <!-- c3p0连接池的私有属性 -->
            <property name="maxPoolSize" value="30" />
            <property name="minPoolSize" value="10" />
            <!-- 关闭连接后不自动commit -->
            <property name="autoCommitOnClose" value="false" />
            <!-- 获取连接超时时间 -->
            <property name="checkoutTimeout" value="10000" />
            <!-- 当获取连接失败重试次数 -->
            <property name="acquireRetryAttempts" value="2" />
        </bean>
    
        <!-- 3.配置SqlSessionFactory对象 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource" />
            <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
            <property name="configLocation" value="classpath:mybatis-config.xml" />
        </bean>
    
        <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
        <!--解释 : https://www.cnblogs.com/jpfss/p/7799806.html-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 注入sqlSessionFactory -->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
            <!-- 给出需要扫描Dao接口包 -->
            <property name="basePackage" value="com.lindom.mapper" />
        </bean>
    
    </beans>
    
  • Spring整合Service的配置文件

    spring-service.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 扫描service相关的bean -->
        <context:component-scan base-package="com.lindom.service" />
    
        <!--BookServiceImpl注入到IOC容器中-->
        <bean id="BookServiceImpl" class="com.lindom.service.BookServiceImpl">
            <!--bookMapper在spring-mapper.xml里已经被动态注入spring容器中了-->
            <property name="bookMapper" ref="bookMapper" />
        </bean>
    
        <!-- 配置事务管理器 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource" />
        </bean>
    
    </beans>
    

4. SpringMVC层编写

  • web.xml

    <?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">
    
        <!--DispatcherServlet-->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <!--一定要注意:我们这里加载的是总的配置文件-->
                <param-value>classpath:applicationContext.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!--解决乱码问题-->
        <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <!--Session过期时间-->
        <session-config>
            <session-timeout>15</session-timeout>
        </session-config>
    
    </web-app>
    
  • spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            https://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置SpringMVC -->
        <!-- 1.开启SpringMVC注解驱动 -->
        <mvc:annotation-driven />
        <!-- 2.静态资源默认servlet配置-->
        <mvc:default-servlet-handler />
    
        <!-- 3.配置jsp 显示ViewResolver视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
        <!-- 4.扫描web相关的bean -->
        <context:component-scan base-package="com.lindom.controller" />
    </beans>
    
  • Spring配置整合文件

    applicationContext.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <import resource="spring-mapper.xml" />
        <import resource="spring-service.xml" />
        <import resource="spring-mvc.xml" />
    
    </beans>
    

5. Controller 和 视图层

  • BookController.java

    package com.lindom.controller;
    import com.lindom.pojo.Books;
    import com.lindom.service.BookService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    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.ArrayList;
    import java.util.List;
    
    @Controller
    @RequestMapping("/book")
    public class BookController {
    
        @Autowired
        @Qualifier("BookServiceImpl")
        private BookService bookService;
    
        @RequestMapping("/list")
        public String list(Model model){
            List<Books> list = bookService.queryAllBook();
            model.addAttribute("list",list);
            return "toList";
        }
    
        @RequestMapping("/toAddBook")
        public String toAddBook(){
            return "addBook";
        }
    
        @RequestMapping("/addBook")
        public String addBook(Books books){
            bookService.addBook(books);
            return "redirect:/book/list";
        }
    
        @RequestMapping("/toUpdateBook")
        public String toUpdateBook(Model model, int id){
            Books books = bookService.queryBookById(id);
            model.addAttribute("book",books);
            return "/updateBook";
        }
    
        @RequestMapping("/updateBook")
        public String updateBook(Books books){
            bookService.updateBook(books);
            return "redirect:/book/list";
        }
    
        @RequestMapping("/delete/{id}")
        public String delete(@PathVariable("id") int id){
            bookService.deleteBookById(id);
            return "redirect:/book/list";
        }
    
        @RequestMapping("/queryBookByName")
        public String queryBookByName(String queryBookName, Model model){
            Books books = bookService.queryBookByName(queryBookName);
            List<Books> list = new ArrayList<Books>();
            list.add(books);
            if (books == null) {
                model.addAttribute("error","未找到书籍");
                list = bookService.queryAllBook();
            }
            model.addAttribute("list",list);
            return "toList";
        }
    }
    
  • index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>首页</title>
        <style type="text/css">
          a{
            text-decoration: none;
            color: aquamarine;
            font-size: 18px;
          }
          h3{
            width: 180px;
            height: 38px;
            margin: 100px auto;
            text-align: center;
            line-height: 38px;
            background: deepskyblue;
            border-radius: 4px;
          }
        </style>
      </head>
      <body>
          <h3>
            <a href="${pageContext.request.contextPath}/book/list">点击进入书籍列表</a>
          </h3>
      </body>
    </html>
    
  • toList.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
        <head>
            <title>书籍列表</title>
            <meta name="viewport" content="width=device-width, initial-
                                           scale=1.0">
            <!-- 引入 Bootstrap -->
            <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        </head>
        <body>
            <div class="container">
                <div class="row clearfix">
                    <div class="col-md-12 column">
                        <div class="page-header">
                            <h1>
                                <small>书籍列表 —— 显示所有书籍</small>
                            </h1>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-4 column">
                        <a class="btn btn-primary"
                           href="${pageContext.request.contextPath}/book/toAddBook">新增</a>
                    </div>
    
                    <div class="col-md-4 column" ></div>
                    <div class="col-md-4 column">
                        <form class="form-inline" action="/book/queryBookByName" method="post"
                              style="float: right">
                            <span style="color:red;font-weight: bold">${error} </span>
                            <input type="text" name="queryBookName" class="form-control"
                                   placeholder="输入查询书名" >
                            <%--required--%>
                            <input type="submit" value="查询" class="btn btn-primary">
                        </form>
                    </div>
                </div>
                <div class="row clearfix">
                    <div class="col-md-12 column">
                        <table class="table table-hover table-striped">
                            <thead>
                                <tr>
                                    <th>书籍编号</th>
                                    <th>书籍名字</th>
                                    <th>书籍数量</th>
                                    <th>书籍详情</th>
                                    <th>操作</th>
                                </tr>
                            </thead>
                            <tbody>
                                <c:forEach var="book" items="${requestScope.get('list')}">
                                    <tr>
                                        <td>${book.getBookID()}</td>
                                        <td>${book.getBookName()}</td>
                                        <td>${book.getBookCounts()}</td>
                                        <td>${book.getDetail()}</td>
                                        <td>
                                            <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> |
                                            <a href="${pageContext.request.contextPath}/book/delete/${book.getBookID()}">删除</a>
                                        </td>
                                    </tr>
                                </c:forEach>
                            </tbody>
                        </table>
                        <%--1.5这个数字可以改动,可以找准位置--%>
                        <div class="col-md-1.5 column" style="float: right">
                            <a class="btn btn-primary"
                               href="${pageContext.request.contextPath}/book/list">返回书籍列表</a>
                        </div>
                    </div>
                </div>
            </div>
    
  • addBook.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>新增书籍</title>
        <meta name="viewport" content="width=device-width, initial- scale=1.0">
        <!-- 引入 Bootstrap -->
        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body>
    <div class="container">
        <div class="row clearfix">
            <div class="col-md-12 column">
                <div class="page-header">
                    <h1>
                        <small>新增书籍</small>
                    </h1>
                </div>
            </div>
        </div>
        <form action="${pageContext.request.contextPath}/book/addBook" method="post">
            书籍名称:<input type="text" name="bookName"><br><br><br>
            书籍数量:<input type="text" name="bookCounts"><br><br><br>
            书籍详情:<input type="text" name="detail"><br><br><br>
            <input type="submit" value="添加">
        </form>
    </div>
    
  • updateBook.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>修改信息</title>
        <meta name="viewport" content="width=device-width, initial-
    scale=1.0">
        <!-- 引入 Bootstrap -->
        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body>
    <div class="container">
        <div class="row clearfix">
            <div class="col-md-12 column">
                <div class="page-header">
                    <h1>
                        <small>修改信息</small>
                    </h1>
                </div>
            </div>
        </div>
        <form action="${pageContext.request.contextPath}/book/updateBook"
              method="post">
            <input type="hidden" name="bookID" value="${book.getBookID()}"/>
            书籍名称:<input type="text" name="bookName"
                        value="${book.getBookName()}"/>
            书籍数量:<input type="text" name="bookCounts"
                        value="${book.getBookCounts()}"/>
            书籍详情:<input type="text" name="detail"
                        value="${book.getDetail() }"/>
            <input type="submit" value="提交"/>
        </form>
    </div>
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值