17529

Розробка Java-програм з Web-інтерфейсом, що працюють з базами даних, на основі фреймворка Spring та Java Persistence API (JPA)

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота №3 Тема: Розробка Javaпрограм з Webінтерфейсом що працюють з базами даних на основі фреймворка Spring та Java Persistence API JPA. Мета: Навчитись використовувати шаблон проектування MVC та фреймворк Spring при створенні Javaпрограм з Webінтерфейсом. Навчитись вико...

Украинкский

2013-07-04

305.5 KB

11 чел.

Лабораторна робота №3

Тема: Розробка Java-програм з Web-інтерфейсом, що працюють з базами даних, на основі фреймворка Spring та Java Persistence API (JPA).

Мета: Навчитись використовувати шаблон проектування MVC та фреймворк Spring при створенні Java-програм з Web-інтерфейсом. Навчитись використовувати Java Persistence API для роботи з базами даних.

Хід роботи:

Теоретичні відомості:

Java Persistence API

Java Persistence API забезпечує object/relational mapping для роботи з реляційними даними в Java-програмах. Java Persistence складається з трьох частин:

Java Persistence API

• Мови запитів (Query language)

Метаданих для object/relational mapping

Entities

Entity – це легковісний клас, об’єкти якого використовується для збереження даних в БД. Зазвичай, entity представляє якусь таблицю реляційної БД, а екземпляр entity відповідає одному рядку таблиці. Інформація для збереження в БД представляється або через persistent-поля, або через persistent-властивості. Ці поля чи властивості використовують анотації об’єктно-реляційного відображення (object/relational mapping annotations) для зв’язування entities та їх зв’язків з реляційними даними в базі даних.

Spring

Spring є Java framework, який надає розробнику сукупність сервісів для побудови масштабованих J2EE програм. Spring реалізує в собі концепцію MVC

Inversion of Control (IoC)

Іноді можна почути терміни Inversion of Control та Dependency Injection як взаємозамінні, але це не зовсім вірно. Inversion of Control набагато більш загальна річ, що виражається багатьма різними способами. Dependency Injection є одним з таких способів.

Inversion of Control покриває широке поле методів, які дозволяють об’єкту бути пасивним учасником в системі. Коли застосовується IoC метод, то об’єкт передає контроль над якимись своїми властивостями чи аспектами framework'у чи середовищу. Прикладами такого контролю можуть бути створення об’єктів чи передача управління залежним об’єктам. IoC може виключити необхідність явного програмування вказаних дій за допомогою використання Dependency Injection та аспектно-орієнтованого програмування (Aspect-Oriented Programming AOP) відповідно.

Dependency Injection

Поняття Dependency Injection є стержневим в Spring. Dependency Injection є методом обєднання різних обєктів в єдину систему. При його застосування framework сам забезпечує встановлення звязків між обєктами, позбавляючи програміста необхідності написання в своєму коді логіки звязування обєктів чи створення обєктів.

Якщо два об’єкти зв’язані, бажано, щоб зв’язок не був жорстким і не був прив’язаний до конкретного середовища.

Application Context

The ApplicationContext є реалізацією BeanFactory, яка, в свою чергу, є реєстром всіх обєктів, керованих Spring. Загалом, BeanFactory відповідає за створення бінів, звязування їх з залежними бінами і забезпечення засобів зручного пошуку бінів. ApplicationContext може розглядатися як повнофункціональна BeanFactory. ApplicationContexts також додає деякі додаткові можливості до BeanFactory. Він може автоматично обробляти BeanFactory після ініціалізації шляхом запуску BeanFactoryPostProcessors. Він також забезпечує можливість інтернаціоналізації, механізм маршрутизації повідомлень для слабо звязаних обєктів і підтримує інтерфейси життєвого циклу, такі, як ApplicationContextAware.

Plain Old Java Objects (POJO)

Отже, Dependency Injection та Spring Application Context є двома центральними концепціями в Spring Framework. Вони є інструментом забезпечення можливості побудови програми на основі виключно plain old Java objects (POJOs). Це дає можливість розробляти web-програми, які є повністю обєктно-орієнтованими без привязки до конкретного framework всередині бізнес-логіки. Це дає змогу сфокусуватися на розробці бізнес-логіки вбудовану в model замість концентрації на специфічному для використовуваного framework коді. Це відчиняє двері для всіх  design patterns, принципів і практик ефективної обєктно-орієнтованої розробки.

Лістинг програми:

Bludo.java

package org.chdtu.samples.tryspringjpa;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Table;

@Entity

@Table(name="BLUDO")

