目標:
- 通過如下調用過程完成使用者資訊的添加,在JSP頁面輸入使用者資訊,提交給Servlet,Servlet調用會話Bean,會話Bean調用實體類。
- 掌握JPA的基本概念。
包括兩部分內容:
添加功能的開發過程如下:
- 在UserSession會話Bean中添加業務方法
- 編寫輸入使用者資訊的介面addUser.jsp
- 編寫添加功能的控制器AddUserServlet.java
JPA概述的內容包括:
- 使用JPA完成與資料庫的互動,與使用JDBC完成與資料庫的互動,這兩種方式之間的區別
- Java持久性要解決的問題
- 編寫實體類需要編寫的檔案
- 如何訪問實體類
- 常用的JPA介面
下面分別進行介紹。注意:本次內容的執行個體基於第一講。
第一部分:添加功能
在UserSession會話Bean中添加業務方法首先需要在業務介面中添加方法的聲明,然後在Bean類中實現該方法。在業務介面UserManagerRemote.java中添加如下方法聲明: public void addUser(String userid,String username,String userpass,char usertype);在Bean類UserManagerBean.java中添加如下方法: public void addUser(String userid,String username,String userpass,char usertype){ Userinfo user = new Userinfo(userid,username,userpass,usertype); em.persist(user); }em是上一次執行個體中在Bean類中注入的EntityManager對象,persist方法完成持久化,相對於資料庫的插入操作。通過這個方法對象user中的資訊就被寫入到資料庫了。
編寫輸入使用者資訊的介面addUser.jsp在UserWeb中添加JSP檔案,用於添加使用者資訊,代碼如下:<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%--The taglib directive below imports the JSTL library. If you uncomment it,you must also add the JSTL library to the project. The Add Library... actionon Libraries node in Projects view can be used to add the JSTL 1.1 library.--%><%--<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> --%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>JSP Page</h1> <form action="AddUserServlet" method="POST"> 使用者ID:<input type="text" name="userid" value="" /><br> 使用者名稱:<input type="text" name="username" value="" /><br> 口令:<input type="password" name="userpass" value="" /><br> 許可權:<select name="usertype"> <option value="0">普通使用者</option> <option value="1">管理員</option> </select><br> <input type="submit" value="提交" /><input type="reset" value="重設" /> </form> </body></html>其中紅色部分的代碼聲明了要提交給AddUserServlet進行處理。
編寫添加功能的控制器AddUserServlet.javaAddUserServlet控制器完成的功能如下:u 擷取使用者輸入的資訊u 調用業務方法u 轉向顯示資訊的介面AddUserServlet的代碼如下(紅色部分是需要自己添加的代碼):/* * AddUserServlet.java * * Created on 2007年5月23日, 上午6:22 */ package jpa.web; import java.io.*;import java.net.*; import javax.servlet.*;import javax.servlet.http.*;import javax.ejb.EJB;import jpa.UserManagerRemote; /** * * @author Administrator * @version */public class AddUserServlet extends HttpServlet { @EJB UserManagerRemote user; /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String userid = request.getParameter("userid"); String username = request.getParameter("username"); String userpass = request.getParameter("userpass"); String usertype = request.getParameter("usertype"); user.addUser(userid,username,userpass,usertype.charAt(0)); RequestDispatcher rd = request.getRequestDispatcher("FindAllUserServlet"); rd.forward(request,response); } // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** Returns a short description of the servlet. */ public String getServletInfo() { return "Short description"; } // </editor-fold>}
測試重新部署EJB和Web應用,然後訪問:http://localhost:8080/UserWeb/addUser.jsp。在這個介面輸入一個使用者資訊,然後提交,提交之後可以看到新添加的使用者。
第二部分:JPA概述
JPA與JDBC的比較以前我們通過JDBC完成與資料庫的互動,基本過程如下:n 載入驅動程式;n 建立串連n 編寫SQL語句n 建立語句對象;n 執行SQL語句;n 對結果進行處理使用JPA完成查詢的過程如下:em.createQuery(…).getSingleResult()或者em.createQuery(…).getResultList()使用JPA完成添加的過程如下:em.persist(User)相比之下,使用JPA大大減少了編程人員的工作量。但前提是由持久性提供者提供很多實現,編程人員需要編寫實體類。下面介紹持久性提供者需要解決的主要問題以及如何編寫實體類。
Java持久性要解決的問題簡單的說,Java持久性要解決的主要問題就是內容中對象與資料庫中實體之間的同步,涉及的主題如下:n 資料庫資訊配置,包括資料庫位置、名字、使用者名稱和口令等,另外需要JDBC驅動程式;n 對象資料的載入,從實體到對象;n 實體資料的更新,從對象到實體;n 資料的查詢,從資料庫載入資料;n 資料庫中實體的關係與記憶體中對象之間關係的映射;n 批量處理,包括大量新增、刪除、修改等;n 安全問題;n 事務問題。
如何編寫實體類所有的實體類應該有一個持久單元來管理,持久單元在一個xml文檔中聲明。下面的代碼就是前面執行個體中用到的設定檔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="UserPU" transaction-type="JTA"> <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> <jta-data-source>entity2</jta-data-source> <properties> <property name="toplink.ddl-generation" value="create-tables"/> </properties> </persistence-unit></persistence>最主要的作用就是聲明持久單元對應的資料庫,通常使用資料來源的名字來確定。另外可以聲明有哪些實體類。實體類用於表示資料庫中的表,實體類的編寫主要確定如下資訊:n 該實體與資料庫中的哪個表對應;n 實體類中的屬性與表中的哪個欄位對應;n 實體類中的哪個屬性是主鍵。編寫實體類的時候的主要知識點包括:聲明該類為實體類:@Entity聲明該實體類與哪個表對應:@Table(name = "userinfo")聲明該實體類與表中的哪個列對應: @Column(name = "userid", nullable = false) private String userid; @Column(name = "username", nullable = false) private String username; @Column(name = "userpass", nullable = false) private String userpass; @Column(name = "usertype", nullable = false)private char usertype;聲明該實體類的主鍵: @Id @Column(name = "userid", nullable = false) private String userid;完整的代碼參考第一講。
如何訪問實體類從前面的查詢所有使用者的功能和添加使用者的功能可以看出,對實體的操作主要是通過EntityManager介面完成,如果要查詢,需要使用Query介面。
常用的JPA介面常用的介面如下:EntityManager介面,完成實體的管理,包括建立查詢、刪除實體、查詢實體和添加實體等。Query介面,完成各種查詢,通常有EntityManager建立,主要使用JPA的查詢語言完成,也可以使用標準的SQL語言。EntityManagerFactory介面,用於建立EntityManager,如果不能注入EntityManager,需要使用EntityManagerFactory建立。Persistence介面,用於建立EntityManagerFactory對象。
更多內容可以參考《Java EE 5實用教程——基於WebLogic和Eclipse》