IMUT-LF

SpringMVC-学习笔记

SpringMVC

 

 

1.SpringMVC入门案例

解决 maven 项目构建过慢:

在创建时加一组键值对:archetypeCatalog---internal

 

配置步骤:

创建maven项目,补全目录

修改pom.xml:

properties里改1.8

 

版本锁定:

<!--版本锁定-->
<properties>
   <spring.version>5.2.8.RELEASE</spring.version>
</properties>

导坐标:

<dependencies>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>${spring.version}</version>
   </dependency>

   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-web</artifactId>
     <version>${spring.version}</version>
   </dependency>

   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>${spring.version}</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.0</version>
   </dependency>
</dependencies>

配置控制器(在web.xml中配置servlet):

class选择spring提供好的 DispatcherServlet 类

<servlet>
   <servlet-name>dispatcherServlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>dispatcherServlet</servlet-name>
   <url-pattern>/</url-pattern>
</servlet-mapping>

在resources文件夹下创建springmvc配置文件springmvc.xml配置文件(名字随意)

配置tomcat服务器

注:发送请求时路径写相对路径

 

2.SpringMVC执行流程

image-20200929173433203

 

 

3.RequestMapping注解

 

建立请求URL和处理请求方法之间的对应关系

该注解可以放在类上(作为一级目录),也可以放在方法上(二级目录),如 /user/hello,有利于模块化开发

 

属性:

  • path 和 value 属性作用相同

  • method 属性指定接收哪一种请求方式(用枚举类RequestMethod.方式),请求方式不对会产生405异常

  • params 属性指定限制参数的内容,params属性指定的参数必须在发送请求时带上,若有值时值也必须相同(即k-v都相同),否则会有400异常

  • headers:用于指定限制请求消息头的条件,当指定此属性时,在发送请求时必须带上该头信息,否则错误

<%--
   <a href="hello">入门程序</a>
   --%>

<a href="user/testRequestMapping?username=lisi">测试RequestMapping</a>
@RequestMapping(path = "/hello")
public String sayHello(){
   System.out.println("Hello SpringMVC");
   return "success";
}

@RequestMapping(value = "/testRequestMapping",params = {"username=lisi"},headers = {"Accept"})
public String testRequestMapping(){
   System.out.println("RequestMapping注解测试。。。。。。");
   return "success";
}

 

4.请求参数的绑定

拿到客户端请求时发送的参数

如发送请求时携带参数:...username=...&password=...

4.1.请求参数的绑定说明

1.绑定机制

1.表单提交的数据都是 k=v 格式的,如:username=haha&password=123

2.SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

3.要求:提交表单的name和参数的名称是相同的

在MVC框架中,只要在处理该请求的方法中加上参数,名字与请求携带的参数名一致,即可自动将请求中该参数的值赋给方法的参数(底层反射)

2.支持的数据类型

  • 基本类型和字符串

  • JavaBean

  • 复杂类型(List、Map集合等)

4.2.基本数据类型和字符串类型

1.提交表单的name和参数的名称是相同的

2.区分大小写

4.3.实体类型(JavaBean)

1.提交表单的name和JavaBean中的属性名称一致

2.如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性,例如:address.name

4.4.给集合属性数据封装

1.JSP页面编写方式:list[0].属性

<%--请求参数绑定--%>
<%--
   <a href="param/testParam?username=zhangsan&password=123456">请求参数绑定</a>

   把数据封装到Account对象中
   <div align="center">
   <form action="param/saveAccount" method="post">
   <p> 姓   名:<input type="text" name="username"/> </p>
   <p> 密   码:<input type="password" name="password"/> </p>
   <p> 金   额:<input type="text" name="money"/> </p>
   <p> 用户姓名:<input type="text" name="user.uname"/> </p>
   <p> 用户年龄:<input type="text" name="user.age"/> </p>
   <p> <input type="submit" value="提交"/> </p>
   </form>
   </div>

   --%>

  <%--把数据封装到Account对象中,对象中存在list和map的集合
   <div align="center">
   <form action="param/saveAccount" method="post">
   <p> 姓   名:<input type="text" name="username"/> </p>
   <p> 密   码:<input type="password" name="password"/> </p>
   <p> 金   额:<input type="text" name="money"/> </p>

   <p> 用户姓名:<input type="text" name="list[0].uname"/> </p>
   <p> 用户年龄:<input type="text" name="list[0].age"/> </p>

   <p> 用户姓名:<input type="text" name="map['one'].uname"/> </p>
   <p> 用户年龄:<input type="text" name="map['one'].age"/> </p>
   <p> <input type="submit" value="提交"/> </p>
   </form>
   </div>
   --%>

