NetBeansのJava EE + JSP + Hibernate + Maven + Spring MVCに基づくWebアプリケヌション開発。 パヌト1

゚ントリヌ



これは、初心者のJava開発者が苊劎しお圹立぀䞀連の蚘事になりたす。 オンラむンストアを䜜成する䟋を瀺したす。

最初に必芁なのはNetBeans 7.3です。 こちらからダりンロヌドできたす。

なぜ圌は正確に EEの初心者には、これが理想的な遞択肢だず思いたす。



䜿甚されるテクノロゞヌ



1NetBeans 7.3;

2Maven;

3䌑止状態。

4Spring MVC;

5JSP + JSTL;

6サヌブレット、セッション、JavaBean、XMLなどに関する知識。

7HTML + CSSあなたの奜みには少し矎しさはありたすが、残された人にお金を払ったほうが良いです-あなたずサヌバヌ偎は十分なトラブルを抱えおいたす;

8Java SEコレクションの知識、䟋倖を凊理する機胜...䞀般に、暙準セット;

9蚭蚈パタヌンの知識DAO、工堎;

10JPA;

11SVN;

12SQLデヌタベヌスを満たすスクリプトを䜜成するため。



コヌドを保存する堎所ず、友人ず共有する方法から始めたしょう。 すべおの初心者がリポゞトリに぀いお知っおいるわけではなく、この郚分は圌らのためのものだず思いたす。



SVN



リポゞトリのようなものがありたす-リモヌトコヌドストレヌゞサヌバヌ。

テスト課題が䞎えられ、それをアヌカむブで送信する堎合、ほずんどの堎合送信されたす。 圌らは送られないかもしれたせんが、きっずあなたに倱望するでしょう。

CVS、SVN、Gitのさたざたなリポゞトリがありたす。 初心者には、SVNが最適だず思いたす。 たあ、あなたにずっおの䞻なこずはそれが䜕であるかを知るこずではなく、それを適甚できるようにするこずです。 これが十分である限り、残りは経隓が必芁です。



そのため、 www.assembla.com /ずいうサむトがありたす。そこで登録する必芁がありたす。 登録埌、このサむトのスタヌトペヌゞでオヌプンリポゞトリを䜜成する必芁がありたす。 登録埌はになりたす。 独自のスペヌスを䜜成したす。



次は公開プロゞェクトで、最初のプロゞェクトはSubversionSVNです。 圌に名前を付けお䜜成を完了したす。 その埌、䞊郚のサむトの黒いバヌにその名前が衚瀺されたす。クリックするず、スペヌスのペヌゞにリダむレクトされたす。 「゜ヌスコヌド/ SVN」タブがありたす。 このタブには、プロゞェクトぞのリンクがありたす。 他のすべおが倱敗した堎合は、 www.youtube.com /でこれを行う方法に関するビデオを芋぀けおみおください。



このすべおの埌、あなたのスペヌスぞのリンクがありたす。 それが䜕であるかを理解するには、プロゞェクトの1぀を取埗するたたはNetBeansで䜕らかの皮類の空のプロゞェクトを䜜成する必芁がありたす。 右ボタンでそれをクリックするず、メニュヌに「バヌゞョン管理」->「Subversionリポゞトリにむンポヌト」が衚瀺されたす。 その埌、リポゞトリぞのパスがあるダむアログボックスが衚瀺されたす-これは、「゜ヌスコヌド」タブでサむトで受信したリンクです。



次に、コミットしたプロゞェクトを完党に削陀したす。 次に、プロゞェクトが保存されおいるフォルダヌに移動し、すべおが本圓に削陀されおいるこずを確認したす。 次に、NetBeansに戻り、メニュヌバヌ[ファむル]、[衚瀺]、[線集]、[遷移]、[゜ヌス]などのパネルにある[グルヌプ]タブを探したす。 そしお、そのサブメニュヌには「取埗」がありたす。 次に、ダむアログボックスで、リポゞトリぞのリンクを指定する必芁がありたすこれは[゜ヌスコヌド]タブでサむトで受信したリンクです。フォルダのダりンロヌドを提案する堎合、リポゞトリツリヌでプロゞェクトを芋぀けお遞択する必芁がありたす。プロゞェクトを収瞮させたす。 これがコヌドの亀換方法です。

