0


深入理解Web注解:解析常用注解及其应用场景

一、web介绍

Web(World Wide Web)是由英国物理学家蒂姆·伯纳斯-李于1989年发明的一个基于互联网的信息系统,也是互联网最为知名和常用的应用之一。它通过一种名为超文本传输协议(HTTP)的协议来传输数据,并且使用统一资源定位符(URL)来标识网络上的资源。

Web的基本组成部分包括网页(web pages)、超链接(hyperlinks)和浏览器(browser)。网页通常采用HTML(Hypertext Markup Language)编写,其中包含文本、图像、视频、音频等内容。超链接则可以将不同的网页相互连接起来,使得用户可以方便地跳转浏览不同的内容。浏览器是用来访问和显示网页的软件,用户可以通过浏览器输入URL来请求特定的网页,并且点击超链接以跳转到其他网页。

除了静态的网页内容外,现代的Web还支持动态网页和交互式Web应用程序。动态网页可以根据用户的请求或其他条件生成不同的内容,而交互式Web应用程序能够与用户进行实时的交互和数据交换,从而提供更加丰富和便捷的功能。

二、注解

@Override这是Java语言中的一个注解,用于在子类中重写父类的方法。在Web开发中,可以使用此注解来确保方法的正确覆盖@Entity这是JPA(Java Persistence API)中的一个注解,用于表示一个实体类,即映射到数据库表中的对象。在Web开发中,使用@Entity注解将Java类映射为数据库表,方便进行持久化操作。@Data这是Lombok库中的一个注解,用于自动生成Java类的常用方法(如getter、setter、toString等)。在Web开发中,可以使用@Data注解来简化实体类的定义。@Transient这是JPA中的一个注解,用于指示某个字段不需要被持久化到数据库。在Web开发中,有些字段可能只是用于临时计算或展示,并不需要存储到数据库中,通过@Transient注解可以排除这些字段。@ManyToOne这是JPA中的一个注解,用于建立多对一的关系映射。在Web开发中,当实体类之间存在多对一的关系时(即一个实体对象关联多个其他实体对象),可以使用@ManyToOne注解来定义关系映射。@OneToMany表示关联关系中的一端,即一个实体对象对应多个实体对象的关系。在JPA中使用,表示一个实体对象对应多个实体对象的关系。这个注解常用于关系表的实现。@NoArgsConstructor表示无参构造函数。在类定义中添加该注解可以自动生成无参构造函数,方便代码编写。@MappedSuperclass表示该类是一个映射的超类,在JPA中使用,不会生成对应的数据库表,但是子类可以继承该类的属性和方法。这个注解常用于实现公共属性或方法的复用。@GeneratedValue表示主键策略,用于指定主键生成策略,例如自增长、UUID等。@GenericGenerator@GenericGenerator是Hibernate框架所提供的一个注解。它用于定义实体类的主键生成策略,它可以与@Id注解一起使用,用于标记实体类的主键字段或属性。通过@GenericGenerator注解,我们可以指定主键生成策略的名称、生成器类以及其他参数。常见的生成策略包括UUID、雪花算法等。@GeneratedValue@GeneratedValue 注解通常与 @Id 注解一起使用,用于指定实体类的主键生成策略。它可以应用于数据库表的主键字段,并由 JPA 框架自动处理主键的生成。@Column表示该字段与数据库表中的列之间的映射关系,在JPA中使用,可以指定列名、数据类型、长度、是否允许为空等属性。@Table表示该类与数据库表之间的映射关系,在JPA中使用,可以指定表名、索引等属性。@Temporal表示时间类型的映射,在JPA中使用,可以将Java的Date、Calendar等时间类型映射到数据库中的日期或时间类型。@RestControllerAdvice表示全局异常处理器,用于处理控制器抛出的异常。在类定义上添加该注解,然后在类中编写异常处理方法即可。@ExceptionHandler表示异常处理方法,在控制器中使用,用于处理特定异常类型的异常。@Service表示服务层组件,在MVC架构中使用,用于处理业务逻辑。@Autowired表示依赖注入,在MVC架构中使用,自动装配一个组件或Bean。@Component表示普通组件,在Spring框架中使用,表示一个普通的JavaBean。@Value表示属性值,用于注入配置文件中的属性值。@RestController表示RESTful风格的控制器,在MVC架构中使用,用于处理HTTP请求和响应。@RequestMapping表示请求映射,在控制器中使用,用于指定URL路径与控制器方法之间的对应关系。
@PostMapping:表示POST请求映射,在控制器中使用,用于指定POST请求的URL路径。@GetMapping表示GET请求映射,在控制器中使用,用于指定GET请求的URL路径。@Getter表示生成getter方法,在类定义中添加该注解可以自动生成getter方法,@Setter表示生成setter方法,在类定义中添加该注解可以自动生成setter方法,@SpringBootApplication@SpringBootApplication注解是Spring Boot框架中的核心注解之一,用于标识一个主程序类,并且启用了自动配置和组件扫描。

