21.2.1 处理请求

因为我们要使用 Spring MVC 来开发应用的 Web 层,因此需要将 Spring MVC 作为依赖添加到构建中。我们已经讨论过,Spring Boot 的 Web Starter 能够将 Spring MVC 需要的所有内容一站式添加到构建中。如下是我们所需的 Gradle 依赖:

compile("org.springframework.boot:spring-boot-starter.web")

如果使用 Maven 来进行构建的话,那么依赖将会如下所示:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

注意,因为 Spring Boot parent 项目已经指定了 Web Starter 依赖的版本, 因此在项目的 build.gradle 和 pom.xml 文件中没有必要再显式指定版本信息。

Web Starter 依赖就绪之后,使用 Spring MVC 需要的所有依赖都会添加到项目中。现在,我们就可以编写应用所需的控制器类了。

控制器相对会非常简单,包含展现联系人表单的 HTTP GET 请求以及处理表单提交的 POST 请求。它本身并没有做太多的事情,而是委托 ContactRepository(稍后就会创建它)来持久化联系人信息。程序清单 21.3 中的 ContactController 就能满足这些需求。

程序清单 21.3 ContactController 为 Contacts 应用处理基本的 Web 请求

package contacts;

import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class ContactController {

	private ContactRepository contactRepo;

	@Autowired
	public ContactController(ContactRepository contactRepo) {
		this.contactRepo = contactRepo;
	}

	@RequestMapping(method=RequestMethod.GET)
	public String home(Map<String,Object> model) {
		List<Contact> contacts = contactRepo.findAll();
		model.put("contacts", contacts);
		return "home";
	}

	@RequestMapping(method=RequestMethod.POST)
	public String submit(Contact contact) {
		contactRepo.save(contact);
		return "redirect:/";
	}
}

你首先可能会发现 ContactController 就是一个典型的 Spring MVC 控制器。尽管 Spring Boot 会管理构建依赖并最小化 Spring 配置,但是在编写应用逻辑的时候,编程模型是一致的。

在本例中,ContactController 遵循了 Spring MVC 控制器的典型模式,它会展现表单并处理表单的提交。其中 home() 方法使用注入的 ContactRepository 来获取所有 Contact 对象的列表,并将它们放到模型中,然后把请求转交给 home 视图。这个视图将会展现联系人的列表以及添加新 Contact 的表单。submit() 方法将会处理表单提交的 POST 请求,保存 Contact,并重定向到首页。

因为 ContactController 使用了 @Controller 注解,所以组件扫描将会找到它。因此,我们不需要在 Spring 应用上下文中明确将其声明为 bean。

而 Contact 模型类是一个简单的 POJO,具有一些属性和存取器方法,如下面的程序清单所示。

程序清单 21.4 Contact 是一个简单的领域类型
package contacts;

public class Contact {
  private Long id;
  private String firstName;
  private String lastName;
  private String phoneNumber;
  private String emailAddress;

  public void setId(Long id) {
    this.id = id;
  }
  
  public Long getId() {
    return id;
  }
  
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  
  public String getFirstName() {
    return firstName;
  }
  
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  
  public String getLastName() {
    return lastName;
  }

  public void setPhoneNumber(String phoneNumber) {
    this.phoneNumber = phoneNumber;
  }

  public String getPhoneNumber() {
    return phoneNumber;
  }
  
  public void setEmailAddress(String emailAddress) {
    this.emailAddress = emailAddress;
  }
  
  public String getEmailAddress() {
    return emailAddress;
  }
}

应用程序的 Web 层基本上已经完成了,剩下的就是创建定义 home 视图的 Thymeleaf 模板。

Last updated