目录
前言
一、常用注解
二、参数传递
编辑
1. 基础类型+String类型
2. 复杂类型
3. @RequestParam
4. @PathVariable
5.@RequestBody
6. @RequestHeader
三、方法返回值
一:void
二:String
三:String+model
四:ModelAndView
四、页面跳转
在上一篇的博客中我们初步的了解学习SpringMVC基础知识,我们继续来学习SpringMVC常用注解、参数传递、返回值,希望这篇博客能够帮助到您!!!
一、SpringMVC之常用注解
1.Controller:用于标识一个类是SpringMVC的控制器,它接收用户请求并返回相应的视图或数据。2.RequestMapping:用于映射请求的URL路径到控制器的处理方法。可以在类级别和方法级别使用,用于处理各种HTTP请求(GET、POST、PUT等)。
标注在方法上
用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法
@Controller public class HelloController { @RequestMapping("/requestTest") public String requestTest(){ return "index"; } }
标注在类和方法上
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。注意:当你在类上添加RequestMapping注解后,如果要请求映射,就意味着请求要先映射到标注类的位置,然后再映射到该类的方法上
@Controller @RequestMapping("/hello") public class HelloController { @RequestMapping("/requestTest") public String requestTest(){ return "index"; } }
3.RequestParam:用于将请求参数绑定到处理方法的参数上。可以指定参数的名称、是否必须以及默认值。
4.PathVariable:用于将URL中的占位符参数绑定到处理方法的参数上。通常用于RESTful风格的URL。
5.ResponseBody:用于将方法的返回值直接作为HTTP响应的内容返回给客户端。适用于返回JSON、XML等非HTML格式的数据。
6.ModelAttribute:用于将请求参数绑定到一个对象上,并将该对象添加到模型中,可以在视图中获取。
7.RequestHeader:注解可以获取指定的请求头信息。
8.CookieValue:主要是将请求的Cookie数据,映射到功能处理方法的参数上。
具体操作
1.将pom.xml文件中原有的log4j的插件依赖替换为Slf4j的插件依赖
替换 pom.xml文件,(这里全部替换,未免大家copy错)
4.0.0
com.yx
yx_ssm
1.0-SNAPSHOT
war
yx_ssm Maven Webapp
http://www.example.com
UTF-8
1.8
1.8
3.7.0
5.0.2.RELEASE
3.4.5
5.1.44
5.1.2
1.3.1
2.1.1
2.4.3
2.9.1
3.2.0
1.7.13
4.12
4.0.0
1.18.2
1.2
1.1.2
5.0.2.RELEASE
org.springframework
spring-context
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
mysql
mysql-connector-java
${mysql.version}
com.github.pagehelper
pagehelper
${pagehelper.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
org.apache.commons
commons-dbcp2
${commons.dbcp2.version}
org.apache.commons
commons-pool2
${commons.pool2.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
jcl-over-slf4j
${slf4j.version}
runtime
org.apache.logging.log4j
log4j-api
${log4j2.version}
org.apache.logging.log4j
log4j-core
${log4j2.version}
org.apache.logging.log4j
log4j-slf4j-impl
${log4j2.version}
org.apache.logging.log4j
log4j-web
${log4j2.version}
runtime
com.lmax
disruptor
${log4j2.disruptor.version}
junit
junit
${junit.version}
test
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.projectlombok
lombok
${lombok.version}
provided
junit
junit
4.12
compile
org.springframework
spring-webmvc
${spring.version}
jstl
jstl
${jstl.version}
taglibs
standard
${standard.version}
yx_ssm
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
org.apache.maven.plugins
maven-compiler-plugin
${maven.compiler.plugin.version}
${maven.compiler.target}
${project.build.sourceEncoding}
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
${mysql.version}
true
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
测试插件是否成功安装
配置运行项目
测试代码
package com.lya.web;
import com.lya.model.Book;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author 程序猿-小李哥
* @site www.xiaolige.com
* @company 猪八戒有限集团
* @create 2023-09-05-15:50
*/
@Slf4j
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/hello1")
public String index(Integer bid ,String bname) {
log.info("简单参数:bid:{},bname:{} ",bid,bname);
return "index";
}
}
测试代码
@RequestMapping("/hello2")
public String hello2(Book book , HttpServletRequest httpServletRequest) {
log.info("复杂参数:bid:{},bname:{} ",
httpServletRequest.getParameter("bid"),
httpServletRequest.getParameter("bname"));
log.info("复杂参数:book:{} ",
book.toString());
return "index";
}
测试代码
@RequestMapping("/hello3")
public String toHello3(@RequestParam Integer bid,
@RequestParam(required = false,value = "price") Integer bookPrice,
@RequestParam("bookName") String bname){
log.info(">>>> 使用@RequestParam注解传递参数:{},{},{}", bid,bname,bookPrice);
return "index";
}
控制台输出
不会输出任何结果。
注:@RequestParam的required属性
该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
测试代码
@RequestMapping("/hello4/{bid}")
public String toHello4(@PathVariable("bid") Integer bid){
log.info(">>>> 使用@PathVariable注解传递参数:{}", bid);
return "index";
}
导入@RequestBody依赖
2.9.3
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
测试代码
@RequestMapping("/hello5")
public String toHello5(@RequestBody Map map){
System.out.println(map);
return "index";
}
请使用postman或者apipost/eolink等工具发送请求数据。因为浏览器无法携带集合参数,所以借助第三方软件进行测试。
测试代码
@RequestMapping("/hello7")
public String toHello7(Book book, @RequestBody Map map, @RequestHeader("jwt") String jwt){
System.out.println(map);
System.out.println(book);
System.out.println(jwt);
return "index";
}
创建一个ReturnController类模拟测试案例
借助工具类
package com.lya.untils;
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();
write(response, om.writeValueAsString(o));
}
}
代码
package com.lya.web;
import com.lya.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* @author 程序猿-小李哥
* @site www.xiaolige.com
* @company 猪八戒有限集团
* @create 2023-09-06-15:50
*/
@Controller
@RequestMapping("/rs")
public class ReturnController {
@RequestMapping("/hello1")
public void hello1(HttpServletResponse response){
Map map=new HashMap<>();
map.put("code",200);
map.put("msg","成功添加...");
try {
ResponseUtil.writeJson(response,map);
} catch (Exception e) {
e.printStackTrace();
}
}
}
该返回值类型在前面的参数传递中已经体现了。
<%--
Created by IntelliJ IDEA.
User: 86158
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" %>
Title
Hello
名称:${name}
地址:${address}
测试代码
package com.lya.web;
import com.lya.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* @author 程序猿-小李哥
* @site www.xiaolige.com
* @company 猪八戒有限集团
* @create 2023-09-06-16:50
*/
@Controller
@RequestMapping("/rs")
public class ReturnController {
@RequestMapping("/hello2")
public String hello2(Model model,
HttpServletRequest request){
model.addAttribute("name","刘彬彬");
request.setAttribute("address","傻鸟");
return "index";
}
}
测试代码
package com.lya.web;
import com.lya.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* @author 程序猿-小李哥
* @site www.xiaolige.com
* @company 猪八戒有限集团
* @create 2023-09-05-15:50
* 测试类
*/
@Controller
@RequestMapping("/rs")
public class ReturnController {
@RequestMapping("/hello3")
public ModelAndView hello3(){
ModelAndView mv=new ModelAndView();
mv.addObject("sign","耗子没有摸鱼");
mv.setViewName("index");
return mv;
}
}
转发(forward:path)和重定向(redirect:path)这两种跳转方式将会绕开视图解析器的前缀和后缀;还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。
path为请求处理方法名,而非逻辑视图名。
转发(地址栏不变)
@RequestMapping("/helloPage1") public String toHelloPage1(){ System.out.println("helloPage1"); return "forward:toHello2"; }
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。
重定向(地址栏改变)
@RequestMapping("/helloPage2")
public String toHelloPage2(){
System.out.println("helloPage2");
return "redirect:toHello2";
}
它相当于“response.sendRedirect(url)”。需要注意的是,如果重定向到jsp页面,则jsp页面不能写在WEB-INF目录中,否则无法找到。
跳其它的controller
@RequestMapping("/helloPage3")
public String toHelloPage3(){
System.out.println("helloPage3");
return "forward:/demo/hello";
}
@RequestMapping("/helloPage4")
public String toHelloPage4(){
System.out.println("helloPage4");
return "redirect:/demo/hello";
}