三、注解的简单的示例代码

1、常用注解示例

import javax.persistence.*;
import lombok.*;

@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Transient
    private int age;
}

@Entity
@Table(name = "projects")
@Data
@NoArgsConstructor
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

@RestControllerAdvice
public class ExceptionHandlerAdvice {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error");
    }
}

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

@Component
public class MyComponent {
    @Value("${my.property}")
    private String myProperty;
}

@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getUsers() {
        return userService.getAllUsers();
    }
}

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

上述代码中,我们定义了一个简单的用户(

User

)和项目(

Project

)实体类,使用

@Entity

注解将它们标记为实体类,并指定了数据库表的映射关系。同时,通过

@Data

注解自动生成了 getter、setter 等方法(@Data 注解使用 Lombok 工具自动生成类的 getter、setter 方法,以及 toString、equals、hashCode 等方法==@Getter、@Setter)。

  • User 类中,我们使用了 @Transient 注解标记了一个字段,表示该字段不需要被持久化到数据库中。
  • Project 类中,我们使用了 @ManyToOne@OneToMany 注解定义了多对一和一对多的关联关系。
  • ExceptionHandlerAdvice 类中,我们使用了 @RestControllerAdvice@ExceptionHandler 注解来实现全局异常处理。
  • UserService 类中,我们使用了 @Service@Autowired 注解来标识该类为服务层组件,并进行依赖注入。
  • MyComponent 类中,我们使用了 @Component@Value 注解来将该类标记为 Spring 组件,并从配置文件中获取属性值。
  • UserController 类中,我们使用了 @RestController@RequestMapping@GetMapping 注解来定义 RESTful 风格的控制器和请求路径。

最后,在

MyApp

类中,我们使用了

@SpringBootApplication

注解启动了一个 Spring Boot 应用程序。

注意:上述示例代码仅用于演示各个注解的使用方式,并不包含完整的实现逻辑。实际应用中,可能还需要添加其他必要的代码和配置。

2、@RequestParam和@RequestBody注解的简单代码示例:

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        // 根据用户ID查询数据库中的用户信息
        User user = userService.getUserById(id);
        if (user == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(user);
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // 创建新用户
        User createdUser = userService.createUser(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
    }

    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
        // 更新用户信息
        User updatedUser = userService.updateUser(id, user);
        if (updatedUser == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(updatedUser);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        // 删除用户
        boolean deleted = userService.deleteUser(id);
        if (deleted) {
            return ResponseEntity.noContent().build();
        }
        return ResponseEntity.notFound().build();
    }
}

上述代码中,我们定义了一个

UserController

类来处理用户相关的请求。在

getUserById()

方法中,通过使用

@PathVariable

注解将URL路径中的

id

参数映射到方法的参数上,从而获取特定的用户信息。

  • createUser()updateUser()方法中,我们使用@RequestBody注解将POST请求体中的JSON数据反序列化为User对象。这样可以方便地处理复杂的用户信息。
  • deleteUser()方法中,使用了@PathVariable注解获取URL路径中的id参数,并根据该参数删除相应的用户。