プロゞェクトは垞にリポゞトリず同期し、倉曎たたは新しいファむルリポゞトリ䞊のバヌゞョンずは異なるものをマヌクしたす。 曎新するには、コンテキストメニュヌを呌び出す必芁がありたす。[バヌゞョン管理]タブには、プロゞェクトでできるこずの倧きなリストがありたす。 「曎新」ずは、ファむルを曎新するこずです。 「修正」-䜜成したコヌドたたはリポゞトリに倉曎したコヌドを曞き留めたす。 「リセット」-リポゞトリのバヌゞョンに戻り、「比范」-削陀されたものず異なる行ぞの倉曎を衚瀺したす。 これは、垞に䜿甚されるチヌムコヌド亀換方法であり、慣れる必芁がありたす。



開始する



だから、誰かずコヌドを共有し、誰かに芋せたいなら、私たちは今、このためのきれいなツヌルで歊装しおいる。



すでにNetBeansをダりンロヌドし、SVNで遊んでいたす-さあ、仕事に取り掛かりたしょう。 プロゞェクトを䜜成したす。 [プロゞェクトの䜜成]をクリックしお、Maven-> Webアプリケヌションを遞択したす。 あなたが望むものず呌んでください、それはすべおあなたの空想です。 したがっお、Webアプリケヌションがあり、プロゞェクトのアセンブリが進行䞭であり、目暙があり、それを実装する方法を考えたす。 ぀たり、開発者は、アプリケヌションの倖芳、アヌキテクチャ、パッケヌゞツリヌなどを怜蚎する必芁がありたす。 ここでのコヌドの合蚈行数は玄4000行です。事前に矎しいアヌキテクチャに泚意する方がよいでしょう。そうしないず、䜕がどのように機胜するか、たずえば、最埌に賌入したアむテムをどのように奇跡的に衚瀺するかを、賌入の合蚈量を考慮しお理解できたせん。 そしお、䜕かを完了たたは远加するように求められた堎合、最初からすべおを曞く方が簡単であるこずがわかりたす。



そしおもちろん、行動蚈画を立おる必芁がありたす。



だからアクションプラン


1゚ンティティ゚ンティティ-゚ンティティを蚘述したす。 これはPOJOです。アノテヌション@Entityを䜿甚するか、XMLを介しおデヌタベヌスに関連付けられたクラスです。 JPAを䜿甚するため、javax.persistenceをむンポヌトする必芁がありたす。* Hibernate Persistence APIを䜿甚しないでください。䜿甚しおからORMラむブラリを倉曎する堎合、クラスを曞き換える必芁があり、JPAはSunの暙準です。 JPAに぀いおは、あなた自身の蚀葉で蚀うこずができたすこれは*長生き*オブゞェクトを操䜜するためのAPIを提䟛するラむブラリです。぀たり、オブゞェクトをデヌタベヌスに䟿利に保存できたす。 私はアドバむスをするこずができたすこれのために別のパッケヌゞを䜜成し、゚ンティティたたはドメむンに名前を付けたす-あなたが望むように、䞻なこずはあなたにそれを明確にするこずです。 最終的には、edu.shop.model.domain.Customer.java edu.shop.model.domain.Notebook.javaのようになりたす。

この項目を怜蚎するずきは、盎接詳现に説明したす。 ここでのタスクは、アクションプランを掚定するこずです。



2HibernateUtilを䜜成したす䞀般に、接尟蟞たたは接頭蟞Utilは、このクラスのコヌドが普遍的であり、倚くのクラスで䜿甚されるこずを意味したす。

そのため、HibernateUtilでSessionFactoryをホストしたす。 圌はヘビヌ玚です。 このコヌドは、理論的には、起動時にデヌタベヌスぞの接続を確立し、デヌタベヌスずのセッションのみを提䟛するため、アプリケヌション党䜓から独立しおいる必芁がありたす。 たた、このクラスに゚ンティティクラスを登録したす。 このクラスに぀いおは埌で詳しく説明したす。 edu.shop.model.hbutil.HibernateUtil.javaなどの別のパッケヌゞにも入れたす



3DAOを䜜成したす。

䜕を曞くの デヌタベヌスから取埗したいものを曞いおいたすが、このデヌタがどうなったのかを考える必芁はありたせん。結果は重芁です。 たずえば、ProductDAOむンタヌフェむスを定矩し、メ゜ッドを蚘述したす

リスト<AnyEntity <>> getAllProducts; 次に、実装ProductDAOImplを䜜成したす。



アむデアは䜕ですか このアプリケヌションを䜜成した堎合、「ミカ、デヌタベヌスから次のデヌタが必芁です。デヌタベヌスにあるすべおの商品」ず蚀うでしょう。 「質問なし」ず答えたす。 次に、次のむベントの開発コヌド内にあり、デヌタベヌスにク゚リを実行する必芁がある堎合は、次のように蚘述したす



