项目管理与SSM框架 SpringMVC(三)

简介: 项目管理与SSM框架 SpringMVC(三)

3.3 请求转发、重定向

之前的案例,我们发现request域中的值可以传到jsp页面中,也就是通过视图解析器跳转到视图的底层是请求转发。

如果我们跳转时不想使用视图解析器,可以使用原生HttpServletRequest进行请求转发或HttpServletResponse进行重定向:

1、控制器

//原生方式进行请求转发
    @RequestMapping("/hello8")
    public void myForward1(HttpServletRequest request, HttpServletResponse response) throws Exception{
        request.setAttribute("name","张三");
        //请求转发
        request.getRequestDispatcher("/helloMVC.jsp").forward(request,response);
    }
    //原生方式进行重定向
    @RequestMapping("/hello9")
    public void myForward2(HttpServletRequest request,HttpServletResponse response) throws IOException {
        request.setAttribute("name","张三");
        response.sendRedirect("helloMVC.jsp");
    }

2、jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<html>
<head>
    <title>MVC</title>
</head>
<body>
<h1>你好啊,${requestScope.name}</h1>
</body>
</html>

3、访问

SpringMVC还提供了一种更简单的请求转发和重定向的写法:

@RequestMapping("/hello10")
    public String myForward3(HttpServletRequest request){
        request.setAttribute("name","张三");
        // 请求转发
        return "forward:helloMVC";
        // 重定向
        // return "redirect:helloMVC";
    }

四、SpringMVC注解

4.1 @Controller、@RequestMapping

@Controller

作用:标记控制器,将控制器交给Spring容器管理。

位置:类上方

@RequestMapping

作用:给控制器方法设置请求路径

位置:方法或类上方。用于类上,表示类中的所有控制器方法都是以该地址作为父路径。

属性:

  • value/path:请求路径(只写一个属性时默认为请求路径)
  • method:指定请求方式
  • params:规定必须发送的请求参数
  • headers:规定请求必须包含的请求头
/*
     访问路径为 localhost:8080/annotation1
     支持post和get请求
     请求时必须带有name参数
    */
    @RequestMapping(path = "/annotation1",
            method = {RequestMethod.GET,RequestMethod.POST},
            params = {"name"})
    public String annotation1(String name,Map map){
        map.put("name", name);
        System.out.println(name);
        return "helloMVC";
    }


4.2 @RequestParam

作用:在控制器方法中获取请求参数

位置:方法参数前

属性:

  • name:指定请求参数名称
  • defaultValue: 为参数设置默认值
  • required:设置是否是必须要传入的参数
/*
      定义请求的参数名为name,默认值为张三,不是必须的参数
   */
    @RequestMapping("/annotation2")
    public String annotation2(@RequestParam(name = "name",defaultValue = "张三",required = false) 
                                          String name,Map map){
        map.put("name", name);
        return "helloMVC";
    }


4.3 @ReuqestHeader、@CookieValue

@RequestHeader

作用:在控制器方法中获取请求头数据

位置:方法参数前

@CookieValue

作用:在控制器方法中获取Cookie数据

位置:方法参数前

/*
    获取User-Agent请求头
    获取JSESSIONID的Cookie值
   */
    @RequestMapping("/annotation3")
    public void annotation3(@RequestHeader("User-Agent") String userAgent,
                              @CookieValue("JSESSIONID") String jSessionId){
        System.out.println(userAgent);
        System.out.println(jSessionId);
    }

4.4 @SessionAttributes

作用:将Model模型中的数据存到session域中,model模型的数据域是request。

位置:类上方

