- Introduction
- Quick Start
- Design
- Tutorial
- Spring MVC
- JSP/JSTL/Servlet
- JQuery and plugins
- Ajax
- Twitter Bootstrap CSS
- SiteMesh
- YUICompressor
- Spring Restful Service
- JAX-WS/CXF
- Spring Data JPA
- JPA/Hibernate
- MyBatis
- Database
- H2 Database
- Datasource
- Transaction
- Redis
- Cache Overview
- Guava Cache
- Ehcache
- Memcached
- Shiro Security
- Crypto
- Schedule/Quartz
- Jmx
- System Protection
- Hystrix
- Rate Limiter
- Monitoring and Metrics
- Metrics-library
- Graphite
- Logging/Slf4j/Logback
- Logstash
- Spring
- Validation Overview
- JQuery Validation
- Hibernate Validator
- General Utilizes
- JSON/JAXB
- Date
- Test Overview
- Unit Test/Mockito/AssertJ
- Selenium2
- BDD
- Performace-test
- JMeter
- Profiler
- Simulator Overview
- Nodejs
- Eclipse
- Maven
- Sonar
- git
- Travis CI
- Jetty
- Micro-Service Architecture/Executable War
- AssertJ
- CreateNewProject
- Dozer
- Graphite-Windows
- Hello-Everybody
- Jaxb
- Json
- Mock
Tutorial
CRUD页面教程
0. 准备
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.wenjiangs.com/doc/owuh7oo9章节。
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的客户端验证代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论