*メ゜ッドぞのアピヌル* .getAllProducts; -そしお、あなたはコンパむラが誓わないこずがわかりたす、そしお、私はただこのむンタヌフェヌスの実装を曞く時間がないかもしれたせん。 そしお、結果は䜕ですか すべおをコンパむルしたしたが、動䜜するコヌドすらありたせん。 ここでは、EnumずFactoryパタヌンなどを適甚したすが、すべおに時間がありたす。 䟋倖凊理に特別な泚意を払い、少なくずも゚ラヌペヌゞを生成する必芁があるのはDAOです。 壊れたコヌドをすぐに芋぀けるこずができたす。 それ以倖の堎合は、単にデバッグに苊しみたす。



3Spring MVCずの䜜業はここから始たりたす。 これは長い話であり、別の蚘事でこれに専念したす。 私はすぐに蚀わなければならない-これはこのアプリケヌションで最も困難です。 しかし、より単玔なオプション、MVCパタヌンを気にせずにすべおを衚瀺する方法を玹介したす。

スクリプトレットの䜿甚方法を芋おみたしょう。



4ここに、あらゆる皮類のグッズをプロゞェクトに远加する補助クラスがありたす。賌入総額の蚈算。 最埌に賌入したアむテム メ゜ッドに圹立぀補助倉数。たずえば、デヌタベヌスから5000 UAH以䞋、たたは500以䞋の安䟡なデヌタを出力したす。 すべおのAsusラップトップの出力。 この項目は、前の項目ず密接に関連しおいたす。



ずりあえずこれに぀いお詳しく芋おいきたしょう。 残りの郚分に぀いおは少し埌で説明したす。 だから、私たちは蚈画された蚈画を持っおいたす、その実装に進みたしょう。



゚ンティティ



プロゞェクトを䜜成し、゚ンティティを含むパッケヌゞを䜜成したした。 edu.shop.entityにしたす。 そこで、次のクラスを䜜成したす。



ご泚意 賌入した商品が保存されるバスケットは、デヌタベヌスのテヌブルのようなものになりたす。その䞊で、デヌタベヌスを操䜜するための基本をいく぀か瀺したす。 実際のケヌスでは、コレクションを䜿甚しお商品を保管する方が適切です。



1補品

2ノヌト

3カメラ

4予玄

5ケヌブル

6顧客

7カヌト



゚ンティティクラスずは䜕かに぀いお少し話したしょう。

゚ンティティ-アノテヌション@EntityたたはXMLを䜿甚しおデヌタベヌスに関連付けられたPOJOクラス。 このようなクラスには次の芁件が課されたす。



-空のコンストラクタヌpublicたたはprotectedが必芁です;

-ネスト、むンタヌフェむス、たたは列挙できたせん。

-ファむナルにするこずはできず、ファむナルフィヌルド/プロパティを含めるこずはできたせん。

-少なくずも1぀の@ Idフィヌルドが含たれおいる必芁がありたす。



この堎合、゚ンティティは次のこずができたす。



-空でないコンストラクタヌが含たれたす。

-継承され、継承される。

-他のメ゜ッドを含み、むンタヌフェヌスを実装したす。



゚ンティティは盞互に関連付けるこずができたす。1察1、1察倚、倚察1、および倚察倚です。



泚釈を䜿甚したす。 そしお、すぐに2぀の方法で説明する機䌚がありたす。 フィヌルドのすぐ䞊に泚釈を曞くか、ゲッタヌの䞊に泚釈を曞きたす。 私は䞀぀のこずを蚀いたすゲッタヌに正しく曞くために、あなたはGoogleで理由を尋ねたす。 ここですべおのトピックを完党に説明するこずはできたせん。



もう1぀蚀いたいこずがありたす。 これを行うには、゚ンティティクラスを蚘述する2぀の䟋を瀺す必芁がありたす。 最初の䟋

コヌド自䜓にコメントを曞きたした。



import java.io.Serializable; import javax.persistence.*; import javax.validation.constraints.Size; /** * * @author Mikhail Shumenko */ @Entity //   ,     . @Table(name = "CART")//    ,           CART // ,    ,     ,       //    public class CartEntity implements Serializable { //     .     // Id  @Id //,            Id //     ,        . @Column(name = "ID") //   ))     ?     //@GeneratedValue(strategy=GenerationType. TABLE  AUTO)  //   , Id    1    . //   20   ,    1  20. //   , id       - 345768. //   ,    id          . //  SEQUENCE,      Derby,       . // ,  .      @TableGenerator(name = "cartid", table = "cartpktb", pkColumnName = "idCart", pkColumnValue = "idCartValue",allocationSize = 1) @GeneratedValue (strategy = GenerationType.TABLE, generator = "cartid") private Integer id; //  .    25 . @Size(max = 25) @Column(name = "NAMEITEM") //    String,        VARCHAR(  Derby) // Integer,   ,      Integer //boolean  Derby -     SMALLINT private String nameItem; @Column(name = "PRICE") private Integer price; public CartEntity() { } public CartEntity( String nameItem, int price) { this.nameItem = nameItem; this.price = price; } public CartEntity(Integer id,String nameItem, int price) { this.id=id; this.nameItem = nameItem; this.price = price; } public CartEntity(Integer id) { this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNameItem() { return nameItem; } public void setNameItem(String nameItem) { this.nameItem = nameItem; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } }
      
      







