16
Tutorial
Calvin Xiao edited this page 2014-06-24 19:52:32 -07:00
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.

CRUD页面教程

0. 准备

基于SpringSide生成项目

1. 数据库设计

在src/resouces/sql/h2/schema.sql 中手工编写创建表的sql。

 create table acct_user (
        id bigint generated by default as identity,
        email varchar(255),
        login_name varchar(255) not null unique,
        name varchar(255),
        password varchar(255),
        primary key (id)
    ) ;

为h2和生产数据库各自建立sql.设计原则见DataBase章节。

2. Entity

2.1 手工编写Entity利用默认大于配置原理写尽量少的注释, 一般只有带前缀的表名Cache和关联属性需要注释。

@Entity
@Table(name = "SS_USER")
public class User extends IdEntity {
	private String loginName;
	private String password;
	private String name;
	private String email;
        @ManyToOne
	@JoinColumn(name = "TEAM_ID")
        private Team team;
        //... getter and setter
}

2.2 执行test中的JpaMappingTest.java校验ORM配置正确。

2.3 Spring的LocalContainerEntityManagerFactoryBean能自动扫描packagesToScan中的@Entity类无需逐一配置。

3. DAO

3.1 写一个简单的DAO接口日后再根据需要添加方法定义。

public interface UserDao extends PagingAndSortingRepository<User, Long> {
	User findByLoginName(String loginName);
}

3.2 Spring Data JPA能根据<jpa:repositories>自动扫描继承于Repostory及其子接口的接口无需配置。

3.3 如果有复杂的操作或ORM关系可添加单元测试否则可忽略。

4.Service

4.1 按业务划分新建或使用已有Service(与DAO不应是一一对应关系),根据需求添加方法定义。 注意事务定义。

@Component
@Transactional(readOnly = true)
public class AccountManager {
        @Autowired
	private UserDao userDao;
	public User getUser(Long id) {
		return userDao.findOne(id);
	}

	@Transactional(readOnly = false)
	public void saveUser(User entity) {
		userDao.save(entity);
	}
}

4.2 Spring能根据applicationContext.xml中的<context:component-scan...>自动扫描@Service或@Component, 无需配置。

4.3 对有业务逻辑的方法要编写单元测试并用Mock框架模拟dao层。

5.Web Controller

5.1 写一个Controller负责CRUD。

@Controller
@RequestMapping(value = "/account/user")
public class UserController {

	private AccountManager accountManager;

	@RequestMapping(method = RequestMethod.GET)
	public String list(Model model) {
		List<User> users = accountManager.getAllUser();
		model.addAttribute("users", users);
		return "account/userList";
	}

	@RequestMapping(value = "create", method = RequestMethod.GET)
	public String createForm(Model model) {
		model.addAttribute("user", new User());
		return "account/userForm";
        }

	@RequestMapping(value = "create",method = RequestMethod.POST)
	public String create(User user, RedirectAttributes redirectAttributes) {
		accountService.saveUser(user);
		redirectAttributes.addFlashAttribute("message", "Create user success");
		return "redirect:/account/user/";
	}
        ...............
}

5.2 Spring能根据spring-mvc.xml中的<context:component-scan> 自动扫描@Controller 无需配置。

5.3 如果有participation update的情况即Form表单中的变量没有包含Entity中的所有属性一个方法是另外编写一个DTO一个方法是参照quickstart中基于@ModelAttribute的二次绑定的做法。

##6. JSP

6.1 写一个List页面一个Form页面 参见quickstart。

6.2 对关键页面流程应该编写Selenium功能测试用例。

6.3 使用sitemesh将通用的headerfooter抽取出来。

6.4 注意添加JQuery-validate的客户端验证代码。