这些示例代码演示了如何使用@RequestParam和@RequestBody注解来处理不同类型的请求参数。

注意:这只是一个简单的示例,实际应用中可能还需添加其他的业务逻辑、错误处理等。

四、自定义错误异常

首先,创建一个自定义的异常类,例如

CustomException

public class CustomException extends RuntimeException {
    private HttpStatus status;
    private String message;

    public CustomException(HttpStatus status, String message) {
        this.status = status;
        this.message = message;
    }

    public HttpStatus getStatus() {
        return status;
    }

    public String getMessage() {
        return message;
    }
}

然后,在控制器中使用

@ExceptionHandler

注解来捕获并处理抛出的自定义异常:

@RestController
public class MyController {

    @GetMapping("/example")
    public void example() {
        // 模拟抛出自定义异常
        throw new CustomException(HttpStatus.BAD_REQUEST, "自定义错误消息");
    }

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getStatus().value(), ex.getMessage());
        return new ResponseEntity<>(errorResponse, ex.getStatus());
    }
}

在上述代码中,

example()

方法模拟处理某个请求时发生错误,并抛出了自定义异常

CustomException

handleCustomException()

方法使用

@ExceptionHandler

注解来处理

CustomException

类型的异常,并返回一个自定义的错误响应

ErrorResponse

ErrorResponse

是一个简单的包含错误码和错误消息的数据类:

public class ErrorResponse {
    private int code;
    private String message;

    public ErrorResponse(int code, String message) {
        this.code = code;
        this.message = message;
    }

    // 省略 getter 和 setter 方法
}

最后,在响应时,可以返回一个包含错误信息的 JSON 响应体,例如:

{
  "code": 400,
  "message": "自定义错误消息"
}

这样,当请求

/example

时发生异常,将会触发

handleCustomException()

方法处理,并返回自定义的错误响应。

注意:这只是一个简单的示例,实际场景中可能需要根据具体需求进行调整和扩展。

五、web总结

  1. 构成:Web由客户端和服务器端组成。客户端通常是用户使用的浏览器软件,而服务器端则是存储和提供网页和其他资源的计算机系统。
  2. 基本原理:Web使用HTTP(Hypertext Transfer Protocol)协议进行通信。用户通过浏览器发起HTTP请求,服务器接收并处理请求,然后返回相应的HTML页面或其他资源给客户端。
  3. 标准技术:Web的核心技术包括HTML(Hypertext Markup Language)、CSS(Cascading Style Sheets)和JavaScript。HTML用于创建网页结构,CSS用于控制网页的样式和布局,JavaScript用于实现交互性和动态效果。
  4. 网页开发:网页开发涉及前端和后端两个方面。前端开发主要关注用户界面的设计和开发,使用HTML、CSS和JavaScript等技术;后端开发则负责处理服务器端的逻辑和数据存储,使用各种编程语言和框架。
  5. 动态网页:除了静态的HTML页面外,Web也支持动态网页的创建。动态网页可以根据用户的请求和其他条件生成不同的内容,通常使用服务器端脚本语言(如PHP、Python和Java)和数据库来实现。
  6. Web应用程序:随着Web的发展,许多复杂的应用程序也被开发为Web应用。这些应用在浏览器中运行,可以提供各种功能,如电子商务、社交媒体、在线银行等。
  7. 移动Web:随着移动设备的普及,移动Web成为重要的发展方向。移动Web兼容各种移动设备,并提供更好的用户体验,通常通过响应式设计或移动应用程序来实现。

总的来说,Web的发展使得信息的获取和共享变得更加便捷和全球化。它已经成为我们日常生活和工作中不可或缺的一部分,不断演进和创新,为我们提供丰富的在线资源和服务。

标签: web

本文转载自: https://blog.csdn.net/2301_76546533/article/details/134823213
版权归原作者 2301_76546533 所有, 如有侵权,请联系我们删除。

“深入理解Web注解:解析常用注解及其应用场景”的评论:

还没有评论