<%--自定义类型转换器
   <div align="center">
   <form action="param/saveUser" method="post">
   <p> 用户姓名:<input type="text" name="uname"/> </p>
   <p> 用户年龄:<input type="text" name="age"/> </p>
   <p> 用户生日:<input type="text" name="birthday"/> </p>
   <p> <input type="submit" value="提交"/> </p>
   </form>
   </div>
   --%>

<%--Servlet原生的API--%>
<a href="param/testServlet">测试Servlet原生的API</a>
/**
    * 请求参数绑定入门
    * @return
    */
@RequestMapping("/testParam")
public String testParam(String username, String password){
   System.out.println("执行了testParam。。。");
   System.out.println("用户名:"+username);
   System.out.println("密 码:"+password);
   return "success";
}

/**
    * 请求参数绑定把数据封装到JavaBean的类中
    * @return
    */
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
   System.out.println("执行了saveAccount。。。");
   System.out.println(account);
   return "success";
}

/**
    * 自定义类型转换器
    * @param user
    * @return
    */
@RequestMapping("/saveUser")
public String saveUser(User user){
   System.out.println("执行了saveUser。。。");
   System.out.println(user);
   return "success";
}

/**
    * Servlet原生的API
    * @return
    */
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
   System.out.println("执行了saveUser。。。");
   System.out.println("request:"+request);
   System.out.println("response:"+response);

   HttpSession session = request.getSession();
   System.out.println("session:"+session);

   ServletContext servletContext = session.getServletContext();
   System.out.println("servletContext:"+servletContext);

   return "success";
}

 

 

4.5.请求参数中文乱码的解决

1.在web.xml中配置Spring提供的过滤器类 CharacterEncodingFilter,并配置初始的字符参数:

<!--配置字符过滤器-->
<filter>
   <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

 

4.6.自定义类型转换器

由表单等前端组件发送给服务器的信息都是String类型的,SpringMVC可以帮我们将String类型的数据分别转换为不同形式的数据(如Integer、Double等),但是如日期类型的数据,SpringMVC只能帮我们将固定格式(xxxx/xx/xx)的数据转换,如果我们传入不同格式的数据,就会发生异常,这时,就需要我们自定义类型转换器帮助我们进行转化

编写步骤:

1.编写自定义类型转换器(实现Converter接口)

2.配置自定义类型转换器

springmvc.xml中:
<!--配置自定义的类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.liu.utils.StringToDateConverter"/>
        </set>
    </property>
</bean>

 

5.常用注解

5.1.@RequestParam

指定接收前端传来的参数,写在方法形参位置上

属性 :

name = value

required默认为true,如果不传该参数则错误

<%--@RequestParam--%>
<a href="anno/testRequestParam?name=李四">RequestParam</a><br/>
/**
     * RequestParam注解
     * @return
     */
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("name") String username){
    System.out.println("执行了testRequestParam。。。");
    System.out.println(username);
    return "success";
}

 

5.2.@RequestBody

获取请求体内容,直接使用得到 key=value&key=value...结构的数据

get请求方式不适用

属性:

required:是否必须有请求体,默认值为true

当取值为true时,get请求方式会报错;

当取值为false时,get请求得到是null

<%--@RequestBody--%>
<div align="center">
    <form action="anno/testRequestBody" method="post">
        <p> 用户姓名:<input type="text" name="username"/> </p>
        <p> 用户年龄:<input type="text" name="age"/> </p>
        <p> <input type="submit" value="提交"/> </p>
    </form>
</div>
/**
     * 获取请求体的内容
     * @param body
     * @return
     */
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
    System.out.println("执行了testRequestBody。。。");
    System.out.println(body);
    return "success";
}

 

5.3.@PathVariable

REST风格:

image-20201004155639775

@PathVariable 注解可以将请求URL中的占位符所接收的参数赋值给Controller中方法的参数

<%--@PathVariable--%>
<a href="anno/testPathVariable/15">testPathVariable</a><br/>
 /**
     * @PathVariable
     * @param id
     * @return
     */
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
    System.out.println("执行了testPathVariable。。。");
    System.out.println(id);
    return "success";
}

 

5.4.HiddentHttpMethodFilter(了解)

