[Oracle / Hibernate] 將 DB 資料顯示在 JSP 頁面

  • 123
  • 0

 


環境:

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 設置

<session-factory> 之下插入以下程式碼

<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>