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

10 чел.

Лабораторна робота №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 для роботи з базами даних.


 

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

11155. Ліквідація господарського товариства 38 KB
  Ліквідація господарського товариства Припинення діяльності товариства відбувається шляхом його реорганізації злиття приєднання поділу виділення перетворення або ліквідації з дотриманням вимог антимонопольного законодавства. Стаття 91. Припинення діяльності г
11156. Надання товариством інформації своїм акціонерам 83.5 KB
  Надання товариством інформації своїм акціонерам Відповідно до діючого законодавства України існує кілька способів надання акціонерним товариством інформації своїм акціонерам: публікація в офіційних виданнях. Згідно із Законом України Про цінні папери
11157. Організаціяпроцедури реорганізації господарсьих товариств 69 KB
  Організаціяпроцедури реорганізації господарсьих товариств Для багатьох українських підприємств питання проведення реорганізації є стратегічним оскільки сприяє зміцненню позицій на ринку поглибленню та розширенню спеціалізації виробництва зниженню виробничих ви...
11158. Основні аспекти Закону України Про акціонерні товариства 73.5 KB
  Основні аспекти Закону України Про акціонерні товариства 22 жовтня 2008 Президент України підписав Закон Про акціонерні товариства далі Закон про АТ. Закон про АТ був опублікований в офіційному виданні 29 жовтня 2008 року і набрав чинності через 6 місяців з дати його
11159. Підготовка до проведення зборів акціонерів 113 KB
  Підготовка до проведення зборів акціонерів Загальні збори скликаються не менше одного разу на рік за рішенням або правління з обов'язковим узгодженням порядку денного з Спостережною радою або самої Спостережної ради. Рішення про проведення зборів повинне врахо
11160. Поняття значної угоди корпорації 43 KB
  Поняття значної угоди корпорації Акціонерне товариство є однією з найпоширеніших організаційноправових форм господарських товариств як в Україні так і в Росії. Відносна прозорість господарської діяльності акціонерних товариств і певна доступність даних про скла...
11161. Публічне та приватне акціонерні товариства 80.5 KB
  Публічне та приватне акціонерні товариства Правове положення акціонерного товариства Акціонерним товариством є комерційна організація статутний капітал якої розділено на визначену кількість акцій які засвідчують права учасників товариства по відношенню до то
11162. Роль депозитарної системи в корпоративному управлінні 52 KB
  ТЕМА 8. Роль депозитарної системи в корпоративному управлінні 8.1. Сутність депозитарної системи Національна депозитарна система створена для централізованого й ефективного обслуговування різних операцій з цінними паперами на території України. Існування такої...
11163. Система розкриття інформації акціонерним товариством 72.5 KB
  Система розкриття інформації акціонерним товариством Система корпоративного управління повинна забезпечувати своєчасне й точне розкриття інформації з усіх найважливіших питань що стосуються акціонерного товариства включаючи його фінансовий стан продуктивніст