一、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总结
- 构成:Web由客户端和服务器端组成。客户端通常是用户使用的浏览器软件,而服务器端则是存储和提供网页和其他资源的计算机系统。
- 基本原理:Web使用HTTP(Hypertext Transfer Protocol)协议进行通信。用户通过浏览器发起HTTP请求,服务器接收并处理请求,然后返回相应的HTML页面或其他资源给客户端。
- 标准技术:Web的核心技术包括HTML(Hypertext Markup Language)、CSS(Cascading Style Sheets)和JavaScript。HTML用于创建网页结构,CSS用于控制网页的样式和布局,JavaScript用于实现交互性和动态效果。
- 网页开发:网页开发涉及前端和后端两个方面。前端开发主要关注用户界面的设计和开发,使用HTML、CSS和JavaScript等技术;后端开发则负责处理服务器端的逻辑和数据存储,使用各种编程语言和框架。
- 动态网页:除了静态的HTML页面外,Web也支持动态网页的创建。动态网页可以根据用户的请求和其他条件生成不同的内容,通常使用服务器端脚本语言(如PHP、Python和Java)和数据库来实现。
- Web应用程序:随着Web的发展,许多复杂的应用程序也被开发为Web应用。这些应用在浏览器中运行,可以提供各种功能,如电子商务、社交媒体、在线银行等。
- 移动Web:随着移动设备的普及,移动Web成为重要的发展方向。移动Web兼容各种移动设备,并提供更好的用户体验,通常通过响应式设计或移动应用程序来实现。
总的来说,Web的发展使得信息的获取和共享变得更加便捷和全球化。它已经成为我们日常生活和工作中不可或缺的一部分,不断演进和创新,为我们提供丰富的在线资源和服务。
版权归原作者 2301_76546533 所有, 如有侵权,请联系我们删除。