java-web/docs/tasks/chapter05-tasks.md
2024-08-08 15:18:09 +08:00

316 lines
9.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 5. 基于Spring框架的后端应用开发
### 5.1 Java基础增强
#### 5.1.1 Java异常处理
**练习任务**:
1. **异常处理练习**:
- 创建一个方法该方法接受两个整数参数并返回它们的除法结果。如果第二个参数为0则抛出自定义异常。
- 在主程序中调用该方法并使用try-catch块来捕获异常输出友好的错误信息。
- 示例代码:
```java
public class Division {
public static double divide(int a, int b) throws IllegalArgumentException {
if (b == 0) {
throw new IllegalArgumentException("除数不能为0");
}
return (double) a / b;
}
public static void main(String[] args) {
try {
double result = divide(10, 0);
System.out.println("结果: " + result);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}
```
2. **自定义异常练习**:
- 创建一个自定义异常类`InvalidAgeException`,继承自`IllegalArgumentException`。
- 创建一个方法`validateAge`接收一个年龄参数如果年龄小于0或大于150则抛出`InvalidAgeException`。
- 在主程序中调用`validateAge`方法,并捕获异常,输出异常信息。
- 示例代码:
```java
public class AgeValidator {
public static void validateAge(int age) throws InvalidAgeException {
if (age < 0 || age > 150) {
throw new InvalidAgeException("年龄无效");
}
}
public static void main(String[] args) {
try {
validateAge(-5);
} catch (InvalidAgeException e) {
System.out.println(e.getMessage());
}
}
}
class InvalidAgeException extends IllegalArgumentException {
public InvalidAgeException(String message) {
super(message);
}
}
```
#### 5.1.2 注解
**练习任务**:
1. **自定义注解练习**:
- 创建一个自定义注解`@MyAnnotation`,并带有字符串属性`value`。
- 创建一个类`AnnotatedClass`,并在其方法上使用`@MyAnnotation`注解。
- 编写一个程序读取该注解,并打印出注解的值。
- 示例代码:
```java
import java.lang.reflect.Method;
public @interface MyAnnotation {
String value();
}
public class AnnotatedClass {
@MyAnnotation(value = "Hello, Annotation!")
public void myMethod() {
// 方法实现
}
public static void main(String[] args) {
Method[] methods = AnnotatedClass.class.getDeclaredMethods();
for (Method method : methods) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.println(annotation.value());
}
}
}
}
```
#### 5.1.3 Optional的介绍和使用
**练习任务**:
1. **Optional练习**:
- 创建一个方法`getUserById`该方法接收一个ID参数并返回一个`Optional<User>`对象。
- 如果ID对应的数据存在则返回包含用户对象的`Optional`;否则返回空的`Optional`。
- 在主程序中调用该方法,并使用`ifPresent`或`orElse`方法处理结果。
- 示例代码:
```java
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class UserService {
public static Optional<User> getUserById(long id) {
if (id == 1) {
return Optional.of(new User("John Doe"));
} else {
return Optional.empty();
}
}
public static void main(String[] args) {
Optional<User> user = getUserById(1);
user.ifPresent(u -> System.out.println("用户姓名: " + u.getName()));
}
}
```
#### 5.1.4 Stream API的介绍和使用
**练习任务**:
1. **Stream API练习**:
- 创建一个方法`findMaxValue`,该方法接收一个`List<Integer>`参数,并返回列表中的最大值。
- 使用Stream API来实现这个功能。
- 示例代码:
```java
import java.util.Arrays;
import java.util.List;
public class MaxFinder {
public static int findMaxValue(List<Integer> numbers) {
return numbers.stream().max(Integer::compare).orElse(0);
}
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int maxValue = findMaxValue(numbers);
System.out.println("最大值: " + maxValue);
}
}
```
#### 5.1.5 泛型
**练习任务**:
1. **泛型练习**:
- 创建一个泛型类`Pair<T, U>`,用于存储两个不同类型的数据。
- 在主程序中创建一个`Pair<String, Integer>`对象,并设置和获取其中的值。
- 示例代码:
```java
public class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
public void setFirst(T first) {
this.first = first;
}
public void setSecond(U second) {
this.second = second;
}
}
public class Main {
public static void main(String[] args) {
Pair<String, Integer> pair = new Pair<>("Hello", 42);
System.out.println("First: " + pair.getFirst() + ", Second: " + pair.getSecond());
}
}
```
### 5.2 Spring框架简介
#### 5.2.2 Spring框架的核心特性
**练习任务**:
1. **Spring框架特性练习**:
- 使用Spring框架创建一个简单的Web应用该应用包含一个控制器该控制器提供一个静态的欢迎页面。
- 示例代码:
```java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class WelcomeController {
@GetMapping("/")
public String welcome() {
return "welcome";
}
}
```
### 5.3 Spring IoC
#### 5.3.1 Spring Bean的定义和生命周期
**练习任务**:
1. **Bean生命周期练习**:
- 创建一个带有初始化和销毁方法的Spring Bean。
- 使用`@PostConstruct`和`@PreDestroy`注解来标记初始化和销毁方法。
- 示例代码:
```java
import org.springframework.stereotype.Component;
@Component
public class LifeCycleBean {
public LifeCycleBean() {
System.out.println("LifeCycleBean created.");
}
@PostConstruct
public void init() {
System.out.println("LifeCycleBean initialized.");
}
@PreDestroy
public void destroy() {
System.out.println("LifeCycleBean destroyed.");
}
}
```
#### 5.3.2 XML和注解方式的Bean配置
**练习任务**:
1. **XML和注解配置练习**:
- 使用XML和注解两种方式配置一个简单的Spring Bean。
- 在主程序中获取并使用该Bean。
- 示例代码 (XML配置):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.example.MyBean">
<property name="name" value="John Doe"/>
</bean>
</beans>
```
- 示例代码 (注解配置):
```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean("Jane Doe");
}
}
public class MyBean {
private String name;
public MyBean(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
```
### 5.4 Spring MVC
#### 5.4.2 使用@Controller定义控制器
**练习任务**:
1. **控制器练习**:
- 创建一个简单的控制器该控制器接收一个GET请求并返回一个简单的HTML页面。
- 示例代码:
```java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SimpleController {
@GetMapping("/simple")
public String simplePage() {
return "simple";
}
}
```