public class Bludo extends BaseEntity{

private static final long serialVersionUID = -5675138799302239629L;

 

@Column(name="nazvablud")

private String nazvablud;

 

@Column(name="prix")

private String prix;

 

@Column(name="id_ingredient")

private Integer idingredient;

public String getNazvablud() {

 return nazvablud;}

public void setNazvablud(String nazvablud) {

 this.nazvablud = nazvablud;}

public String getPrix() {

 return prix;}

public void setPrix(String prix) {

 this.prix = prix;}

public Integer getIdingredient() {

 return idingredient;}

public void setIdingredient(Integer idingredient) {

 this.idingredient = idingredient;}

 

}

Ingredient.java

package org.chdtu.samples.tryspringjpa;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Table;

@Entity

@Table(name="INGREDIENT")

public class Ingredient extends BaseEntity{

private static final long serialVersionUID = -5675138799302239629L;

@Column(name="nameingredient")

private String nameingredient;

@Column(name="priceforvaga")

private String priceforvaga;

 

@Column(name="vaga")

private String vaga;

 

@Column(name="idbludo")

private Integer idbludo;

 

public String getNameingredient() {

 return nameingredient;

}

public void setNameingredient(String nameingredient) {

 this.nameingredient = nameingredient;

}

public String getPriceforvaga() {

 return priceforvaga;

}

public void setPriceforvaga(String priceforvaga) {

 this.priceforvaga = priceforvaga;

}

public String getVaga() {

 return vaga;

}

public void setVaga(String vaga) {

 this.vaga = vaga;

}

public Integer getIdbludo() {

 return idbludo;

}

public void setIdbludo(Integer idbludo) {

 this.idbludo = idbludo;

}

 

}

Blud. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import org.chdtu.samples.tryspringjpa.Bludo;

import org.springframework.dao.DataAccessException;

/**

* The high-level TrySpringAndJPA business interface.

*

* <p>This is basically a data access object.

* TrySpringAndJPA doesn't have a dedicated business facade.

*

*/

public interface Blud {

Collection<Bludo> getBludos() throws DataAccessException;

}

Ingredientt. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import org.chdtu.samples.tryspringjpa.Ingredient;

import org.springframework.dao.DataAccessException;

public interface Ingredientt {

Collection<Ingredient> getIngredients() throws DataAccessException;

}

EntityManagerBlud. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import org.chdtu.samples.tryspringjpa.Bludo;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;

/**

* JPA implementation of the Clinic interface using EntityManager.

*

* <p>The mappings are defined in "orm.xml" located in the META-INF directory.

*

* @author Mike Keith

* @author Rod Johnson

* @author Sam Brannen

* @since 22.4.2006

*/

@Repository

@Transactional

public class EntityManagerBlud implements Blud {

@PersistenceContext

private EntityManager em;

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public Collection<Bludo> getBludos() {

 return this.em.createQuery("SELECT vet FROM Bludo vet").getResultList();

}

}

EntityManagerIngredient. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import org.chdtu.samples.tryspringjpa.Ingredient;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;

/**

* JPA implementation of the Clinic interface using EntityManager.

*

* <p>The mappings are defined in "orm.xml" located in the META-INF directory.

*

* @author Mike Keith

* @author Rod Johnson

* @author Sam Brannen

* @since 22.4.2006

*/

@Repository

@Transactional

public class EntityManagerIngredient implements Ingredientt {

@PersistenceContext

private EntityManager em;

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public Collection<Ingredient> getIngredients() {

 return this.em.createQuery("SELECT vet FROM Ingredient vet").getResultList();

}

}

BludoController. java

package org.chdtu.samples.tryspringjpa.web;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.chdtu.samples.tryspringjpa.jpa.Blud;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class BludoController {

private final Blud bludo;

protected final Log logger = LogFactory.getLog(getClass());

@Autowired

public BludoController(Blud bludo) {

 this.bludo = bludo;

}

@RequestMapping("/bludo.do")

public ModelMap bludoHandler() {

 return new ModelMap(this.bludo.getBludos());

}

}

IngredientController. java

package org.chdtu.samples.tryspringjpa.web;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.chdtu.samples.tryspringjpa.jpa.Ingredientt;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class IngredientController {

private final Ingredientt ingredient;

protected final Log logger = LogFactory.getLog(getClass());

@Autowired

public IngredientController(Ingredientt ingredient) {

 this.ingredient = ingredient;

}

@RequestMapping("/ingredient.do")

public ModelMap ingredientHandler() {

 return new ModelMap(this.ingredient.getIngredients());

}

}

Jdbc.properties

# Properties file with JDBC and JPA settings.

#

# Applied by <context:property-placeholder location="jdbc.properties"/> from

# various application context XML files (e.g., "applicationContext-*.xml").

