重生之我在地球当程序员-SpringMVC核心注解以及其他篇

重生之我在地球当程序员-SpringMVC核心注解以及其他篇

本篇主要讲述SpringMVC常见注解的含义以及使用、Rest风格的介绍、请求转发和重定向的区别以及各自的含义,最后是响应的三种类型以及示例

SpringMVC常见注解以及示例

Spring MVC 提供了许多注解来简化 Web 应用程序的开发。以下是一些常见的 Spring MVC 注解以及它们的示例:

@Controller

作用:用于标记一个类作为 Spring MVC 控制器。

示例:

@Controller  
@RequestMapping("/users")  
public class UserController {  
    // ...  
}
@RequestMapping

作用:用于映射请求 URL 到控制器方法。

示例:

@Controller  
@RequestMapping("/users")  
public class UserController {  
  
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)  
    public String getUser(@PathVariable Long id, Model model) {  
        // 模拟从数据库获取用户  
        User user = new User(id, "John Doe");  
        model.addAttribute("user", user);  
        return "user-details"; // 视图名称  
    }  
}

用于定义映射路径,建立请求url和控制层方法之间的对应关系;
(1)注解位置:
a.类上:定义一级映射路径;
b.方法上:定义二级映射路径;
(2)注解属性:
value:用于指定映射路径url。它和 path 属性的作用是一样的。
method:用于指定请求的方式。method = {RequestMethod.POST } 只能处理post请求。 状态码405
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。eg:params = {“username”},表示请求参数必须有 username;
如果没有携带username的参数:前端浏览器400 bad request

@RestController

作用:一个特殊的控制器注解,用于创建 REST 风格的控制器。它结合了 @Controller 和 @ResponseBody 的功能。

示例:

@RestController  
@RequestMapping("/api/users")  
public class UserRestController {  
  
    @GetMapping("/{id}")  
    public User getUser(@PathVariable Long id) {  
        // 模拟从数据库获取用户  
        return new User(id, "John Doe"); // 直接返回对象,自动转换为 JSON  
    }  
}
@RequestParam

作用:使用在方法入参位置,用于指定请求参数名称,将该请求参数绑定到注解参数位置。
属性:name:指定要绑定的请求参数名称;
required:指定请求参数是否必传; true:表明必须提交参数, 没有400
defaultValue:指定当没有传入请求参数时的默认取值;

示例

 @RequestMapping("test1")
    public String test1(@RequestParam(name = "pname",required = true,defaultValue = "李四")String name){
        System.out.println(name);
        return "main";
    }
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping

作用:分别对应 HTTP 协议的 GET、POST、PUT、DELETE、PATCH 请求方法,是 @RequestMapping 的简化形式。

示例(以 @PostMapping 为例):

@RestController  
@RequestMapping("/api/users")  
public class UserRestController {  
  
    @PostMapping  
    public ResponseEntity<?> createUser(@RequestBody User user) {  
        // 模拟保存用户到数据库  
        // ...  
        return new ResponseEntity<>("User created successfully", HttpStatus.CREATED);  
    }  
}
@PathVariable

作用:用于从请求 URL 中提取路径变量的值。

示例

@GetMapping("/users/{userId}")
public ResponseEntity<User> getUserById(@PathVariable Long userId) {
    // 根据 userId 查询用户信息
    User user = userService.getUserById(userId);
    if (user != null) {
        return ResponseEntity.ok(user);
    } else {
        return ResponseEntity.notFound().build();
    }
}

当客户端发送请求 /users/123 时,123 将被绑定到 userId 参数上,方法将会根据该用户 ID 查询用户信息并返回。如果请求的用户 ID 不存在,则会返回 404 Not Found。

@RequestHeader

作用:用于从 HTTP 请求头中获取特定的信息,并将其绑定到方法的参数上。它可以用于获取各种 HTTP 请求头,如 Content-Type、User-Agent、Authorization 等。

@GetMapping("/user-agent")
public String getUserAgent(@RequestHeader("User-Agent") String userAgent) {
    return "User-Agent: " + userAgent;
}

客户端发送请求时,如果请求头中包含 User-Agent,则该值将被绑定到 userAgent 参数上,并返回给客户端

@RequestBody