由于浏览器 form 表单只支持GET与POST请求,而DELETE、PUT等method并不支持,Spring3.0添加了一个过滤器,可以将浏览器的请求改为指定的请求方式,发送给控制器的方法,使其支持GET、POST、PUT、DELETE请求

使用步骤:

①在web.xml中配置该过滤器

②请求方式必须使用 post 请求

③按照要求提供 _method 请求参数,该参数的取值就是我们需要的请求方式

 

5.5.@RequestHeader(了解)

用于获取请求消息头

属性:

value:提供消息头名称

required:是否必须有此消息头

<%--@RequestHeader--%>
<a href="anno/testRequestHeader">testRequestHeader</a><br/>
/**
     * 获取请求头的值
     * @param header
     * @return
     */
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header){
    System.out.println("执行了testRequestHeader。。。");
    System.out.println(header);
    return "success";
}

 

5.6.@CookieValue

用于把指定cookie名称的值传入控制器方法的参数

属性:

value:指定cookie的名称

required:是否必须有此cookie

<%--@CookieValue--%>
<a href="anno/testCookieValue">testCookieValue</a><br/>
/**
     * 获取Cookie的值
     * @param cookieValue
     * @return
     */
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
    System.out.println("执行了testCookieValue。。。");
    System.out.println(cookieValue);
    return "success";
}

 

5.7.@ModelAttribute

SpringMVC4.3后加入,可以用于修饰方法和参数

修饰方法:表示当前方法会在控制器的方法执行之前先执行,可以有返回值也可以没有返回值

有返回值:在控制器的方法中可直接调用

无返回值:要在当前方法的参数中加上一个map,将操作结果存入map,再在控制器中方法的参数加上@ModelAttribute注解及其属性名即可调用

修饰参数:获取指定数据给参数赋值

属性:

value:用于获取数据的key,key可以是POJO的属性名称,也可以是map结构的key

应用场景:

当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据

<%--@ModelAttribute--%>
<div align="center">
    <form action="anno/testModelAttribute" method="post">
        <p> 用户姓名:<input type="text" name="uname"/> </p>
        <p> 用户年龄:<input type="text" name="age"/> </p>
        <p> <input type="submit" value="提交"/> </p>
    </form>
</div>
/**
     * ModelAttribute注解
     * @return
     */
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("u") User user){
    System.out.println("执行了testModelAttribute。。。");
    System.out.println(user);
    return "success";
}
/**
 * 该方法会先执行(无返回值)
 * @param uname
 * @return
 */

@ModelAttribute
public void show(String uname, Map<String,User> map){
System.out.println("show方法执行了。。。");
//通过用户名查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(25);
user.setBirthday(new Date());
map.put("u",user);
}

/**
* 该方法会先执行(有返回值)
* @return

@ModelAttribute
public User show(String uname){
    System.out.println("show方法执行了。。。");
    //通过用户名查询数据库(模拟)
    User user = new User();
    user.setUname(uname);
    user.setAge(30);
    user.setBirthday(new Date());
    return user;
}
 */</pre>

 

 

5.8.@SessionAttributes

用于多次执行控制器方法间的参数共享,只能作用在类上

属性:

value:用于指定存入的属性名称

type:用于指定存入的数据类型

 

通过Model接口,可以将键值对类型的数据存入 request 域中

<%--Model接口测试--%>
<a href="anno/testModel">testModel</a><br/>

<a href="anno/testSessionAttributes">testSessionAttributes</a><br/> <%--存入--%>
<a href="anno/getSessionAttributes">getSessionAttributes</a><br/> <%--获取--%>
<a href="anno/delSessionAttributes">delSessionAttributes</a><br/> <%--删除--%>

/**
     * 通过Model的addAttribute方法向request域中存入key-value
     * @param model
     * @return
     */
@RequestMapping("/testModel")
public String testModel(Model model){
    System.out.println("执行了testModel。。。");
    //底层会存储到request域对象中
    model.addAttribute("msg","信息");
    return "success";
}

@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model){
    System.out.println("执行了testSessionAttributes。。。");
    //底层会存储到request域对象中
    model.addAttribute("msg","信息");
    return "success";
}

@RequestMapping("/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
    System.out.println("执行了getSessionAttributes。。。");
    String msg = (String) modelMap.getAttribute("msg");
    System.out.println(msg);
    return "success";
}

@RequestMapping("/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
    System.out.println("执行了delSessionAttributes。。。");
    status.setComplete();    //执行完毕,清除session域中内容
    return "success";
}

 

6.响应数据和结果视图

6.1.返回值分类