# Targeted at system administrators, to avoid touching the context XML files.

#-------------------------------------------------------------------------------

# Common Settings

hibernate.generate_statistics = true

hibernate.show_sql            = true

jpa.showSql                   = true

#-------------------------------------------------------------------------------

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/restoran

jdbc.username=root

jdbc.password=admin

hibernate.dialect=org.hibernate.dialect.MySQLDialect

jpa.databasePlatform = oracle.toplink.essentials.platform.database.MySQL4Platform

jpa.database = MYSQL

aop.xml

<?xml version="1.0"?>

<!-- Custom aspects for the TrySpringAndJPA sample application -->

<aspectj>

<weaver>

 <include within="org.chdtu.samples.tryspringjpa..*"/>

</weaver>

</aspectj>

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

 version="1.0">

<persistence-unit name="restoran" transaction-type="RESOURCE_LOCAL">

 <!-- Explicitly define mapping file path, else Hibernate won't find the default -->

 <mapping-file>META-INF/orm.xml</mapping-file>

 <!-- Prevent annotation scanning. In this app we are purely driven by orm.xml -->

 <exclude-unlisted-classes>true</exclude-unlisted-classes>

</persistence-unit>

</persistence>

orm.xml

<?xml version="1.0" encoding="Utf-8"?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

 version="1.0">

<persistence-unit-metadata>

 <xml-mapping-metadata-complete/>

 <persistence-unit-defaults>

  <access>PROPERTY</access>

 </persistence-unit-defaults>

</persistence-unit-metadata>

<package>org.chdtu.samples.tryspringjpa</package>

<mapped-superclass class="BaseEntity">

 <attributes>

  <id name="id">

   <generated-value strategy="IDENTITY"/>

  </id>

 </attributes>

</mapped-superclass>

<entity class="Bludo">

 <table name="BLUDO"/>

 <attributes>

  <basic name="nazvablud"/>

  <basic name="prix"/>

  <basic name="idingredient">

  <column name="id_ingredient"/>

  </basic>

 </attributes>

</entity>

 

<entity class="Ingredient">

 <table name="INGREDIENT"/>

 <attributes>

  <basic name="nameingredient"/>

  <basic name="priceforvaga"/>

  <basic name="vaga"/>

  <basic name="idbludo">

  <column name="idbludo"/>

  </basic>

 </attributes>

</entity>

</entity-mappings>

web.xml

<?xml version="1.0" encoding="Windows-1251"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Simple Spring with JPA Program</display-name>

<description>Simple Spring with JPA Program</description>

<context-param>

 <param-name>webAppRootKey</param-name>

 <param-value>tryspringandjpa.root</param-value>

</context-param>

<context-param>

 <param-name>log4jConfigLocation</param-name>

 <param-value>/WEB-INF/log4j.properties</param-value>

</context-param>

<context-param>

 <param-name>contextConfigLocation</param-name>

 <param-value>/WEB-INF/applicationContext-jpa.xml</param-value>

</context-param>

<listener>

 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<servlet>

 <servlet-name>tryspringandjpa</servlet-name>

 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

 <load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

 <servlet-name>tryspringandjpa</servlet-name>

 <url-pattern>*.do</url-pattern>

</servlet-mapping>

<session-config>

 <session-timeout>10</session-timeout>

</session-config>

<welcome-file-list>

 <!-- Redirects to "welcome.htm" for dispatcher handling -->

 <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

<error-page>

 <exception-type>java.lang.Exception</exception-type>

 <location>/WEB-INF/jsp/uncaughtException.jsp</location>

</error-page>

</web-app>

bludo.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%@ include file="/WEB-INF/jsp/header.jsp" %>

<h2>Dishs</h2>

Display all dishs...

<table>

 <tr>

 <thead>

   <th>Number</th>

   <th>Name</th>

   <th>Price</th>

   <th>Number ingredient</th>

   <th><img src="images/Pag2.png" align="right" style="position:relative;right:0px;"></th>

 </thead>

 </tr>

 <c:forEach var="vet" items="${bludoList}">

   <tr>

     <td>${vet.id}</td>

     <td>${vet.nazvablud}</td>

     <td>${vet.prix}</td>

     <td>${vet.idingredient}</td>

   </tr>

 </c:forEach>

</table>

<a href="<c:url value="/addbludo.do"/>">Add Dish</a>

<p>&nbsp;</p>

<%@ include file="/WEB-INF/jsp/footer.jsp" %>

ingredient.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%@ include file="/WEB-INF/jsp/header.jsp" %>

<h2>Ingredients</h2>

Display all ingredients...

