SSM_SpringMvc个人总结

SpringMVC

第一章 SpringMVC 概 述

​ Spring MVC 是基于 Spring的一个框架,实际上就是Spring 的一个模块,专门做Web 开发的,理解是一个Servlet的一个升级

​ Spring MVC中 最重要的是 Spring mvc 注解式开发 和 SSM整合开发。

★★★0 SpringMVC处理请求的简单流程图

在这里插入图片描述

★1. HelloWorld

①创建Web工程,并导入以下jar包
在这里插入图片描述

②在web.xml文件中配置前端控制器DispatcheServlet

<!--一 . 配置前端控制器-->
    <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- ①配置DispatcherServlet的初始化参数:设置spring MVC 文件的路径和文件名称-->
                <init-param>
                  <param-name>contexConfigLocation</param-name>
                  <param-value>classpath:springmvc.xml</param-value>
                </init-param>
                <!-- 启动级别  1 -->
             <load-on-startup>1</load-on-startup>
    </servlet>
     
       <!--  /  匹配所有请求;(不包括.jsp)
            /*  匹配所有请求;(包括.jsp)   --><servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

③ 在src目录下创建SpringMVC的配置配置文件,并命名为springmvc.xml

​ 1) 配置自动扫描的包

​ 2) 配置视图解析器

<!--    1 )配置自动扫描的包
          2)配置视图解析器      -->

         <!-- 1)  配置自动扫描包-->
    <context:component-scan base-package="com.atguigu.springmvc"></context:component-scan>>
         
         <!-- 2)  配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
                            <!--①配置前缀-->
                <property name="prefix" value="/WEB-INF/views/"></property>
                            <!-- ②配置后缀-->
                <property name="suffix" value=".jsp"></property>
    </bean>

④ 在首页index.jsp页面中添加一个超链接

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
  <a href="${pageContext.request.contextPath}/helloworld">HelloSpringMVC</a>
  </body>
</html>

⑤ 创建控制器/处理器

a) 在类上添加@Controller注解标识当前类是一个处理器

b) 在方法上添加@RequestMapping注解设置该方法处理的请求路径


@Controller
public class HelloWorldController {
    @RequestMapping(value = "/helloworld")
    public String helloworld(){
      System.out.println("Hello springMVC!");
      return "success";

⑥在WEB-INF/views目录下创建视图页面success.jsp

<html>
<head>
         <title>成功页面</title>
</head>
<body>
          <h1> 请求成功</h1>
</body>
</html>

⑦ 启动Tomcat点击index.jsp页面中的超链接测试

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

⑧ 在浏览器中看到success.jsp页面中的内容

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

★2 HelloWorld请求流程图解

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

基本步骤:

  1. 客户端请求提交到DispatcherServlet

  2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

  3. DispatcherServlet将请求提交到Controller(也称为Handler)

  4. Controller调用业务逻辑处理后,返回ModelAndView

  5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

  6. 视图负责将结果显示到客户端

第二章 @RequestMapping注解

1 概述

① SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些 URL 请求。

② DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。

2 .1 @RequestMapping注解可以标注的位置

@RequestMapping注解可以添加到类上,也可以添加到方法上

  1. 标记在类上:提供初步的请求映射信息。相对于WEB 应用的根目录

  2. 标记在方法上:提供进一步的细分映射信息。相对于标记在类上的 URL。

2.2 @RequestMapping注解常用的属性

★1.value属性

​ a) 用来设置要映射的请求地址
​ b) 属性值的类型是String类型的数组,如果该注解中只设置了value属性,那么value属性名可以省略不写;
​ c) 如果只映射一个请求地址,那么数组的大括号{}也可以省略

@RequestMapping(value = {"/testValue1","/testValue2"})
public String testValue(){
    System.out.println("测试@RequestMapping注解的value属性");
    return "success";
}

★ 2 method属性

​ a) 用来设置要映射的请求方式

​ b) 值的类型是RequestMethod枚举类型的数组

​ c) 请求方式有Get、Post、Put、Delete等

@RequestMapping(value = "/testMethod",method = RequestMethod.GET)
public String testMethod(){
    System.out.println("测试@RequestMapping注解的method属性");
    return "success";

2.3 @RequestMapping映射带占位符的URL

① 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中,

URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到处理方法的入参中。

② @PathVariable注解主要用来处理REST风格的URL的中的请求参数。该注解中有以下三个属性:

​ a) value属性:用来指定要映射的URL中的占位符的名字。

​ b name属性:与value功能一样,是value的一个别名。

​ required属性:设置指定的占位符的名字是否是必须的,默认是true,如果不存在则抛出异常

页面连接

<a href="${pageContext.request.contextPath}/testPathVariable/1">Test PathVariable</a><br>

处理器方法

@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable(value = "id",required = false) Integer id){
    System.out.println("传入的id的值是:"+id);
    return "success";
}

3. REST

3.1概述

​ 即表现层状态转换,是根基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。

​ 简单来说就是将服务器中的资源通过URI的方式来定位。

​ ★ REST风格的URL将HTTP协议中的四种请求方式GET、POST、PUT、DELETE分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源

3.2 如何发送PUT和DELETE请求

浏览器 form 表单只支持 GET 与 POST 请求,而PUT、DELETE 等请求方式并不

支持,Spring3.0 添加了一个过滤器HiddenHttpMethodFilter,可以将POST请求转换为PUT或DELETE请求。

★ 转换PUT或DELETE请求的步骤:

在web.xml配文件中配置过滤器 HiddenHttpMethodFilter。

<!--配置HiddenHttpMethodFilte过滤器,目的是为了将POST请求转换为PUT或DELETE请求-->
<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在POST请求的form表单中添加一个_method的请求参数

​ _method的值为put(忽略大小写)则转换为PUT请求

​ _method的值为delete(忽略大小写)则转换为DELETE请求

<form action="${pageContext.request.contextPath}/testPut" 
method="post">
  <input type="hidden" name="_method" value="put">
  <input type="submit" value="转换PUT请求">
</form>


<form action="${pageContext.request.contextPath}/testDelete" method="post">
  <input type="hidden" name="_method" value="delete">
  <input type="submit" value="转换DELETE请求">
</form>

第三章 处理请求数据

概述

Spring MVC 通过分析处理方法的签名(方法名+ 参数列表),可以将HTTP请求信息绑定到处理方法的相应入参中,并根据方法的返回值类型做出相应的后续处理。

​ 必要时可以对方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader、@CookieValue 等)。

★3.1 @RequestParam注解

★@RequestParam注解:用来将传统的URL或form表单中的请求参数绑定到处理方法的入参中
如果处理方法的入参的参数名和请求参数的参数名一致,那么该注解可以省略
该注解中的属性:
value:用来设置请求参数的参数名
name:是value的别名,功能和value一样
required:用来设置value中指定的请求参数是否是必须的,默认是true,如果请求参数没有传则会抛出异常
defaultValue:用来设置一个默认值,如果请求参数没有传的话将使用该值

@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("username") String username ,
                               @RequestParam(value = "age",required = false,defaultValue = "0") Integer age){
    System.out.println("传入的用户名是:"+username);
    System.out.println("传入的年龄是:"+age);
    return "success";
}
<a href="${pageContext.request.contextPath}/testRequestParam?username=admin&age=18">Test RequestParam</a><br>
  <form action="${pageContext.request.contextPath}/testRequestParam" method="post">
    用户名:<input type="text" name="username"><br>
    用户的年龄:<input type="text" name="age"><br>
    <input type="submit" value="Test RequestParam">
  </form>

3.2 @RequestHeader注解

@RequestHeader注解:用来将请求头中的信息绑定到处理方法的入参中
该注解中的属性与@RequestParam注解中的属性一样
value属性:指定请求头中属性名

  <a href="${pageContext.request.contextPath}/testRequestHeader">Test RequestHeader</a><br>
 @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader("Referer") String referer ,
                                    @RequestHeader("User-Agent") String userAgent){
        System.out.println("您从这儿来:"+referer);
        System.out.println("您的系统信息"+userAgent);
        return SUCCESS;
    }

3.3 @CookieValue注解

@CookieValue注解:用来将Cookie对象的值绑定到处理方法的入参中
该注解中的属性与@RequestParam注解中的属性一样
value属性:指定Cookie对象的名字

<a href="${pageContext.request.contextPath}/testCookieValue">Test CookieValue</a><br>
@RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
        System.out.println("名字为JSESSIONID的Cookie对象的值是:"+cookieValue);
        return SUCCESS;
    }

★3.4 使用POJO作为入参

入参是POJO
SpringMVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。
而且支持级联属性赋值
★ 要求:请求参数的参数名和POJO的属性名要保持一致

  1. 创建POJO类

​ i. Employee类

​ i. Department类

   2. 创建表单
<h1>处理入参为POJO</h1>
<form action="${pageContext.request.contextPath}/testPOJO" method="post">
  员工编号:<input type="text" name="id"><br>
  员工姓名:<input type="text" name="lastName"><br>
  员工邮箱:<input type="text" name="email"><br>
  员工部门编号:<input type="text" name="department.id"><br>
  员工部门名称:<input type="text" name="department.departmentName"><br>
  <input type="submit" value="Test_pojo">
</form>
  1. 创建处理方法
 */
    @RequestMapping("/testPOJO")
    public String testPOJO(Employee employee){
        System.out.println("员工信息是:"+employee);
        return SUCCESS;
    }

