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

这篇具有很好参考价值的文章主要介绍了深入理解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() 方法模拟处理某个请求时发生错误,并抛出了自定义异常 CustomExceptionhandleCustomException() 方法使用 @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的发展使得信息的获取和共享变得更加便捷和全球化。它已经成为我们日常生活和工作中不可或缺的一部分,不断演进和创新,为我们提供丰富的在线资源和服务。文章来源地址https://www.toymoban.com/news/detail-752651.html

到了这里,关于深入理解Web注解:解析常用注解及其应用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析 JWT(JSON Web Tokens):原理、应用场景与安全实践

    JWT(JSON Web Tokens)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。由于其小巧和自包含的特性,它在 Web 应用程序和服务之间尤其流行用于身份验证和信息交换。JWT 的主要优点和特性包括: 自包含(Self-contained): JWT 本身包含了所有必要的信息。

    2024年02月04日
    浏览(37)
  • 深入理解 Spring 中的 @RequestBody 和 @ResponseBody 注解及其区别

    在现代的 Web 开发中,处理 HTTP 请求和响应是不可或缺的任务。Spring Framework 提供了丰富的功能来简化这些任务,并使开发人员能够更专注于业务逻辑。在本文中,我们将深入探讨 Spring 中的 @RequestBody 和 @ResponseBody 注解,以及它们之间的区别。 @RequestBody 注解是 Spring 提供的一

    2024年02月14日
    浏览(32)
  • Spring很常用的@Conditional注解的使用场景和源码解析

    你好,我是刘牌! 今天要分享的是Spring的注解@Conditional,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,如果满足条件,则将Bean注册进IOC中,如果不满足条件,则不进行注册,这个注解在SpringBoot中衍生出很多注解,比如 @ConditionalOnProperty , @ConditionalOnBean ,

    2023年04月14日
    浏览(26)
  • 深入探究Vue.js生命周期及其应用场景

    当谈到Vue.js的生命周期时,我们指的是组件在创建、更新和销毁过程中发生的一系列事件。了解Vue的生命周期对于开发人员来说是至关重要的,因为它们提供了一个机会来执行特定任务,并在不同的阶段处理组件。 Vue的生命周期可以分为八个不同的阶段:创建前、创建后、挂

    2024年02月06日
    浏览(37)
  • 【Python 矩阵:快速入门指南】-深入理解矩阵运算及其常用计算

    【Python 矩阵:快速入门指南】-深入理解矩阵运算及其常用计算 在数据科学和机器学习中,矩阵是一个非常重要的数学概念,它被广泛应用于数据处理、图像处理、自然语言处理等领域。Python作为一门高效且广泛应用的编程语言,提供了许多强大的工具来处理矩阵。本文将介

    2024年02月13日
    浏览(47)
  • 深入理解TCP/IP协议栈及其应用

            TCP/IP协议栈是当今互联网世界中广泛应用的网络通信协议,它将数据分为若干个分组,通过网络传输到目的地,确保数据的可靠传输。对于计算机科学专业的学生以及从事网络通信相关行业的从业者而言,深入理解TCP/IP协议栈及其应用是必不可少的技能之一。  

    2024年02月14日
    浏览(27)
  • 深入解析:树结构及其应用

    🎉欢迎来到数据结构学习专栏~深入解析:树结构及其应用 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如果

    2024年02月11日
    浏览(29)
  • 深入理解JSON及其在Java中的应用

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏: MySQL学习 🥭本文内容: 深入理解JSON及其在Java中的应用 📚个人知识库: [Leo知识库]https://gaoziman.gitee.io/blogs/),欢

    2024年02月04日
    浏览(31)
  • AI Transformer:最新进展及其应用场景解析

    作者:禅与计算机程序设计艺术 随着人工智能(AI)技术的飞速发展,深度学习(DL)和Transformer模型已经成为最具代表性的两个研究方向。近年来,两者在自然语言处理、图像识别、文本生成等领域均取得重大突破,在各行各业产生了广泛影响。本文将从最新研究成果和相关

    2024年02月07日
    浏览(50)
  • 深入理解Java LinkedList:使用场景与实际应用

    在Java的世界里,集合框架是不可或缺的一部分,它提供了一系列用于存储和操作数据集合的接口和类。其中, LinkedList 作为List接口的一个实现,经常被拿来与 ArrayList 做对比。尽管在实际业务开发中 LinkedList 的使用频率可能不如 ArrayList 高,但这并不意味着它是一个冷门或无

    2024年01月24日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包