<table>

 <tr>

 <thead>

   <th>Number</th>

   <th>Name</th>

   <th>Price for weight</th>

   <th>Weight</th>

   <th>Number Dishs</th>

 </thead>

 </tr>

 <c:forEach var="vet" items="${ingredientList}">

   <tr>

     <td>${vet.id}</td>

     <td>${vet.nameingredient}</td>

     <td>${vet.priceforvaga}</td>

     <td>${vet.vaga}</td>

     <td>${vet.idbludo}</td>

   </tr>

 </c:forEach>

</table>

<p>&nbsp;</p>

<%@ include file="/WEB-INF/jsp/footer.jsp" %>

welcome.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%@ include file="/WEB-INF/jsp/header.jsp" %>

<h2>Restaurants</h2>

Display all restaurant...

<table>

 <tr>

 <thead>

   <th>ID</th>

   <th>Name</th>

   <th>Creation Year</th>

 </thead>

 </tr>

 <c:forEach var="vet" items="${groupList}">

   <tr>

     <td>${vet.id}</td>

     <td>${vet.nazva}</td>

     <td>${vet.creationYear}</td>

   </tr>

 </c:forEach>

</table>

<p>&nbsp;</p>

<%@ include file="/WEB-INF/jsp/footer.jsp" %>

index.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%-- Redirected because we can't set the welcome page to a virtual URL. --%>

<c:redirect url="/welcome.do"/>

footer.jsp

 <table class="footer">

   <tr>

          <td><a href="<c:url value="/bludo.do"/>">Bludo</a></td>

      <td><a href="<c:url value="/ingredient.do"/>">Ingredients</a></td>

     <td align="right"><img src="<c:url value="/images/springsource-logo.png"/>"/></td>

   </tr>

 </table>

 </div>

</body>

</html>

Результати роботи:

Рисунок 1 - Сторінка з списком блюд

Рисунок 2 - Сторінка з списком інгредієнтів

Висновок

В даній лабораторній роботі використовувались шаблон проектування MVC та фреймворк Spring при створенні Java-програм з Web-інтерфейсом.  Було здобуто навички використання Java Persistence API для роботи з базами даних.


 

А также другие работы, которые могут Вас заинтересовать

68696. Современные системы менеджмента 59.82 KB
  Поэтому при переходе от теории менеджмента к практике необходимо использовать такие системы модели менеджмента которые наиболее полно отвечают местным особенностям ведения бизнеса. Начиная с момента получения политической и экономической независимости в период формирования рыночной экономики...
68697. Сравнительная характеристика финского и польского этносов накануне вхождения ВКФ и ЦП в состав России 16.06 KB
  Несмотря на то что Великое Княжество Финляндское так же как и Царство польское относилось к этнически западным цивилизациям различия в уровне развития и складывании жизни этносов накануне вступления в состав России оказались ощутимыми. Благодаря правильной политике Александра...
68698. Особенности формирования политических партий и становление национальных институтов власти в Казахстане и Средней Азии 16.91 KB
  Новая политическая организация получила название Шура и Исламия Исламский совет. Изначально Шура и Исламия формировалась не только как политическая организация но и как орган местной власти наподобие Алаш. Однако в отличие от Алаш Шура и Исламия смогла создать функционировавшую организационную..
68700. Соотношение науки, философии, искусства, обыденного познания 36 KB
  Проблема отличия науки от других форм познавательной деятельности это проблема демаркации т. 5 Для науки характерна постоянная методологическая рефлексия. Иногда можно выделить конденсат народной науки в виде заветов примет наставлений ритуалов и пр.
68701. ЛЕКСИЧЕСКИЕ НОРМЫ РУССКОГО ЛИТЕРАТУРНОГО ЯЗЫКА 39.53 KB
  Лексические нормы или нормы словоупотребления это нормы определяющие правильность выбора слова из ряда единиц близких ему по значению или по форме а также употребление его в тех значениях которые оно имеет в литературном языке.
68702. Национальное богатство как результат экономической деятельности общества. Состав, структура и динамика национального богатства 78 KB
  Поэтому в конкретных экономических расчетах применяется категория совокупный общественный продукт та часть общественного богатства которая создана во всех отраслях народного хозяйства в течение года. В этом случае появляется возможность судить о динамике общественного богатства.
68704. Мировоззренческие понятия пантеизма и деизма и их значение для становления научной картины мира (в философии Н.Кузанского, Д.Бруно, Б.Спинозы и французских просветителей 18-го века) 43.5 KB
  Виды пантеизма: теомонистический пантеизм наделяет существованием только Бога, лишая мир самостоятельного бытия (см. Акосмизм); физиомонистический пантеизм, согласно которому существует только мир, природа, которую сторонники этого направления называют Богом, тем самым лишая Бога...