В этой статье содержится инструкция по созданию простого web- приложения. Используются технологии:
- Java 8
- Gradle
- Spring MVC 4.1.6 (Java Config)
- Spring Data JPA 1.8.1
- Hibernate 5
- Javax Servlet API 3.1.0 (Java Config)
Итоговая структура проекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apply plugin: 'java' apply plugin: 'war' repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' compile 'org.springframework:spring-context:4.1.6.RELEASE' compile 'org.springframework:spring-webmvc:4.1.6.RELEASE' compile 'org.springframework.data:spring-data-jpa:1.8.1.RELEASE' compile 'mysql:mysql-connector-java:5.1.36' compile 'org.hibernate:hibernate-core:5.0.0.CR1' compile 'org.hibernate:hibernate-entitymanager:5.0.0.CR1' compile 'com.google.guava:guava:18.0' compile 'javax.servlet:javax.servlet-api:3.1.0' compile 'javax.servlet:jstl:1.2' } |
Начинаем с конфигурации развертывания веб-приложения. Это должен был быть web.xml, но servlet-api начиная с версии 3 поддерживает Java Config (Е):
1 2 3 4 5 6 7 8 9 10 11 |
public class WebInitializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(Config.class); ctx.setServletContext(servletContext); Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); servlet.addMapping("/"); servlet.setLoadOnStartup(1); } } |
где в ctx.register мы указываем на наш Spring MVC Java Config (левые конфиги сюда писать не нужно, только MVC):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@Configuration @ComponentScan @EnableWebMvc @EnableJpaRepositories @Import({DBConfig.class}) public class Config extends WebMvcConfigurerAdapter { @Bean public UrlBasedViewResolver setupViewResolver() { UrlBasedViewResolver resolver = new UrlBasedViewResolver(); resolver.setPrefix("/WEB-INF/jsp/"); resolver.setSuffix(".jsp"); resolver.setViewClass(InternalResourceView.class); return resolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/*"); } } |
Импортируем в этот конфиг другие через аннотацию @Import.
Указываем в setupViewResolver корневую папку с нашими страницами и указываем префиксы файлов страниц (например, jsp).
Указываем в addResourceHandlers пути до наших ресурсов(картинки, js, css).
Конфигурация dataSource и SpringData JPA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
@Configuration @EnableJpaRepositories public class DBConfig { @Bean DriverManagerDataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/springmvc"); dataSource.setUsername("root"); dataSource.setPassword("admin"); return dataSource; } @Bean LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean emFactory = new LocalContainerEntityManagerFactoryBean(); emFactory.setDataSource(dataSource()); emFactory.setPersistenceProviderClass(HibernatePersistenceProvider.class); emFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); Properties properties = new Properties(); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); emFactory.setJpaProperties(properties); emFactory.setPackagesToScan("ru.vympel.repositories", "ru.vympel.dom"); return emFactory; } @Bean JpaTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } } |
Создаем простой контроллер для начальной страницы с тестом Spring Data JPA (выведет на страницу все записи из таблицы БД):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Controller public class DefaultController { @Autowired ApplicationContext context; @RequestMapping(value = "/", method = RequestMethod.GET) public String index(ModelMap map) { ContactService bean = context.getBean(ContactService.class); StringBuilder sb = new StringBuilder(" "); bean.findAll().forEach(it->sb.append(it.toString()).append(" ")); map.put("msg", sb.toString()); return "index"; } } |
Объект предметной области (DOM):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@Entity(name = "contact") public class Contact { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") private Long id; @Column(name = "VERSION") private int version; @Column(name = "FIRST_NAME") private String firstName; @Column(name = "LAST_NAME") private String lastName; @Override public String toString() { return "Contact{" + "id=" + id + ", version=" + version + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } } |
Репозиторий контактов:
1 2 3 |
public interface ContactRepository extends CrudRepository<contact,integer>{ List<contact> findByFirstName(String firstName); } |
Сервис контактов:
1 2 3 4 5 6 7 |
public interface ContactService { List<contact> findAll(); List<contact> findByFirstName(String firstName); Contact findById(Integer id); Contact save(Contact contact); void delete(Contact contact); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
@Service("contactService") @Repository @Transactional @Lazy public class ContactServiceImpl implements ContactService { @Autowired ContactRepository contactRepository; public List<contact> findAll() { return Lists.newArrayList(contactRepository.findAll()); }</contact> public List<contact> findByFirstName(String firstName) { return contactRepository.findByFirstName(firstName); }</contact> public Contact findById(Integer id) { return contactRepository.findOne(id); } public Contact save(Contact contact) { return contactRepository.save(contact); } public void delete(Contact contact) { contactRepository.delete(contact); } } |
JSP-страница index:
1 2 3 4 5 6 7 8 9 10 11 12 |
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:set var="cp" value="${pageContext.request.servletContext.contextPath}" scope="request"></c:set> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Spring 4 Web MVC via Annotations</title> <link rel="stylesheet" type="text/css" href="{cp}/resources/css/site.css"> <script src="${cp}/resources/js/js.js"></script> <h4>Spring 4 Web MVC via Annotations</h4> Spring says: <span class="blue">${msg}</span> |
Компилируем WAR и запускаем наше простое web-приложение на Tomcat 7: