Home Java Java Web Programming การใช้ Datastore ของGoogle App Engine โดยใช้ JPA
Add Site to FavoritesAdd Page to FavoritesMake HomepageShare This PageEmail This PagePrint This PageSave Page as PDF
Back to Top

Designed by:
VPS hosting Joomla Templates
Web hosting services
การใช้ Datastore ของGoogle App Engine โดยใช้ JPA PDF Print E-mail
Written by Administrator   
Monday, 28 September 2009 16:05

Google App Engine สนับสนุนการเขียนโปรแกรมการจัดการฐานข้อมูลโดยการกำหนดมาตรฐานไว้สองแบบคือ Java Data Objects (JDO) และ Java Persistence API (JPA) ซึ่งทั้งสองแบบนี้จะใช้แพลตฟอร์มของ DataNucleus Access การเก็บข้อมูลวิธีนี้จะใช้วิธีแบบ Object Database ซึ่งแตกต่างจาก RDBMS ทั่วๆไป ดังนั้นผู้พัฒนาโปรแกรมที่ใช้ RDBMS อาจจะต้องปรับแนวคิดการเก็บข้อมูลใหม่เพื่อให้พัฒนา Google Web Application เป็นไปได้ง่ายขึ้น

 

แบบฝึกหัดนี้จะเป็นตัวอย่างการเก็บข้อมูลผู้เข้ามาชมเว็บเพจ (Guestbook) โดยใช้ JPA โดยโปรแกรมจะทำการสร้าง Entity ที่ชื่อ GuestList แล้วเขียนโปรแกรมเพื่อเก็บและแสดงข้อมูลของผู้เข้ามาชม โดยใช้ Google Account ในการ signin โดยมีขั้นตอนการพัฒนาโปรแกรมดังนี้

  • การสร้าง Persistence Unit
  • การพัฒนาโปรแกรม GuestList Entity Class
  • การพัฒนาโปรแกรม EMF.java
  • การพัฒนาโปรแกรม SignGuestListServlet เพื่อรันบน Google App Engine
  • การพัฒนาโปรแกรมเพื่อแสดงรายละเอียด GuestList

เราสามารถทดสอบโปรแกรมนี้ได้ที่นี

ผู้สนใจสามารถ ดาวน์โหลดเอกสารที่เป็นไฟล์ PDF ได้ที่นี่ => JPAGoogle.pdf


โปรเจ็คไฟล์สำหรับ NetBeans และ Sourcecode สามารถดาวน์โหลดได้ที่นี่ => JPAGoogle.zip

 

 

sourcecode สำหรับ persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">
  <persistence-unit name="transactions-optional">
    <provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
    <non-jta-data-source/>
    <properties>
      <property name="datanucleus.ConnectionURL" value="appengine"/>
      <property name="datanucleus.NontransactionalRead" value="true"/>
      <property name="datanucleus.NontransactionalWrite" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

 

sourcecode สำหรับไฟล์ EMF.java
package entity;
 
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
 
public class EMF {
 
    private static final EntityManagerFactory emfInstance =
            Persistence.createEntityManagerFactory("transactions-optional");
 
    private EMF() {
    }
 
    public static EntityManagerFactory get() {
        return emfInstance;
    }
}

 


 

sourcecode ของเมธอด processRequest ของไฟล์ SignGuestListServlet
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
 
        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
 
 
        String content = request.getParameter("content");
        Date date = new Date();
 
        String url = request.getRequestURI();
        String msg;
        if (user != null) {
            msg = "<p>Welcome, " + user.getNickname() + "! You can <a href=\"" +
                    userService.createLogoutURL(url) +
                    "\">sign out</a>.</p>";
        } else {
            msg = "<p>Welcome! <a href=\"" + userService.createLoginURL(url) +
                    "\">Sign in or register</a> to customize.</p>";
        }
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet TimerServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println(msg);
        out.println("</body>");
        out.println("</html>");
 
 
 
        GuestList guest = new GuestList(user, content, date);
 
        EntityManager em = EMF.get().createEntityManager();
        try {
            em.persist(guest);
        } finally {
            em.close();
        }
 
       out.close();
    }

 

sourcecode ของเมธอด processRequest สำหรับไฟล์ GuestDisplayServlet
 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
 
        EntityManager em = EMF.get().createEntityManager();
        try {
            Query query = em.createQuery("SELECT o FROM GuestList AS o");
            @SuppressWarnings("unchecked")
            List<GuestList> results = (List<GuestList>) query.getResultList();
 
 
            out.println("<html>");
            out.println("<head>");
            out.println("<title>List All Guests</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>List All Guests</h1>");
            for (Object obj : results) {
                GuestList guest = (GuestList) obj;
                String nickname;
                if (guest.getAuthor() == null) {
                    nickname = "Anonymous";
                } else {
                    nickname = guest.getAuthor().getNickname();
                }
 
                out.println(nickname  + " "  + guest.getId());
                out.println(" "  + guest.getContent() + " " + guest.getVisitDate() + "<br>");
            } 
 
            out.println("</body>");
            out.println("</html>");
        } catch(Exception ex) {
            out.println(ex);
        } finally {
            em.close();
            out.close();
        }
    }
 

 


 




Powered by jWarlock jwFacebook Comments
Last Updated on Thursday, 29 October 2009 07:50
 

Add comment


Security code
Refresh

Thai Java Developers, Powered by Joomla! and designed by SiteGround web hosting