SpringMVC应用

文章目录

  • 一、常用注解
  • 二、参数传递
    • [2.1 基础类型+String](#2.1 基础类型+String)
    • [2.2 复杂类型](#2.2 复杂类型)
    • [2.3 @RequestParam](#2.3 @RequestParam)
    • [2.4.路径传参 @PathVariable](#2.4.路径传参 @PathVariable)
    • [2.4 Json数据传参 @RequestBody](#2.4 Json数据传参 @RequestBody)
    • [2.5 @RequestHeader](#2.5 @RequestHeader)
  • 三、方法返回值
    • [3.1 void](#3.1 void)
    • [3.2 String+model](#3.2 String+model)
    • [3.3 ModelAndView](#3.3 ModelAndView)

一、常用注解

SpringMVC是一个基于Java的Web框架,它提供了一系列的注解来简化开发过程。以下是一些常用的SpringMVC注解:

  1. @Controller: 用于标识一个类为控制器,处理用户请求并返回相应的结果
  2. @RequestMapping:、 用于映射请求URL和处理方法,可以用在类级别和方法级别。在类级别上,可以指定公共的URL前缀,而在方法级别上,可以指定具体的URL路径。
  3. @RequestParam: 用于将请求参数绑定到方法的参数上。可以指定参数的名称、是否必需以及默认值。
  4. @PathVariable: 用于将URL路径中的变量绑定到方法的参数上。可以指定变量的名称和是否必需。
  5. @ResponseBody: 用于将方法的返回值直接写入HTTP响应体中,而不是通过视图解析器进行渲染。
  6. @ModelAttribute:用于将请求参数绑定到方法的参数上,并将其添加到模型中。可以指定参数的名称和是否必需。
  7. @SessionAttributes:用于指定模型中的属性应该存储在会话中,以便在多个请求之间共享。
  8. @Valid:用于启用参数的校验功能,可以与JSR-303/JSR-349标准的注解一起使用。

这些注解只是SpringMVC中的一部分,还有其他很多注解可以用于处理拦截器、异常处理、文件上传等功能。具体使用哪些注解取决于你的需求和项目的架构。

二、参数传递

SLF4J(Simple Logging Facade for Java)是一个为Java应用程序提供日志记录的简单门面(facade)框架。它允许开发人员在应用程序中使用统一的API来记录日志,而无需关心底层日志实现的细节。SLF4J提供了一种灵活的方式来切换不同的日志实现,如Logback、Log4j和java.util.logging等。通过使用SLF4J,开发人员可以在不修改应用程序代码的情况下更改日志记录实现,从而提供了更好的可维护性和灵活性。

pom.xml

xml 复制代码
<log4j2.version>2.9.1</log4j2.version>
<log4j2.disruptor.version>3.2.0</log4j2.disruptor.version>
<slf4j.version>1.7.13</slf4j.version>
 
//-------------------------------------------------
 
<!--4.log日志相关依赖-->
 
<!-- log4j2日志相关依赖 -->
<!-- log配置:Log4j2 + Slf4j -->
<!-- slf4j核心包-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>${slf4j.version}</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>${slf4j.version}</version>
	<scope>runtime</scope>
</dependency>
 
<!--核心log4j2jar包-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-slf4j-impl</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-web</artifactId>
	<version>${log4j2.version}</version>
	<scope>runtime</scope>
</dependency>
 
<!--需要使用log4j2的AsyncLogger需要包含disruptor-->
<dependency>
	<groupId>com.lmax</groupId>
	<artifactId>disruptor</artifactId>
	<version>${log4j2.disruptor.version}</version>
</dependency>

2.1 基础类型+String

haskell 复制代码
package com.xqx.web;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Slf4j
@Controller
@RequestMapping("/param")
public class ParamController {
    
    @RequestMapping("/hello1")
    public String toHello1(Integer bid,String bname){
        log.info("基础类型+String传参:bid:{},bname:{}",bid,bname);
        return "index";
    }

2.2 复杂类型

java 复制代码
@Slf4j
@Controller
@RequestMapping("/param")
    public String hello1(Book book, HttpServletRequest request){
        //servlet参数获取方式
        log.info("复杂类型参数:bname:{},bid:{}",
         		request.getParameter("bid"),
                request.getParameter("bname")
               );
        //复杂传参
        log.info("复杂类型参数:book:{}", book.toString());
        return "index";
    }


2.3 @RequestParam

java 复制代码
	@Slf4j
	@Controller
    @RequestMapping("/hello3")
    public String requestParam(
            @RequestParam String bname,
            @RequestParam(required = false)  Integer bid) {
        log.info("requestParam类型参数 bname:{},bid:{}", bname, bid);
        return "index";
    }

这种参数传递类型,如果不传参会报错

被@RequestParam注解的参数required默认为true表示请求中一定要传入对应的参数,否则会报404错误如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。

2.4.路径传参 @PathVariable

如果我要通过id进行删除某一项可以用PathVariable注释

java 复制代码
    @RequestMapping("/hello4/{bid}")
    public String rjcc(@PathVariable("bid")Integer bid) {
        log.info("PathVariable bid:{}",bid);
        return "index";
    }


2.4 Json数据传参 @RequestBody

在实际开发中运用最多的就是通过Json数据进行传输,SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖。另外推荐使用postman或者apipost/eolink等工具发送请求数据。

xml 复制代码
 <jackson.version>2.9.3</jackson.version>
 
 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${jackson.version}</version>
    </dependency>
java 复制代码
//    能接受json数据,前提导入了Jackson依赖,没有导入Jackson依赖的话那进不了这个方法
    @RequestMapping("/hello6")
    public String RequestBody2(@RequestBody Map map) {
        log.info("RequestBody map:{}",map);
        return "index";
    }

//  不能接受json数据
    @RequestMapping("/hello5")
    public String RequestBody1(Map map) {
        log.info("RequestBody map:{}",map);
        return "index";
    }

2.5 @RequestHeader

@RequestHeader 注解可以用在方法的参数上,用于将指定的请求头的值注入到方法参数中。

java 复制代码
    @RequestMapping("/hello7")
    public String RequestHeader(@RequestHeader("jwt") String  jwt) {
        log.info("RequestHeader jwt:{}",jwt);
        return "index";
    }

三、方法返回值

为了方便模拟效果,借助ResponseUtil工具类,ResponseUtil类提供了一种方便的方式来将对象以文本或JSON格式写入HTTP响应流中,以便在Web应用程序中向客户端返回数据。
ResponseUtil:

java 复制代码
package com.xqx.util;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

public class ResponseUtil {

	public static void write(HttpServletResponse response,Object o)throws Exception{
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println(o.toString());
		out.flush();
		out.close();
	}
	
	public static void writeJson(HttpServletResponse response,Object o)throws Exception{
		ObjectMapper om = new ObjectMapper();
//		om.writeValueAsString(o)代表了json串
		write(response, om.writeValueAsString(o));
	}
}

3.1 void

haskell 复制代码
@Controller
@RequestMapping("/rs")
public class ReturnController {
 
    @RequestMapping("/hello1")
    public void hello1(HttpServletResponse response){
        Map<String,Object> map=new HashMap<>();
        map.put("code",200);
        map.put("msg","成功添加...");
        try {
            ResponseUtil.writeJson(response,map);
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 

3.2 String+model

jsp

html 复制代码
<%--
  Created by IntelliJ IDEA.
  User: 86156
  Date: 2023/9/5
  Time: 15:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
名称:${name}
地址:${address}
</body>
</html>

测试

haskell 复制代码
@Controller
@RequestMapping("/rs")
public class ReturnController {
 
    @RequestMapping("/hello2")
    public String hello2(Model model,
                       HttpServletRequest request){
          model.addAttribute("name","xqx");
          request.setAttribute("address","长沙");
      return "index";
    }
 
}

3.3 ModelAndView

haskell 复制代码
@Controller
@RequestMapping("/rs")
public class ReturnController {
    @RequestMapping("/hello3")
    public ModelAndView hello3(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("xqx","666");
        mv.setViewName("index");
        return mv;
    }

}

jsp

haskell 复制代码
<%--
  Created by IntelliJ IDEA.
  User: 86156
  Date: 2023/9/5
  Time: 17:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
名称:${name}
地址:${address}
评价:${xqx}
</body>
</html>
相关推荐
沙子迷了蜗牛眼40 分钟前
当展示列表使用 URL.createObjectURL 的创建临时图片、视频无法加载问题
java·前端·javascript·vue.js
ganshenml42 分钟前
【Android】 开发四角版本全解析:AS、AGP、Gradle 与 JDK 的配套关系
android·java·开发语言
我命由我1234543 分钟前
Kotlin 运算符 - == 运算符与 === 运算符
android·java·开发语言·java-ee·kotlin·android studio·android-studio
小途软件1 小时前
ssm327校园二手交易平台的设计与实现+vue
java·人工智能·pytorch·python·深度学习·语言模型
alonewolf_991 小时前
Java类加载机制深度解析:从双亲委派到热加载实战
java·开发语言
追梦者1231 小时前
springboot整合minio
java·spring boot·后端
云游1 小时前
Jaspersoft Studio community edition 7.0.3的应用
java·报表
帅气的你1 小时前
Spring Boot 集成 AOP 实现日志记录与接口权限校验
java·spring boot
zhglhy1 小时前
Spring Data Slice使用指南
java·spring
win x2 小时前
Redis 主从复制
java·数据库·redis