SpringMVC注解
- @Controller: 标记一个类为控制器(处理请求的类),将其作为Spring MVC的组件进行管理。
- @RequestMapping: 将请求URL映射到具体的处理方法上。可以用在类级别和方法级别,用于指定URL路径。
- @RequestParam: 用于将请求参数绑定到方法的参数上。可以指定参数名和是否必须。
- @PathVariable: 用于将URL中的占位符参数绑定到方法的参数上。
- @ResponseBody: 将方法的返回值直接写入HTTP响应体中,而不是通过视图解析器进行渲染。
- @RequestBody: 将HTTP请求体中的内容绑定到方法的参数上。
- @ModelAttribute: 用于将请求参数绑定到模型对象上。
- @SessionAttribute: 用于将模型对象存储到会话中,在多个请求之间共享数据。
- @Valid: 用于验证模型对象的有效性,配合JSR-303/349标准的注解使用。
- @InitBinder: 用于配置WebDataBinder,用于自定义数据绑定和格式化。
参数传递
String类型
基础类型 String 是一种表示文本的数据类型。在许多编程语言中,String 是用来存储和操作文本数据的常见类型。它可以包含任意字符,例如字母、数字、符号等。String 类型通常用于处理用户输入、存储文件内容、构建消息等场景。
在大多数编程语言中,String 类型是不可变的,这意味着一旦创建了一个字符串,就不能直接修改它的内容。相反,对于字符串的修改通常会返回一个新的字符串。这种不可变性使得字符串更安全,可以避免一些潜在的错误。
开发人员可以使用一系列的方法来操作字符串,例如连接(concatenation)、截取子串、查找和替换特定的字符等。此外,还可以比较字符串、转换大小写、格式化等。
@RequestMapping("/hello1") public String toHello1(Integer bid,String bname){ log.info(">>>> 基础类型+String传参:{},{}",bid,bname); return "index"; }
String 类型是一种常见的基础数据类型,用于处理文本数据并提供了许多相关的方法和操作。
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>springmvc 雷猴</h1> </body> </html>
paramController
package com.zhnaghao.web; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author zhnaghao * @site * @company s集团 * @create 2023-09-06-21:44 */ @Slf4j @Controller @RequestMapping("/param") public class ParamController { @RequestMapping("/hello1") public String index(String bname,Integer bid){ // System.out.println("真的要开始了"); log.info("简单类型参数:bname:{},bid:{}",bname,bid); return "index"; } }
复杂类型
@RequestMapping("/hello2") public String toHello2(Book book, HttpServletRequest req, HttpServletResponse resp, HttpSession session){ System.out.println(book); log.info(">>>> HttpServletRequest/HttpServletResponse/HttpSession等等传参:{}", req.getRequestURI()); return "index"; }
paramController类中添加
@RequestMapping("/hello2") public String hello2(Book book, HttpServletRequest request){ // System.out.println("来了"); //servlet参数获取方式 log.info("复杂类型参数:bname:{},bid:{}", request.getParameter("bname"), request.getParameter("bid")); //复杂传参 log.info("复杂类型参数:book:{}", book.toString()); // fail..error warning info debug return "index"; }
@RequestParam
@RequestMapping("/hello4/{bid}") public String toHello4(@PathVariable("bid") Integer bid){ log.info(">>>> 使用@PathVariable注解传递参数:{}", bid); return "index"; }
paramController
@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"; }
@RequestBody
<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>
RequestHeader
获取请求头中的信息。 @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"; }
@RequestMapping("/hello7") public String hello7(@RequestHeader("jwt") String jwt){ // System.out.println("宝宝"); log.info("@RequestHeader参数:jwt:{}",jwt); // fail..error warning info debug return "index"; } @RequestMapping("/hello8") public String hello8(Book book, @RequestBody Map map, @RequestHeader("jwt") String jwt){ // System.out.println("宝宝"); log.info("Book:Book:{}",book.toString()); log.info("@RequestBody参数:Map:{}",map); log.info("@RequestHeader参数:jwt:{}",jwt); // fail..error warning info debug return "index"; }
常用请求方法
RequestMapping与GetMapping、PostMapping、PutMapping、DeleteMapping
他们之间的关系为:
RequestMapping=GetMapping+PostMapping+PutMapping+DeleteMapping
为什么企业中不用RequestMapping请求方法而用其他四种?
RequestMapping与GetMapping、PostMapping、PutMapping、DeleteMapping的区别:RequestMapping不安全,且不具备标识意义。
方法
//查询的请求 @GetMapping public String type1(){ System.out.println("@GetMapping:对应查询请求"); return "index"; } //新增的请求 @PostMapping public String type2(){ System.out.println("@PostMapping:对应新增请求"); return "index"; } //修改的请求 @PutMapping public String type3(){ System.out.println("@PutMapping:对应修改请求"); return "index"; } //删除的请求 @DeleteMapping public String type4(){ System.out.println("@DeleteMapping:对应删除请求"); return "index"; } //RequestMapping=GetMapping+PostMapping+PutMapping+DeleteMapping //RequestMapping不安全,且不具备标识意义
返回值
创建ResponseUtil工具类辅助完成测试
package com.zhanghao.utils; 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)); } }
创建ReturnController类,测试
package com.zhanghao.web; import com.zhanghao.utils.ResponseUtil; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; 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 zhanghao * @site * @company s集团 * @create 2023-09-06-21:44 */ @Controller @RequestMapping("/rs") public class ReturnController { @RequestMapping("/test01") public void Test01(HttpServletResponse response) throws Exception { Map<String,Object> map = new HashMap<String,Object>(); map.put("id",1); map.put("午夜","塞尔维亚的舞者"); map.put("舞者","增加成功!!!"); ResponseUtil.writeJson(response,map); } @ResponseBody @RequestMapping("/test02") public Map Test02(HttpServletResponse response) throws Exception { Map<String,Object> map = new HashMap<String,Object>(); map.put("id",1); map.put(" "," "); map.put("1","增加成功!!!"); return map; } @RequestMapping("/test03") public String Test03() { return "index02"; } @RequestMapping("/test04") public String Test04( Model model, HttpServletRequest request) { model.addAttribute("No1",""); request.setAttribute("No2",""); return "index02"; } @RequestMapping("/test05") public ModelAndView Test05() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("No1",""); modelAndView.addObject("No2",""); modelAndView.setViewName("index02"); return modelAndView; } }
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>123321</h1> 上句: ${No1}<br> 下句: ${No2} </body> </html>
void:处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。
页面跳转
创造一个PathConterller
package com.zhanghao.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; /** * @author zhanghao * @site * @company s集团 * @create 2023-09-06-21:19 */@Controller @RequestMapping("/ts") public class PathConterller { @ResponseBody @RequestMapping("/test02") public Map Test02(HttpServletResponse response) throws Exception { Map<String,Object> map = new HashMap<String,Object>(); map.put("id",1); map.put("。"); map.put("。","增加成功!!!"); return map; } //返回值中有转发(forward)和重定向(redirect)这两种跳转方式将会绕开视图解析器的前缀和后缀 //转发到(当前类)的某一个方法 @RequestMapping("/Demo01") public String Demo01(){ System.out.println("请求地址:Demo01"); System.out.println("转发到(当前类)的某一个方法"); return "forward:test02"; } //转发到(其他类)的某一个方法 @RequestMapping("/Demo02") public String Demo02(){ System.out.println("请求地址:Demo02"); System.out.println("转发到(其他类)的某一个方法"); return "forward:/rs/test04"; } //重定向到(其他类)的某一个方法 @RequestMapping("/Demo03") public String Demo03(){ System.out.println("请求地址:Demo03"); System.out.println("重定向到(其他类)的某一个方法"); return "redirect:test02"; } //重定向到(其他类)的某一个方法 @RequestMapping("/Demo04") public String Demo04(){ System.out.println("请求地址:Demo04"); System.out.println("重定向到(其他类)的某一个方法"); return "redirect:/rs/test04"; } }
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。
总结
优点:
- 轻量级:SpringMVC相对于其他框架来说比较轻量级,不需要依赖很多的第三方库和组件。
- 灵活性:SpringMVC采用了灵活、可配置的设计,能够根据项目需求进行定制化配置。
- 松耦合:SpringMVC通过使用控制反转(IoC)和依赖注入(DI)等技术,实现了组件之间的松耦合,提高了代码的可维护性和可测试性。
- 易于集成:SpringMVC与Spring框架无缝集成,可以很方便地与其他Spring生态系统中的组件进行集成。
- 兼容性:SpringMVC支持各种视图技术,如JSP、Freemarker、Velocity等,并且支持RESTful风格的开发。
缺点:
- 学习曲线较陡:对于初学者来说,由于SpringMVC涉及到很多概念和技术,学习曲线较陡,需要一定的时间和精力去理解和掌握。
- 配置复杂:由于其灵活性和可配置性,SpringMVC的配置相对复杂,需要熟悉框架的各种配置选项和规则。
- 部分功能不完善:相比于其他一些框架,SpringMVC在某些功能方面可能存在一些不完善或者缺失,需要额外的开发工作来实现。
- 性能较低:相对于一些性能优化较好的框架来说,SpringMVC的性能可能相对较低,需要进行一定的优化和调整。
- 以上是SpringMVC的优点和缺点,根据具体项目需求和开发团队的技术栈选择合适的框架是很重要的。