3.5 使用原生ServletAPI作为入参

  1. 不使用@RequestParam注解和入参为POJO同样可以获取请求参数,可以使用原生的Servlet API作为入参进行操作。

  2. SpringMVC处理器方法中接受的原生Servlet API有以下9个:

★HttpServletRequest

★HttpServletResponse

★HttpSession

 <a href="${pageContext.request.contextPath}/testServletAPI?username=admin&password=666666">Test ServletAPI</a><br>
@RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request , HttpSession session){
        //获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username);
        System.out.println(password);
        //将用户名放到session域中
        session.setAttribute("user",username);
        return SUCCESS;
    }

第四章 处理响应数据

概述

SpringMVC提供了以下两种种途径输出模型数据:

  1. ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据,最终会添加到request域中。

Map 或 Model或ModelMap: 入参为java.uti.Map、 org.springframework.ui.Model或org.springframework.ui.ModelMap 时,处理方法返回时,Map 中的数据会自动添加到模型中,并最终添加到request域中。

4.1 ModelAndView

处理响应数据方式一:处理方法的返回值设置为ModelAndView

  1. 处理器方法
 <a href="${pageContext.request.contextPath}/testModelAndView">Test ModelAndView</a><br>
 @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        //创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        //通过Controller调用Service,Service调用Dao查询数据
        //假设从数据库中查询到一个Employee对象
        Employee employee = new Employee(1, "张三", "zhangsan@atguigu.cn", new Department(1001, "财务部"));
        //将模型数据设置到ModelAndView对象中,最终会放到request域中
        mv.addObject("emp",employee);
        //设置视图名
        mv.setViewName("success");
        return mv;
        
    }
  1. 成功页面内容