6.1.1.字符串

<%--测试返回值类型是String类型--%>
<a href="user/testString">testString</a>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testString")
public String testString(Model model){
    System.out.println("testString方法执行了。。。");
    // 模拟从数据库中查询出user对象
    User user = new User();
    user.setUsername("张三");
    user.setPassword("123456");
    user.setAge(20);
    //将查询出的user存入model对象
    model.addAttribute("user",user);
    return "success";
}

}

6.1.2.void

<%--测试返回值类型是void类型--%>
<a href="user/testVoid">testVoid</a> <br/>
/**
     * void
     * 请求转发是一次请求,不用写项目名称(此时可以访问WEB-INF目录下的资源)
     * 重定向是两次请求,需要写项目名称(request.getContextPath()),且不能直接访问WEB-INF目录下的资源
     */
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("testVoid方法执行了。。。");
    // 编写请求转发的程序
    // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//重定向
// response.sendRedirect(request.getContextPath()+"/index.jsp");

//设置处理中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
//直接进行响应
response.getWriter().print("你好");

return;

}

6.1.3.ModelAndView

<%--测试返回值类型是ModelAndView类型--%>
<a href="user/testModelAndView">testModelAndView</a> <br/>
/**
     * 返回ModelAndView对象
     * @return
     */
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    //创建ModelAndView对象
    ModelAndView mv = new ModelAndView();
    System.out.println("testModelAndView方法执行了。。。");
    // 模拟从数据库中查询出user对象
    User user = new User();
    user.setUsername("李四");
    user.setPassword("654321");
    user.setAge(30);
// 把user存入ModelAndView对象,其底层实现了ModelMap,会把user存入request域中
mv.addObject("user",user);

// 把view设置为success,其底层会通过视图解析器跳转到指定页面
mv.setViewName("success");

return mv;

}

 

6.2.转发和重定向

6.2.1.forward转发

通过关键字进行转发和重定向时,是用不了视图解析器的,所以路径等内容需要自己写

重定向的项目名称底层已经写好

关键字:

forward:路径

redirect:路径

<%--测试使用关键字进行请求转发--%>
<a href="user/testForwardOrRedirect">testForwardOrRedirect</a> <br/>
/**
     * 使用关键字的方式进行转发或重定向
     * @return
     */
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
    System.out.println("testForwardOrRedirect方法执行了。。。");
//请求的转发
//return "forward:/WEB-INF/pages/success.jsp";

//重定向
return "redirect:/index.jsp";

}

 

6.3.ResponseBody响应json数据

页面ajax请求--异步请求,后台需要把一些对象转换成字符串响应回去

在配置了前端控制器之后,会拦截所有请求,包括对静态资源的请求,所以需要在 springmvc.xml 文件中配置哪些请求不拦截

<!--设置静态资源不过滤-->
<mvc:resources mapping="/js/**" location="/js/" />  <!--javascript-->
<mvc:resources mapping="/images/**" location="/images/" />  <!--图片-->
<mvc:resources mapping="/css/**" location="/css/" />  <!--样式-->

 

json字符串和JavaBean对象互相转换的过程中,需要使用 jackson 的jar包

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.0</version>
</dependency>

 

7.文件上传

需要将 form 表单的 enctype 取值设置为 Multilpart/form-data,并且导入 commons-fileupload、commons-io(前者依赖后者)

原来form表单传值格式:
	username=xxx&password=xxx...
将enctype 取值设置为 Multilpart/form-data后,表单会被分为多个部分,在接收表单数据时需要逐个读入

1.按JavaWeb方式上传文件

首先要导入jar包:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2020/10/17
  Time: 19:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Index</title>
</head>
<body>

    <h1 align="center">文件上传</h1>

    <form action="user/fileUpload1" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"/> <br/>
        <input type="submit" value="上传"/> <br/>
    </form>

</body>
</html>
package com.liu.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 文件上传
     * @return
     */
    @RequestMapping("/fileUpload1")
    public String fileUpload1(HttpServletRequest request) throws Exception {
        System.out.println("fileUpload1执行了。。。");
        //使用fileupload组件完成文件上传
        //指定上传文件的路径
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        System.out.println(path);
        //判断该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            //该文件路径不存在
            file.mkdirs();
        }

        //解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        //解析request
        List<FileItem> items = upload.parseRequest(request);
        //遍历
        for (FileItem item:items){
            if(item.isFormField()){
                //该项是普通表单项
            }else{
                //该项是文件项
                //获取上传文件的名称
                String filename = item.getName();
                //把文件的名称设置成唯一值,避免上传相同的文件时覆盖,uuid
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid + "_" + filename;
                //完成文件上传
                item.write(new File(path,filename));
                //删除临时文件
                item.delete();
            }
        }

        return "success";
    }

}

 