作用:用于将 HTTP 请求体的内容绑定到方法的参数上,通常用于接收 POST 或 PUT 请求中发送的 JSON 或 XML 格式的数据。它告诉 Spring MVC 框架将请求体的内容转换为指定的 Java 类型,并将其传递给方法的参数。

示例

@PostMapping("/create-user")
public ResponseEntity<String> createUser(@RequestBody User user) {
    // 处理接收到的用户数据
    userService.createUser(user);
    return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully");
}

用于方法入参位置,获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用。通常用于将json格式字符串绑定到bean对象中;

@ModelAttribute

作用:用于绑定请求参数到命令对象(通常是 JavaBean),也可以将对象添加到模型中,以便在视图页面中使用。

示例:

@Controller  
public class UserFormController {  
  
    @ModelAttribute("user")  
    public User populateUser() {  
        return new User(); // 在每次请求处理之前都会调用此方法,并将返回的 User 对象添加到模型中  
    }  
  
    @PostMapping("/submit")  
    public String processSubmit(@ModelAttribute("user") User user) {  
        // 处理提交的表单数据  
        // ...  
        return "result"; // 视图名称  
    }  
}

该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。

@SessionAttributes

作用:用于将模型中的数据存储在 HTTP 会话中,以便在多个请求之间共享。

示例:

@Controller  
@SessionAttributes("user") // 将名为 "user" 的属性存储在会话中  
public class UserSessionController {  
  
    // ...  
  
    @GetMapping("/show")  
    public String showUser(@ModelAttribute("user") User user, Model model) {  
        // 从会话中获取 user 属性,并添加到模型中(如果需要的话)  
        // ...  
        return "user-session"; // 视图名称  
    }  
}
@CookieValue:

用于方法入参位置,把指定 cookie 名称的值传入控制器方法参数。

示例

//1 : 获得所有的cookie 
//2:  cookie
//3   getName("JSESSIONID") -value

//使用CookieValue注解获取到Cookie的值
@RequestMapping("test5")
  public String test5(@CookieValue("JSESSIONID") String data){
      System.out.println(data);
      return "main";
  }

//还可以使用CookieValue注解,获取到Cookie对象
@InitBinder

作用:用于自定义数据绑定过程,例如设置日期格式、字符串处理等。

示例:

@Controller  
public class CustomBindingController {  
  
    @InitBinder  
    public void initBinder(WebDataBinder binder) {  
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
        dateFormat.setLenient(false);  
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));  
    }  
  
    // ...  
}
@ExceptionHandler

作用:用于处理控制器中发生的异常,并指定一个方法来处理这些异常。

示例:

@Controller  
public class UserController {  
  
    // ...  
  
    @GetMapping("/{id}")  
    public String getUser(@PathVariable Long id, Model model) {  
        // 假设这里可能会抛出UserNotFoundException  
        User user = userService.getUserById(id);  
        if (user == null) {  
            throw new UserNotFoundException("User not found with id: " + id);  
        }  
        model.addAttribute("user", user);  
        return "user-details";  
    }  
  
    @ExceptionHandler(UserNotFoundException.class)  
    public String handleUserNotFound(UserNotFoundException ex, Model model) {  
        model.addAttribute("errorMessage", ex.getMessage());  
        return "error"; // 视图名称,通常用于显示错误信息  
    }  
}  
  
// 自定义异常类  
class UserNotFoundException extends RuntimeException {  
    public UserNotFoundException(String message) {  
        super(message);  
    }  
}

在上面的示例中,如果 getUser 方法中的 userService.getUserById(id) 找不到对应的用户,则会抛出一个 UserNotFoundException。由于我们在 UserController 中定义了一个 @ExceptionHandler 方法来处理这个异常,所以当这个异常被抛出时,Spring MVC 会自动调用 handleUserNotFound 方法来处理它,并将异常信息添加到模型中,然后跳转到 error 视图来显示错误信息。

这些就是 Spring MVC 中一些常见的注解及其示例。这些注解可以大大简化 Web 应用程序的开发过程,并提高代码的可读性和可维护性。

Rest风格

介绍

REST(Representational State Transfer)是一种基于网络的软件架构风格,它通常用于构建分布式系统和 Web 服务。REST 风格的 URL 设计是 REST 架构风格的重要组成部分之一,它遵循一些规范和最佳实践,以确保 URL 具有清晰、易读和可维护的特性。

