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

9.3 KiB
Raw Blame History

5. 基于Spring框架的后端应用开发

5.1 Java基础增强

5.1.1 Java异常处理

练习任务:

  1. 异常处理练习:

    • 创建一个方法该方法接受两个整数参数并返回它们的除法结果。如果第二个参数为0则抛出自定义异常。
    • 在主程序中调用该方法并使用try-catch块来捕获异常输出友好的错误信息。
    • 示例代码:
      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方法,并捕获异常,输出异常信息。
    • 示例代码:
      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注解。
    • 编写一个程序读取该注解,并打印出注解的值。
    • 示例代码:
      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
    • 在主程序中调用该方法,并使用ifPresentorElse方法处理结果。
    • 示例代码:
      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来实现这个功能。
    • 示例代码:
      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>对象,并设置和获取其中的值。
    • 示例代码:
      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应用该应用包含一个控制器该控制器提供一个静态的欢迎页面。
    • 示例代码:
      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注解来标记初始化和销毁方法。
    • 示例代码:
      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 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>
      
    • 示例代码 (注解配置):

      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页面。
    • 示例代码:
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.GetMapping;
      
      @Controller
      public class SimpleController {
          @GetMapping("/simple")
          public String simplePage() {
              return "simple";
          }
      }