• SpringMVC之综合案例


    SpringMVC注解

    1. @Controller: 标记一个类为控制器(处理请求的类),将其作为Spring MVC的组件进行管理。

    2. @RequestMapping: 将请求URL映射到具体的处理方法上。可以用在类级别和方法级别,用于指定URL路径。

    3. @RequestParam: 用于将请求参数绑定到方法的参数上。可以指定参数名和是否必须。

    4. @PathVariable: 用于将URL中的占位符参数绑定到方法的参数上。

    5. @ResponseBody: 将方法的返回值直接写入HTTP响应体中,而不是通过视图解析器进行渲染。

    6. @RequestBody: 将HTTP请求体中的内容绑定到方法的参数上。

    7. @ModelAttribute: 用于将请求参数绑定到模型对象上。

    8. @SessionAttribute: 用于将模型对象存储到会话中,在多个请求之间共享数据。

    9. @Valid: 用于验证模型对象的有效性,配合JSR-303/349标准的注解使用。

    10. @InitBinder: 用于配置WebDataBinder,用于自定义数据绑定和格式化。

    参数传递

    String类型

    基础类型 String 是一种表示文本的数据类型。在许多编程语言中,String 是用来存储和操作文本数据的常见类型。它可以包含任意字符,例如字母、数字、符号等。String 类型通常用于处理用户输入、存储文件内容、构建消息等场景。

    在大多数编程语言中,String 类型是不可变的,这意味着一旦创建了一个字符串,就不能直接修改它的内容。相反,对于字符串的修改通常会返回一个新的字符串。这种不可变性使得字符串更安全,可以避免一些潜在的错误。

    开发人员可以使用一系列的方法来操作字符串,例如连接(concatenation)、截取子串、查找和替换特定的字符等。此外,还可以比较字符串、转换大小写、格式化等。

    1. @RequestMapping("/hello1")
    2. public String toHello1(Integer bid,String bname){
    3. log.info(">>>> 基础类型+String传参:{},{}",bid,bname);
    4. return "index";
    5. }

    String 类型是一种常见的基础数据类型,用于处理文本数据并提供了许多相关的方法和操作。

    index.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. <h1>springmvc 雷猴</h1>
    8. </body>
    9. </html>
     paramController
    1. package com.zhnaghao.web;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. /**
    6. * @author zhnaghao
    7. * @site
    8. * @company s集团
    9. * @create 2023-09-06-21:44
    10. */
    11. @Slf4j
    12. @Controller
    13. @RequestMapping("/param")
    14. public class ParamController {
    15. @RequestMapping("/hello1")
    16. public String index(String bname,Integer bid){
    17. // System.out.println("真的要开始了");
    18. log.info("简单类型参数:bname:{},bid:{}",bname,bid);
    19. return "index";
    20. }
    21. }

     

     复杂类型 
    1. @RequestMapping("/hello2")
    2. public String toHello2(Book book,
    3. HttpServletRequest req,
    4. HttpServletResponse resp,
    5. HttpSession session){
    6. System.out.println(book);
    7. log.info(">>>> HttpServletRequest/HttpServletResponse/HttpSession等等传参:{}", req.getRequestURI());
    8. return "index";
    9. }
    paramController类中添加 
    1. @RequestMapping("/hello2")
    2. public String hello2(Book book, HttpServletRequest request){
    3. // System.out.println("来了");
    4. //servlet参数获取方式
    5. log.info("复杂类型参数:bname:{},bid:{}",
    6. request.getParameter("bname"),
    7. request.getParameter("bid"));
    8. //复杂传参
    9. log.info("复杂类型参数:book:{}",
    10. book.toString());
    11. // fail..error warning info debug
    12. return "index";
    13. }

     

    @RequestParam 
    1. @RequestMapping("/hello4/{bid}")
    2.     public String toHello4(@PathVariable("bid") Integer bid){
    3.         log.info(">>>> 使用@PathVariable注解传递参数:{}", bid);
    4.         return "index";
    5.     }
    paramController
    1. @RequestMapping("/hello3")
    2. public String toHello3(@RequestParam Integer bid,
    3. @RequestParam(required = false,value = "price") Integer bookPrice,
    4. @RequestParam("bookName") String bname){
    5. log.info(">>>> 使用@RequestParam注解传递参数:{},{},{}", bid,bname,bookPrice);
    6. return "index";
    7. }
    @RequestBody
    1. <jackson.version>2.9.3</jackson.version>
    2. <dependency>
    3. <groupId>com.fasterxml.jackson.core</groupId>
    4. <artifactId>jackson-databind</artifactId>
    5. <version>${jackson.version}</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>com.fasterxml.jackson.core</groupId>
    9. <artifactId>jackson-core</artifactId>
    10. <version>${jackson.version}</version>
    11. </dependency>
    12. <dependency>
    13. <groupId>com.fasterxml.jackson.core</groupId>
    14. <artifactId>jackson-annotations</artifactId>
    15. <version>${jackson.version}</version>
    16. </dependency>
     RequestHeader 
    1. 获取请求头中的信息。
    2. @RequestMapping("/hello7")
    3.     public String toHello7(Book book, @RequestBody Map map, @RequestHeader("jwt") String jwt){
    4.         System.out.println(map);
    5.         System.out.println(book);
    6.         System.out.println(jwt);
    7.         return "index";
    8.     }
    1. @RequestMapping("/hello7")
    2. public String hello7(@RequestHeader("jwt") String jwt){
    3. // System.out.println("宝宝");
    4. log.info("@RequestHeader参数:jwt:{}",jwt);
    5. // fail..error warning info debug
    6. return "index";
    7. }
    8. @RequestMapping("/hello8")
    9. public String hello8(Book book,
    10. @RequestBody Map map,
    11. @RequestHeader("jwt") String jwt){
    12. // System.out.println("宝宝");
    13. log.info("Book:Book:{}",book.toString());
    14. log.info("@RequestBody参数:Map:{}",map);
    15. log.info("@RequestHeader参数:jwt:{}",jwt);
    16. // fail..error warning info debug
    17. return "index";
    18. }
    常用请求方法 

    RequestMapping与GetMapping、PostMapping、PutMapping、DeleteMapping

    他们之间的关系为:

    RequestMapping=GetMapping+PostMapping+PutMapping+DeleteMapping

    为什么企业中不用RequestMapping请求方法而用其他四种?

    RequestMapping与GetMapping、PostMapping、PutMapping、DeleteMapping的区别:RequestMapping不安全,且不具备标识意义。

    方法

    1. //查询的请求
    2. @GetMapping
    3. public String type1(){
    4. System.out.println("@GetMapping:对应查询请求");
    5. return "index";
    6. }
    7. //新增的请求
    8. @PostMapping
    9. public String type2(){
    10. System.out.println("@PostMapping:对应新增请求");
    11. return "index";
    12. }
    13. //修改的请求
    14. @PutMapping
    15. public String type3(){
    16. System.out.println("@PutMapping:对应修改请求");
    17. return "index";
    18. }
    19. //删除的请求
    20. @DeleteMapping
    21. public String type4(){
    22. System.out.println("@DeleteMapping:对应删除请求");
    23. return "index";
    24. }
    25. //RequestMapping=GetMapping+PostMapping+PutMapping+DeleteMapping
    26. //RequestMapping不安全,且不具备标识意义

     返回值

    创建ResponseUtil工具类辅助完成测试

    1. package com.zhanghao.utils;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import javax.servlet.http.HttpServletResponse;
    4. import java.io.PrintWriter;
    5. public class ResponseUtil {
    6. public static void write(HttpServletResponse response,Object o)throws Exception{
    7. response.setContentType("text/html;charset=utf-8");
    8. PrintWriter out=response.getWriter();
    9. out.println(o.toString());
    10. out.flush();
    11. out.close();
    12. }
    13. public static void writeJson(HttpServletResponse response,Object o)throws Exception{
    14. ObjectMapper om = new ObjectMapper();
    15. // om.writeValueAsString(o)代表了json串
    16. write(response, om.writeValueAsString(o));
    17. }
    18. }

     创建ReturnController类,测试

    1. package com.zhanghao.web;
    2. import com.zhanghao.utils.ResponseUtil;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.ui.Model;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.ResponseBody;
    7. import org.springframework.web.servlet.ModelAndView;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.util.HashMap;
    11. import java.util.Map;
    12. /**
    13. * @author zhanghao
    14. * @site
    15. * @company s集团
    16. * @create 2023-09-06-21:44
    17. */
    18. @Controller
    19. @RequestMapping("/rs")
    20. public class ReturnController {
    21. @RequestMapping("/test01")
    22. public void Test01(HttpServletResponse response) throws Exception {
    23. Map<String,Object> map = new HashMap<String,Object>();
    24. map.put("id",1);
    25. map.put("午夜","塞尔维亚的舞者");
    26. map.put("舞者","增加成功!!!");
    27. ResponseUtil.writeJson(response,map);
    28. }
    29. @ResponseBody
    30. @RequestMapping("/test02")
    31. public Map Test02(HttpServletResponse response) throws Exception {
    32. Map<String,Object> map = new HashMap<String,Object>();
    33. map.put("id",1);
    34. map.put(" "," ");
    35. map.put("1","增加成功!!!");
    36. return map;
    37. }
    38. @RequestMapping("/test03")
    39. public String Test03() {
    40. return "index02";
    41. }
    42. @RequestMapping("/test04")
    43. public String Test04(
    44. Model model,
    45. HttpServletRequest request) {
    46. model.addAttribute("No1","");
    47. request.setAttribute("No2","");
    48. return "index02";
    49. }
    50. @RequestMapping("/test05")
    51. public ModelAndView Test05() {
    52. ModelAndView modelAndView = new ModelAndView();
    53. modelAndView.addObject("No1","");
    54. modelAndView.addObject("No2","");
    55. modelAndView.setViewName("index02");
    56. return modelAndView;
    57. }
    58. }
    index.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. <h1>123321</h1>
    8. 上句: ${No1}<br>
    9. 下句: ${No2}
    10. </body>
    11. </html>

     void:处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。

     

    页面跳转

    创造一个PathConterller

    1. package com.zhanghao.web;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.ResponseBody;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.util.HashMap;
    7. import java.util.Map;
    8. /**
    9. * @author zhanghao
    10. * @site
    11. * @company s集团
    12. * @create 2023-09-06-21:19
    13. */@Controller
    14. @RequestMapping("/ts")
    15. public class PathConterller {
    16. @ResponseBody
    17. @RequestMapping("/test02")
    18. public Map Test02(HttpServletResponse response) throws Exception {
    19. Map map = new HashMap();
    20. map.put("id",1);
    21. map.put("。");
    22. map.put("。","增加成功!!!");
    23. return map;
    24. }
    25. //返回值中有转发(forward)和重定向(redirect)这两种跳转方式将会绕开视图解析器的前缀和后缀
    26. //转发到(当前类)的某一个方法
    27. @RequestMapping("/Demo01")
    28. public String Demo01(){
    29. System.out.println("请求地址:Demo01");
    30. System.out.println("转发到(当前类)的某一个方法");
    31. return "forward:test02";
    32. }
    33. //转发到(其他类)的某一个方法
    34. @RequestMapping("/Demo02")
    35. public String Demo02(){
    36. System.out.println("请求地址:Demo02");
    37. System.out.println("转发到(其他类)的某一个方法");
    38. return "forward:/rs/test04";
    39. }
    40. //重定向到(其他类)的某一个方法
    41. @RequestMapping("/Demo03")
    42. public String Demo03(){
    43. System.out.println("请求地址:Demo03");
    44. System.out.println("重定向到(其他类)的某一个方法");
    45. return "redirect:test02";
    46. }
    47. //重定向到(其他类)的某一个方法
    48. @RequestMapping("/Demo04")
    49. public String Demo04(){
    50. System.out.println("请求地址:Demo04");
    51. System.out.println("重定向到(其他类)的某一个方法");
    52. return "redirect:/rs/test04";
    53. }
    54. }

     它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。

    总结

    优点:

    1. 轻量级:SpringMVC相对于其他框架来说比较轻量级,不需要依赖很多的第三方库和组件。
    2. 灵活性:SpringMVC采用了灵活、可配置的设计,能够根据项目需求进行定制化配置。
    3. 松耦合:SpringMVC通过使用控制反转(IoC)和依赖注入(DI)等技术,实现了组件之间的松耦合,提高了代码的可维护性和可测试性。
    4. 易于集成:SpringMVC与Spring框架无缝集成,可以很方便地与其他Spring生态系统中的组件进行集成。
    5. 兼容性:SpringMVC支持各种视图技术,如JSP、Freemarker、Velocity等,并且支持RESTful风格的开发。

    缺点:

    1. 学习曲线较陡:对于初学者来说,由于SpringMVC涉及到很多概念和技术,学习曲线较陡,需要一定的时间和精力去理解和掌握。
    2. 配置复杂:由于其灵活性和可配置性,SpringMVC的配置相对复杂,需要熟悉框架的各种配置选项和规则。
    3. 部分功能不完善:相比于其他一些框架,SpringMVC在某些功能方面可能存在一些不完善或者缺失,需要额外的开发工作来实现。
    4. 性能较低:相对于一些性能优化较好的框架来说,SpringMVC的性能可能相对较低,需要进行一定的优化和调整。

    以上是SpringMVC的优点和缺点,根据具体项目需求和开发团队的技术栈选择合适的框架是很重要的。

  • 相关阅读:
    【超简单-Java设计模式2】简单工厂模式
    牛视系统源码,抖音矩阵系统。抖音SEO源码。mmm
    Jenkins简要说明
    别走,这里有一份摸鱼小妙招,别人我不告诉他!
    JavaEE初阶:文件操作 和 IO
    “蔚来杯“2022牛客暑期多校训练营2,签到题GJK
    Spring Boot + BPMN流程管理引擎实践
    Docker搭建RabbitMQ集群
    Nginx源码解析--configure
    WebSocket消息推送
  • 原文地址:https://blog.csdn.net/djssubddbj/article/details/132691301