2番目の方法ゲッタヌを䞊曞きしたす。 コヌドの説明を芋おください。



 import java.io.Serializable; import javax.persistence.*; /** * * @author miha */ @Entity //,     @Table //Hibernate    . public class Product implements Serializable { private Integer id; private String nameProduct; private Integer availableProduct; @Id @GeneratedValue(strategy = GenerationType.AUTO) //  Id  , ,         . public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNameProduct() { return nameProduct; } public void setNameProduct(String nameProduct) { this.nameProduct = nameProduct; } public Integer getAvailableProduct() { return availableProduct; } public void setAvailableProduct(Integer availableProduct) { this.availableProduct = availableProduct; } }
      
      







したがっお、゚ンティティクラスの2぀の䟋がありたす。 これらの䟋を䜿甚しお残りを䜜成したす。 次のようなフィヌルドモデル、発行幎、名前、コスト-すべおあなたの想像力に。 必ず[利甚可胜]フィヌルド翻蚳で利甚可胜を含めおください。 埌で䟿利になりたす。 ブヌル倀にしお、quantityずいう名前の列を远加できたす。 これはすべお䟿利です。



次に、HibernateUtilの䟋を瀺したす



 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.shumenko.hibernate; import edu.shumenko.entity.BookEntity; import edu.shumenko.entity.CableEntity; import edu.shumenko.entity.CameraEntity; import edu.shumenko.entity.CartEntity; import edu.shumenko.entity.CustomerEntity; import edu.shumenko.entity.NotebookEntity; import edu.shumenko.entity.ProductEntity; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; /** * Hibernate Utility class with a convenient method to get Session Factory * object. * * @author Mikhail Shumenko */ public class HibernateUtil { //  SessionFactory. private static final SessionFactory sessionFactory; static { try { //   AnnotationConfiguration AnnotationConfiguration ac = new AnnotationConfiguration(); //    ,       . //  Entity   ,   -   . ac.addAnnotatedClass(ProductEntity.class).addAnnotatedClass(BookEntity.class).addAnnotatedClass(CableEntity.class) .addAnnotatedClass(CameraEntity.class).addAnnotatedClass(NotebookEntity.class). addAnnotatedClass(CartEntity.class).addAnnotatedClass(CustomerEntity.class); //       . //  .       //   ,  ,        . sessionFactory = ac.configure().buildSessionFactory(); } catch (Throwable ex) { // Log the exception. System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
      
      







DAO



次のパヌトに進みたしょう。 DAOずは䜕ですか。 これはデザむンパタヌンです。



その意味

-システム内のデヌタベヌスぞのすべおのアクセスは、カプセル化のためにDAOを介しお行われたす。

-各DAOむンスタンスは、1぀のプラむマリドメむンオブゞェクトたたぱンティティを担圓したす。 ドメむンオブゞェクトに独立したラむフサむクルがある堎合は、独自のDAOが必芁です。

-DAOは、ドメむンオブゞェクトの䜜成、読み取り䞻キヌによる、曎新、および削陀぀たり、CRUD䜜成、読み取り、曎新、削陀の操䜜を担圓したす。

-DAOは、䞻キヌ以倖の基準に基づいお芁求を蚱可する堎合がありたす。 ファむンダヌやファむンダヌなどのメ゜ッドを参照したす。 通垞、finderメ゜ッドは、DAOが担圓するドメむンオブゞェクトのコレクションを返したす。

-DAOは、トランザクション、セッション、たたは接続を凊理したせん。 これは、柔軟性を提䟛するためにDAOの倖郚で行われたす。

詳现は垞にGoogleに䌝えたす。



今のずころ、補品のDAOを䜜成したす。

だから、私たちが䜕が必芁なのかを考えおください。 Productテヌブルには、Id、nameProduct、available + amount + actionForServletの4぀のフィヌルドがありたす。 りェブサむトでカテゎリを䜜成するために必芁になりたす。 最埌のフィヌルドに぀いおはただ気にしたせん。 必芁なのは、補品のリストを取埗するこずだけです。



むンタヌフェむスを曞く

 public interface ProductDAO { ProductDAO INSTANCE_PRODUCT= new ProductDAOImpl(); List<Product> getProducts(); //       }
      
      







むンタヌフェヌスの実装。 説明に぀いおは、コヌドを参照しおください。

 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.shop.model.dao; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; /** * * @author Mikhail Shumenko */ public class ProductDAOImpl implements ProductDAO { @Override public List<Product> getProducts() { List<Product> result = null; // ,      // ,  -    ,     ,    . Session session = HibernateUtil.getSessionFactory().openSession(); try { session.beginTransaction().begin(); //Criteria          // , ,    //    -,  .       Cart   //   Cart.class Criteria criteria = session.createCriteria(Product.class); result = (List<Product>) criteria.list(); session.getTransaction().commit } catch (Exception e) { //   .        . e.printStackTrace(); }finally { if (session != null) session.close(); } return result; } }
      
      







そのため、デヌタベヌスからデヌタを受信する機䌚が埗られたした。 スクリプトレットを䜿甚しお、簡単なfor-eachルヌプを䜜成し、index.jspペヌゞに補品を衚瀺できたす。



 <table border="2" width="2" cellspacing="2" cellpadding="2"> <thead> <h3></h3> </thead> <tbody> <tr> <th></th> //INSTANCE_PRODUCT    ? // ProductDAO   ,    ProductDAOImpl //     -,     . //ProductDAO INSTANCE_PRODUCT= new ProductDAOImpl(); <% for (Product product :ProductDAO.INSTANCE_PRODUCT.getProducts()) {%> <td><a href="<%=product.getActionForServlet()%>"><%=product.getName()%></a></td> <%}%> </tr> <tr> <th></th> <% for (Product product : ProductDAO.INSTANCE_PRODUCT.getProducts()) {%> <td><%=product.getAvailable()%></td> <%}%> </tr> </tbody> </table>
      
      







しかし、これは初めおですが、䞀般的にそうするこずは悪いです。 これは、MVCパタヌンに違反しおいたす。 正しく行う方法次のレッスンで招埅されたら説明したす。 2番目のレッスンではSpringを扱い、3番目のレッスンではFactoryパタヌンに觊れお、䌑止状態を掘り䞋げたす。 せっかちな人のために、デヌタベヌスから削陀し、デヌタベヌスに保存し、デヌタベヌスからすべおを完党に削陀する方法を玹介したす。 さお、それをすべおアプリケヌション党䜓ずやり取りし、埌で詳现なレビュヌを残す方法。



DBに保存



 public void addItemToCart(CartEntity cart) { Session session = HibernateUtil.getSessionFactory().openSession(); try { session.beginTransaction().begin(); session.save(cart); session.getTransaction().commit(); } catch (Exception ex) { ex.printStackTrace(); } finally { if (session != null) { session.close(); } } }
      
      







IDでデヌタベヌスから削陀



 public void deleteItemFromCart(Integer id) { Session session = HibernateUtil.getSessionFactory().openSession(); try { session.beginTransaction().begin(); CartEntity itemDelete = (CartEntity) session.get(CartEntity.class, id); session.delete(itemDelete); session.getTransaction().commit(); } catch (Exception ex) { ex.printStackTrace(); } finally { if (session != null) { session.close(); } } }
      
      







デヌタベヌスからIDを削陀しおいたす。



  public void deleteAllItemToCart(List<Integer> idAllItemsInCart) { Session session = HibernateUtil.getSessionFactory().openSession(); try { session.beginTransaction().begin(); for(Integer id:idAllItemsInCart){ CartEntity itemDelete = (CartEntity) session.get(CartEntity.class, id); session.delete(itemDelete); } session.getTransaction().commit(); } catch (Exception ex) { ex.printStackTrace(); } finally { if (session != null) { session.close(); } } }
      
      







Hibernate蚭定ファむルも必芁になりたす。 ダヌビヌにショップを䜜成したす。 ナヌザヌ名ずパスワヌドは、それぞれrootずpassです。 うたくいかない堎合-動揺しないでください-これに時間をかけたす。



 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property> <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> <property name="hibernate.connection.url">jdbc:derby://localhost:1527/shop</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">pass</property> <property name="connection.characterEncoding">UTF-8</property> <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration>
      
      







デヌタベヌスの蚘入方法に぀いおは埌で説明したす。 手動で入力できたす。 たたは、次のレッスンを埅ちたす。



All Articles