body>
    <h1>请求成功!</h1>
    <h1>Request域中的属性值是:${requestScope.user}</h1>
</body>
★4.2 Map、Model或ModelMap

处理响应数据方式二:Map、Model或ModelMap

Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据,具体使用步骤:

  1. Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。

  2. 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。

  3. 在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。

  4. Map、Model、ModelMap三者的关系:

ModelMap继承了LinkedHashMap

ExtendedModelMap继承了ModelMap实现了Model接口

 <a href="${pageContext.request.contextPath}/testMap">Test Map</a><br>
 @RequestMapping("/testMap")
    public String testMap(Map<String , Object> map){
        System.out.println(map.getClass().getName());
        //通过Controller调用Service,Service调用Dao查询数据
        //假设从数据库中查询到一个Employee对象
        Employee employee = new Employee(1, "张小三", "zhangxiaosan@sina.cn", new Department(1001, "公关部"));
        //将查询到的员工放到map中,最终也会放到request域中
        map.put("emp",employee);
        return SUCCESS;

.

第五章 视图解析

★5.4mvc:view-controller标签

如果希望不通过处理器的方法直接响应SpringMVC渲染的页面,则可以使用 mvc:view-controller 标签实现。

  1. 在SpringMVC的配置文件中配置mvc:view-controller标签
<!--配置不经过处理器方法直接响应的页面-->
    <mvc:view-controller path="/testViewController" view-name="success"></mvc:view-controller>
  1. 配置了以上标签之后会导致其他请求路径都失效,还需要配置以下标签(后面的内容再讲述具体原因),而且在实际的开发中我们也都要配置以下标签。
<mvc:annotation-driven></mvc:annotation-driven>

★5.5 重定向

 <a href="${pageContext.request.contextPath}/testRedirect">Test Redirect</a><br>
★重定向
    @RequestMapping("/testRedirect")
    public String testRedirect(){
        System.out.println("测试收到转发和重定向");

    //  return "forward:/test/prefix_test.jsp"; //完成一个向 /test/prefix_test.jsp页面转发的操作
    return "redirect:/test/prefix_test.jsp"; //完成一个向 /test/prefix_test.jsp页面重定向的操作
    }

第六章 处理JSON

1. @ResponseBody注解

a) 可以添加到类上也可以添加到方法上