@Controller
@SessionAttributes("name")
public class MyController {
    @RequestMapping("/hello")
    public String t1(Model model){
        // model中保存name数据
        model.addAttribute("name","张三");
        return "helloMVC";
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<html>
<head>
    <title>MVC</title>
</head>
<body>
<h1>你好啊,${sessionScope.name}</h1>
</body>
</html>

访问:


4.5 @ModelAttribute

作用1:设置指定方法在控制器其他方法前执行

位置:方法上方

@Controller
public class MyController {
    @ModelAttribute
    public void before(){
        System.out.println("前置方法");
    }
    @RequestMapping("/hello1")
    public void hello1(){
        System.out.println("hello1方法执行");
    }
}

访问:http://localhost:8080/hello1

作用2:从Model模型中获取数据给参数赋值,提前预热数据。

位置:方法参数前

@Controller
public class MyController {
    // 前置方法向Model中设置数据
    @ModelAttribute
    public void before(Model model){
        model.addAttribute("name","张三");
    }
    // 该参数不是从请求中获取,而是从Model中获取
    @RequestMapping("/hello2")
    public void t1(@ModelAttribute("name") String name){
        System.out.println(name);
    }
}

访问:http://localhost:8080/hello2


4.6 RESTful风格介绍

RESTful风格是一种URL路径的设计风格。在RESTful风格的URL路径中,网络上的任意数据都可以看成一个资源,它可以是一段文本、一张图片,也可以是一个Java对象。而每个资源都会占据一个网络路径,无论对该资源进行增删改查,访问的路径是一致的。

传统URL:

RESTful风格URL:

那么如何区分对该资源是哪一种操作?通过请求方式不同,判断进行的是什么操作。

之前我们学过两种请求方式,GET请求和POST请求,而访问RESTful风格的URL一共有四种请求方式:

  • GET请求:查询操作
  • POST请求:新增操作
  • DELETE请求:删除操作
  • PUT请求:修改操作

RESTful风格URL:

RESTful风格的优点:

结构清晰、符合标准、易于理解、扩展方便。


4.7 APIFOX工具的使用

视频链接:21分钟学会Apifox_哔哩哔哩_bilibili


4.8 @PathVariable

作用:在RESTful风格的URL中获取占位符的值

位置:方法参数前

属性:

  • value:获取哪个占位符的值作为参数值,如果占位符和参数名相同,可以省略该属性。
package com.zj.controller;
import com.zj.pojo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/student")
// 模拟学生的增删改查控制器
public class StudentController {
  // 路径中的{id}表示占位符,最后会封装到方法的参数中使用
  // 删除学生
  @DeleteMapping(value = "/{id}")
  public void deleteStudent(@PathVariable("id") int id){
     System.out.println("删除id为"+id+"的学生");
   }
  // 如果占位符和参数名相同,可以省略@PathVariable的value属性
  // 根据id查询学生
  @GetMapping(value = "/{id}")
  public void findStudentById(@PathVariable int id){
    System.out.println(id);
    System.out.println("根据id查询学生");
   }
    // 新增学生
  @PutMapping(value = "/{id}")
  public void addStudent(@PathVariable int id, Student student){
    System.out.println(id);
    System.out.println(student);
    System.out.println("新增学生");
   }
  // 修改学生
  @DeleteMapping(value = "/{id}")
  public void updateStudent(@PathVariable int id, Student student){
    System.out.println(id);
    System.out.println(student);
    System.out.println("修改学生");
   }
}

访问方式:


4.9 HiddentHttpMethodFilter

由于浏览器form表单只支持GET与POST请求,而DELETE、PUT请求并不支持,SpringMVC有一个过滤器,可以将浏览器的POST请求改为指定的请求方式,发送给的控制器方法。

用法如下:

1、在web.xml中配置过滤器

<!-- 请求方式过滤器 -->
<filter>
  <filter-name>httpMethodFilter</filter-name>
  <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>httpMethodFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

2、编写控制器方法

package com.zj.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
public class MyController {
    @DeleteMapping("/delete")
    public void testDelete(){
        System.out.println("删除方法");
    }
    @PutMapping("/put")
    public void testPut(){
        System.out.println("修改方法");
    }
}

3、表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>DELETE、PUT提交</title>
</head>
<body>
<!-- 删除 -->
<%-- 提交DELETE、PUT请求,表单必须提交方式为post --%>
<%-- 表单中有一个隐藏域,name值为_method,value值为提交方式 --%>
<form action="/delete" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="删除">
</form>
<hr/>
<!-- 修改 -->
<form action="/put" method="post">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="修改">
</form>
</body>
</html>


相关文章
|
5月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
21天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
33 4
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
150 2
|
3月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
4月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
3月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
67 2
|
3月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
234 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
4月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
5月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
5月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)