環境:
Eclipse 2020–06
Java Open JDK 11
Hibernate 5.4
Oracle 18c
Tomcat 9.0
資料庫設置:
創建一個名為 ARTPRODUCT 的 Table,將 APID 欄位設為 PK。
此 Table 名稱必須和 Bean 的 Class 名稱相同,其欄位名稱須和該 Class 的屬性名稱相同。
CREATE TABLE ARTPRODUCT (
APID varchar2(50),
APTITLE varchar2(200),
APTYPE varchar2(50),
APPRICE number(12,2),
APIMG varchar2(200),
APDES CLOB,
APNUM number(8,2),
PRIMARY KEY(APID))
Servers 設定:
context.xml 設置
於<WatchedResource>WEB-INF/web.xml</WatchedResource>之前插入以下程式碼
注意 name 需與 web.xml 和 hibernate.cfg.xml 中的 name 一致。
username 和 password 應隨著資料庫帳號密碼更改。
<Resource name="jdbc/xe"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="hr"
password="hr"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@//localhost:1521/XEPDB1" />
web.xml 設置
於</web-app>前插入以下程式碼
<res-ref-name>須和 hibernate.cfg.xml 與 context.xml 中的 name 一致
<resource-ref>
<description>Oracle DataSource Example</description>
<res-ref-name>jdbc/xe</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
hibernate.cfg.xml 設置
在 之下插入以下程式碼
<property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property>
<property name="hibernate.connection.datasource">java:comp/env/jdbc/xe</property>
<property name="hibernate.current_session_context_class">thread</property>
創建 Bean Class
按使用的 Table 創建與 Table 同名的 Class 和 與Table 欄位同名的屬性 (屬性名稱開頭務必小寫)
在 Class 上方加入 @Entity 和 @Table(name = "此處名稱需與 class 一致,但使用小寫")
生成各屬性的 get 與 set 方法後,於 get 方法上方加入 @Column (name = "與 Table 一致之欄位名稱"),
設為 PK 的欄位需寫上 @Id
(下方為部分程式碼)
@Entity
@Table(name = "artproduct")
public class Artproduct {
private String apId;
private String apTitle;
private String apType;
private int apPrice;
private String apImg;
private String apDes;
private int apNum;
@Id @Column(name = "APID")
public String getApId() {
return apId;
}
public void setApId(String apId) {
this.apId = apId;
}
@Column (name = "APTITLE")
public String getApTitle() {
return apTitle;
}
public void setApTitle(String apTitle) {
this.apTitle = apTitle;
}
將此 Class 註冊到 hibernate.cfg.xml
於 cfg.xml 檔中添加下面的程式碼
<mapping class="package名稱.Artproduct"/>
隨便的創建一個可以列出所有資料庫物件的 DAO
List < 寫上 Class 名稱>
session.createQuery("From 上面創建的 Class 名稱", 上面創建的 Class 名稱.class)
public class ArtProductDAO {
private Session session;
public ArtProductDAO(Session session) {
this.session = session;
}
public List<Artproduct> selectAll() {
Query<Artproduct> query = session.createQuery("From Artproduct", Artproduct.class);
List<Artproduct> list = query.list();
return list;
}
}
創建 Servlet
創建一個有 doGet 和 doPost 方法的 servlet 檔案,
在 servlet 中新增 processAction 方法 (非新增在 doGet 和 doPost 方法中)。
在 doGet 和 doPost 方法 中撰寫 processAction 方法processAction(request, response);
設置 Bean 使其可在 jsp 中使用的方法為request.setAttribute("於jsp中使用的 Bean 名稱", 被設置的物件);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processAction(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processAction(request, response);
doGet(request, response);
}
private void processAction(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
SessionFactory factory = HibernateUtil.getFactory();
Session session = factory.getCurrentSession(); //取得 session
session.beginTransaction(); //開啟交易
ArtProductDAO hDAO = new ArtProductDAO(session); //創建上方設定的 DAO 物件
List<Artproduct> list = hDAO.selectAll(); // 呼叫 DAO 中的 selectAll()方法
request.setAttribute("beanList", list); // 設置 Bean
session.getTransaction().commit(); // 確認交易
HibernateUtil.closeSessionFactory(); // 關閉 session
RequestDispatcher rd = request.getRequestDispatcher("Demo.jsp"); //指定頁面跳轉至 Demo.jsp
rd.forward(request, response);
return;
}
創建 JSP (命名為 Demo.jsp)
使用 <c:forEach var="自己取一個名稱" varStatus="stat" items="${上方設置的 Bean 名稱}">
列出 list 物件中的每一項,
${searchAP.apId} 為取得其中列出的一項之 apId 屬性,
使用方法為 ${上面那行你取的名稱.Artproduct中的 get 方法去掉 get 之後的文字(此處字首務必小寫) }。
例如原本為 .getApTitle() ,就改為 apTitle
記得確認 JSP 檔最上方有加入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
完成之後在 servlet 頁面啟動 Servers 即可。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<tr>
<th>貨號</th>
<th>商品名稱</th>
<th>售價</th>
<th>庫存</th>
</tr>
<c:forEach var="searchAP" varStatus="stat" items="${beanList}">
<tr>
<td>${searchAP.apId}</td>
<td>${searchAP.apTitle}</td>
<td>${searchAP.apPrice}</td>
<td>${searchAP.apNum}</td>
</tr>
</c:forEach>
</table>
</body>
</html>