b) 添加了该注解的处理器方法方法的返回值将直接响应给浏览器

c) 测试案例:将字符串直接响应给浏览器

@ResponseBody
@RequestMapping(value = "/testResponseBody")
public String testResponseBody(){
    System.out.println("测试@ResponseBody注解");
    return "success";
}

2 . 返回JSON格式数据

将对象转换为JSON格式的步骤:

​ ①导入以下jar包

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

​ ② 处理器方法

@ResponseBody
@RequestMapping("/testJSON")
public Employee testJson(){
    //创建Employee对象
    Employee employee = new Employee(1, "zhangsan", "zhangsan@atguigu.com", 1, new      Department(1001, "Teacher"));
    return employee;
}

​ ③页面效果

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

第七章 文件上传

7.1 简介

  1. Spring MVC 为文件上传提供了直接的支持,通过MultipartResolver 接口实现。

  2. Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 SpringMVC 的文件上传功能,需要在上下文中配置 MultipartResolver。

3)Jakarta Commons FileUpload 技术实现了一个 MultipartResolver接口, 实现类是:CommonsMultipartResolver

★ 7.2文件上传步骤

①导入以下jar包

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

② 在SpringMVC的配置文件中配置CommonsMultipartResolver解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--设置字符集-->
    <property name="defaultEncoding" value="utf-8"></property>
    <!--设置总文件的大小-->
    <property name="maxUploadSize" value="102400"></property>
</bean>
③表单页面

a) enctype属性值设置为multipart/form-data

b) 上传文件的表单项的type设置为file

<h1>文件上传</h1>
<form action="${pageContext.request.contextPath}/testFileUpload" method="post" enctype="multipart/form-data">
  描述:<input type="text" name="desc"><br>
  文件:<input type="file" name="filename"><br>
  <input type="submit">
</form>

④ 处理器方法

@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc ,
                             @RequestParam("filename")MultipartFile file,HttpSession session) throws IOException {
    System.out.println("文件的描述信息是:"+desc);
    //获取文件名
    String fileName = file.getOriginalFilename();
    //获取文件的类型
    String contentType = file.getContentType();
    //获取文件的大小
    long size = file.getSize();
    System.out.println("文件名是:"+fileName);
    System.out.println("文件的类型是:"+contentType);
    System.out.println("文件的大小是:"+size+" 个字节");
    //获取文件上传的真实路径
    ServletContext servletContext = session.getServletContext();
    String realPath = servletContext.getRealPath("/upload");
    //创建路径
    File upload = new File(realPath);
    if(!upload.exists()){
        upload.mkdirs();
    }
    //上传文件
    file.transferTo(new File(realPath+"/"+fileName));
    return "success";
}

第八章 拦截器(略)

1.自定义拦截器简介

自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter 适配器类。

  1. HandlerInterceptor接口方法说明:

a) preHandle():这个方法在业务处理器处理请求之前被调用,可以在此方法中做一些权限的校验。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。

b) postHandle():这个方法在业务处理器处理请求之后,渲染视图之前调用。在此方法中可以对ModelAndView中的模型和视图进行处理。

c) afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

第九章 异常处理(略)

★ 第十章 SpringMVC的运行流程(面试重点)

流程图

  1. 存在映射

[外链图片转存中...(img-GcC1jT4n-1624788149239)]

  1. 客户端请求提交到DispatcherServlet

  2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

  3. DispatcherServlet将请求提交到Controller(也称为Handler)

  4. Controller调用业务逻辑处理后,返回ModelAndView

  5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

  6. 视图负责将结果显示到客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值