比较

(1)、传统请求url:
新增:http://localhost:8888/annotation/addPerson POST
修改:http://localhost:8888/annotation/updatePerson POST
删除:http://localhost:8888/annotation/deletePerson?id=1 GET
查询:http://localhost:8888/annotation/findPerson?id=1 GET
(2)、REST风格请求:
新增:http://localhost:8888/annotation/person POST
修改:http://localhost:8888/annotation/person PUT
删除:http://localhost:8888/annotation/person/1 DELETE
查询:http://localhost:8888/annotation/person/1 GET

转发和重定向以及区别

forward请求转发
控制器代码:
 @RequestMapping("test4")
    public String test4(){
        System.out.println("我是请求转发");
        return "forward:/response/test1";
    }

redirect重定向
控制器代码:
  @RequestMapping("test5")
    public String test5(RedirectAttributes redirectAttributes,String pname){
        System.out.println("我是重定向");
       // redirectAttributes.addAttribute("pname",pname);
        redirectAttributes.addFlashAttribute("pname",pname);
        return "redirect:/response/test1";
    }


注意:重定向携带参数,需要使用对象RedirectAttributes,该对象提供两个方法封装参数addAttribute()和addFlashAttribute(),第一个方法参数会明文显示在浏览器地址栏,第二个方法参会会隐藏,使用第二种方法传参时,获取参数时需要加注解@ModelAttribute;

区别
转发(Forwarding):
  • 转发是指在服务器内部将请求转发给另一个资源进行处理,客户端对此一无所知。在转发过程中,客户端浏览器只发起了一次请求,但是服务器会将请求转发给其他资源,并且将响应返回给客户端。
  • 转发是服务器端的操作,客户端浏览器不会感知到转发的存在,因此地址栏中的 URL 不会发生改变。
  • 转发可以用于将请求发送给另一个 Servlet、JSP 页面或者其他资源,以便进行进一步的处理或者生成动态内容。
重定向(Redirection):
  • 重定向是指服务器返回一个特殊的响应码(如 301 永久重定向或者 302 临时重定向),告诉客户端浏览器应该重新发送请求到另一个 URL。
  • 重定向是由客户端浏览器发起的,它会收到服务器返回的重定向响应后,根据响应中的新 URL 发起新的请求。
  • 重定向会导致客户端浏览器地址栏中显示新的 URL,因为浏览器会自动跳转到重定向后的地址。

总的来说,转发是在服务器内部进行的资源跳转,对客户端浏览器是透明的;而重定向是由客户端浏览器发起的跳转,会导致地址栏中的 URL 发生变化。选择使用转发还是重定向取决于具体的需求和场景,例如如果需要保持地址栏不变并且将请求发送到另一个资源进行处理,则可以选择转发;如果需要告知客户端浏览器请求的资源已经被移到了其他 URL,则可以选择重定向。

方法的返回值类型

返回值分类
返回值为字符串
用于指定返回的逻辑视图名称;
/*
        返回值类型为字符串String,表示返回的视图名称
        根据三个基本点中的视图解析器,得到一个对应的视图,来进行跳转,完成响应!默认是请求转发
    */
    @RequestMapping("test")
    public String test(Map<String, Object> map) {
        /*
            响应数据
                Model
                    model.addAttribute("关键字", Object类型的值) 默认是request域对象存储
                ModelMap
                    map.addAttribute("关键字", Object类型的值) 默认是request域对象存储
                Map集合
                    存储在Map集合中的数据,也可以响应给页面
         */
        //model.addAttribute("username", "点赞");
        //map.addAttribute("username", "收藏");
        map.put("username", "关注");
        return "success";
    }

void类型
/*通常使用原始servlet处理请求时,返回该类型;
或者异步返回数据时,使用void返回值,不进行路径跳转
控制器代码:
*/
 @RequestMapping("test2")
    public void test2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("返回void类型测试点赞收藏关注");
        request.getRequestDispatcher("/response/test1").forward(request,response);
    }
7.1.3 ModelAndView
用于绑定参数和指定返回视图名称;
控制器代码:
  @RequestMapping("test3")
    public ModelAndView test3(ModelAndView modelAndView){
        modelAndView.addObject("action","guanzhu");
        modelAndView.setViewName("main");
        return modelAndView;
    }
  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值