2.SpringMVC上传文件

SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同

原理:

image-20201026184910708

注:①表单中的文件组件的name值,必须和调用的servlet中方法的属性值名字相同;

②配置文件解析器时,要用指定的CommonsMultipartResolver文件解析器对象,且id值必须为multipartResolver

<h1>SpringMVC文件上传</h1>
<form action="user/fileUpload2" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload"/> <br/>
    <input type="submit" value="上传"/> <br/>
</form>
/**
     * SpringMVC文件上传
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/fileUpload2")
    public String fileUpload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc文件上传。。。");
        //使用fileupload组件完成文件上传
        //指定上传文件的路径
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        System.out.println(path);
        //判断该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            //该文件路径不存在
            file.mkdirs();
        }
    //该项是文件项
    //获取上传文件的名称
    String filename = upload.getOriginalFilename();
    //把文件的名称设置成唯一值,避免上传相同的文件时覆盖,uuid
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid + "_" + filename;
    //完成文件上传
    upload.transferTo(new File(path,filename)); //上传即可,springmvc自动删除临时文件

    return "success";
}</pre>

 

 

3.SpringMVC跨服务器方式的文件上传

image-20201026190956878

image-20201026191529528

拷贝jar包:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.18.1</version>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>

 

8.SpringMVC的异常处理

1.异常处理思路

1.Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理

 

2.SpringMVC异常处理流程

image-20201028092918365

如果没有编写异常处理器,前端控制器默认把异常抛给浏览器,将在浏览器显示异常,不友好

步骤:

image-20201028101939399

异常处理器都需要实现特定接口:HandlerExceptionResolver

详细看 day02_springmvc_03_exception 的内容

 

9.SpringMVC中的拦截器

image-20201028112100314

image-20201029170514085

编写拦截器需要实现HandlerInterceptor接口

 

SSM三大框架整合

用Spring整合SpringMVC和MyBatis

选择配置文件 + 注解的方式

 

创建数据库和表结构

create database ssm;
use ssm
create table account(
     id int primary key auto_increment,
     name varchar(20),
     money double
);

 

创建新项目 / 模块,导入需要的jar包

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.2.8.RELEASE</spring.version>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <mysql.version>8.0.19</mysql.version>
    <mybatis.version>3.4.5</mybatis.version>
</properties>

<dependencies>
<!--spring-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-aop&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-context&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-test&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-tx&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;junit&lt;/groupId&gt;
        &lt;artifactId&gt;junit&lt;/artifactId&gt;
        &lt;version&gt;4.12&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;mysql&lt;/groupId&gt;
        &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
        &lt;version&gt;${mysql.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
        &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;
        &lt;version&gt;2.5&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;javax.servlet.jsp&lt;/groupId&gt;
        &lt;artifactId&gt;jsp-api&lt;/artifactId&gt;
        &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;jstl&lt;/groupId&gt;
        &lt;artifactId&gt;jstl&lt;/artifactId&gt;
        &lt;version&gt;1.2&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;!--log start--&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;log4j&lt;/groupId&gt;
        &lt;artifactId&gt;log4j&lt;/artifactId&gt;
        &lt;version&gt;${log4j.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
        &lt;version&gt;${slf4j.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
        &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
        &lt;version&gt;${slf4j.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;!--log end--&gt;
    &lt;!--mybatis--&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
        &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
        &lt;version&gt;${mybatis.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
        &lt;artifactId&gt;mybatis-spring&lt;/artifactId&gt;
        &lt;version&gt;1.3.0&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;c3p0&lt;/groupId&gt;
        &lt;artifactId&gt;c3p0&lt;/artifactId&gt;
        &lt;version&gt;0.9.1.2&lt;/version&gt;
        &lt;type&gt;jar&lt;/type&gt;
        &lt;scope&gt;compile&lt;/scope&gt;
    &lt;/dependency&gt;

</dependencies>

创建对应的包和需要的类(dao、service、controller等)

分别编写不同框架并进行测试

 

spring整合springmvc:

image-20201030153833077

 

 

 

 

posted @ 2021-01-15 21:49  IMUT_LF  阅读(90)  评论(0)    收藏  举报

IMUT-LF