Tutorial

优质
小牛编辑
123浏览
2023-12-01

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.设计原则见https://www.xnip.cn/shouce/596/44929.html章节。

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中的JpaMapptingTest.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能根据\自动扫描继承于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中的\自动扫描@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中的\ 自动扫描@Controller, 无需配置。

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

6. JSP

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

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

6.3 使用sitemesh,将通用的header,footer抽取出来。

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