JSF – Làm việc với CƠ SỞ DỮ LIỆU
JSF – Làm việc với CƠ SỞ DỮ LIỆU
Trong bài này, chúng ta làm việc với JSF kết nối cơ sở dữ liệu sử dụng JDBC thể liệt kê 1 bảng dữ liệu, thêm mẫu tin mới, cập nhật thông tin của dòng dữ liệu cũng như xóa 1 dòng dữ liệu. Giả sử Database được thiết kế như sau:
Sau khi hoàn tất, ta có giao diện như sau:
Khi nhấn link “Insert New” sẽ cho ta trang thêm Lớp học mới
Khi nhấn Link Edit, sẽ load thông tin của dòng được chọn và cho hiệu chỉnh
Khi nhấn link Delete, sẽ xóa dòng được chọn.
Trong ví dụ này tôi dùng NetBeans IDE để thiết kế (Eclipse hay IDE khác cũng vậy)
Bước 1: Tạo 1 Web Application mới, chọn Framework là Java Server Faces như hình
Bước 2: Tạo Manage-bean
package vovanhai.wordpress.com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.event.ActionEvent;
/**
*
* @author VoVanHai
*/
public class LophocBean {
private String msLop;
private String tenLop;
private String tenGVCN;
/** Creates a new instance of LophocBean */
public LophocBean() {
}
public LophocBean(String msLop, String tenLop, String tenGVCN) {
this.msLop = msLop;
this.tenLop = tenLop;
this.tenGVCN = tenGVCN;
}
public String getMsLop() {
return msLop;
}
public void setMsLop(String msLop) {
this.msLop = msLop;
}
public String getTenGVCN() {
return tenGVCN;
}
public void setTenGVCN(String tenGVCN) {
this.tenGVCN = tenGVCN;
}
public String getTenLop() {
return tenLop;
}
public void setTenLop(String tenLop) {
this.tenLop = tenLop;
}
/**
* Liệt kê các record của bảng lớp học để hiển thị lên table
* @return
*/
public ArrayList<LophocBean> getAllLophoc() {
ArrayList<LophocBean> lst = new ArrayList<LophocBean>();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=GC0563", "sa", "");
ResultSet rs = con.createStatement().executeQuery("select * from Lophoc");
while (rs.next()) {
LophocBean lh = new LophocBean(
rs.getString(1),
rs.getString(2),
rs.getString(3));
lst.add(lh);
}
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return lst;
}
/**
* Action dùng để insert 1 mẫu tin mới
* @return success nếu thành công
*/
public String InsertNew() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=GC0563", "sa", "");
String sql = "insert into lophoc values(?,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, msLop);
ps.setString(2, tenLop);
ps.setString(3, tenGVCN);
int x = ps.executeUpdate();
if (x > 0) {
return "success";
}
} catch (Exception e) {
e.printStackTrace();
}
return "failed";
}
/**
* Action delete dùng để xóa mẫu tin được chọn
* @param evt
*/
public void deleteAction(ActionEvent evt) {
// We get the table object
HtmlDataTable table = getParentDatatable((UIComponent) evt.getSource());
// We get the object on the selected line.
Object o = table.getRowData();
LophocBean selLh = (LophocBean) o;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=GC0563", "sa", "");
String sql = "delete lophoc where msLop=?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, selLh.msLop);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Action dùng để chọn mẫu tin cần cập nhật
* @param evt
*/
public void editBook(ActionEvent evt) {
// We get the table object
HtmlDataTable table = getParentDatatable((UIComponent) evt.getSource());
// We get the object on the selected line.
Object o = table.getRowData();
LophocBean lh = (LophocBean) o;
this.msLop = lh.msLop;
this.tenLop = lh.tenLop;
this.tenGVCN = lh.tenGVCN;
}
// Method to get the HtmlDataTable.
private HtmlDataTable getParentDatatable(UIComponent compo) {
if (compo == null) {
return null;
}
if (compo instanceof HtmlDataTable) {
return (HtmlDataTable) compo;
}
return getParentDatatable(compo.getParent());
}
/**
* Cập nhật dữ liệu được chọn lên cơ sở dữ liệu.
* @return
*/
public String update() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=GC0563", "sa", "");
String sql = "update lophoc set tenLop=?, tenGVCN=? where msLop=?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, tenLop);
ps.setString(2, tenGVCN);
ps.setString(3, msLop);
int x = ps.executeUpdate();
if (x > 0) {
return "success";
}
} catch (Exception e) {
e.printStackTrace();
}
return "failed";
}
}
Bước 3: Thiết kế giao diện
Tạo trang liệt kê danh sách các lớp học: Lophoc.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JSP Page</title>
</head>
<body>
<h1 align="center">DANH SÁCH LỚP HỌC</h1>
<h:form id="frm">
<h:dataTable width="100%" border="1"
var="lh" id="table"
value="#{lophoc.allLophoc}"
>
<h:column id="ms" headerClass="headertext">
<f:facet name="header">
<h:outputText style="headerText" value="Mã số Lớp"/>
</f:facet>
<h:outputText id="ml" value="#{lh.msLop}"/>
</h:column>
<h:column id="ten" headerClass="headertext">
<f:facet name="header">
<h:outputText style="headerText" value="tên Lớp"/>
</f:facet>
<h:outputText id="tl" value="#{lh.tenLop}"/>
</h:column>
<h:column id="gv" headerClass="headertext">
<f:facet name="header">
<h:outputText style="headerText" value="Giáo viên chủ nhiệm"/>
</f:facet>
<h:outputText id="gvcn" value="#{lh.tenGVCN}"/>
</h:column>
<h:column id="actions" headerClass="headertext">
<f:facet name="header">
<h:commandLink value="Insert New" action="insert" immediate="true"/>
</f:facet>
<h:commandLink value="Edit" immediate="true"
actionListener="#{lophoc.editBook}" action="edit"/> -
<h:commandLink value="Delete" actionListener="#{lophoc.deleteAction}"/>
</h:column>
<%--<f:facet name="footer">
<h:panelGroup style="align:right">
<h:outputLabel value="Number of records"/>
</h:panelGroup>
</f:facet>--%>
</h:dataTable>
</h:form>
</body>
</html>
</f:view>
Trang edit.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JSP Page</title>
</head>
<body>
<h1 align="center"><h:outputText value="Hiệu chỉnh thông tin học sinh"/></h1>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="ms" value="Mã số lớp"/>
<h:inputText id="ms" value="#{lophoc.msLop}" readonly="true"/>
<h:outputLabel for="ht" value="Tên lớp"/>
<h:inputText id="ht" value="#{lophoc.tenLop}"/>
<h:outputLabel for="gv" value="Tên GVCN"/>
<h:inputText id="gv" value="#{lophoc.tenGVCN}"/>
</h:panelGrid>
<h:commandButton value="Update" action="#{lophoc.update}"/>
</h:form>
</body>
</html>
</f:view>
Trang insert.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JSP Page</title>
</head>
<body>
<h1 align="center"><h:outputText value="Thêm lớp học mới"/></h1>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="ms" value="Mã số lớp"/>
<h:inputText id="ms" value="#{lophoc.msLop}"/>
<h:outputLabel for="ht" value="Tên lớp"/>
<h:inputText id="ht" value="#{lophoc.tenLop}"/>
<h:outputLabel for="gv" value="Tên GVCN"/>
<h:inputText id="gv" value="#{lophoc.tenGVCN}"/>
</h:panelGrid>
<h:commandButton value="Insert" action="#{lophoc.InsertNew}"/>
</h:form>
</body>
</html>
</f:view>
Trang error.jsp cho việc hiển thị lỗi
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JSP Page</title>
</head>
<body>
<h1><h:outputText value="Error"/></h1>
</body>
</html>
</f:view>
Bước 4: Cấu hình
Facees-config.xml ở dạng PageFlow
dạng XML
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>lophoc</managed-bean-name>
<managed-bean-class>vovanhai.wordpress.com.LophocBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
</navigation-rule>
<navigation-rule>
<from-view-id>/Lophoc.jsp</from-view-id>
<navigation-case>
<from-outcome>insert</from-outcome>
<to-view-id>/insert.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>edit</from-outcome>
<to-view-id>/edit.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/insert.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/Lophoc.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>error</from-outcome>
<to-view-id>/error.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/edit.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/Lophoc.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failed</from-outcome>
<to-view-id>/error.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
Cấu trúc chương trình sau khi hoàn tất
Bước 5: Thực thi chương trình và thưởng thức
Chúc thành công!
sgboy17 said
Chào anh, e nghĩ mãi không ra cách sắp xếp để thêm phần search book. Vấn đề chính là sau khi nhấn vào nút search, sẽ chuyển qua trang kết quả. Nhưng không thể truyền tham số search về cho server để thực thi. (thuộc tính value của chưa nhận được giá trị với sql query có where) .
Đỉnh said
Dear thầy!
Thầy ơi cho em hỏi, khi em load trang viewAccount.jsp,nó báo là: ‘#{RegisterBean1.getAllAccount}’ Property ‘getAllAccount’ not found on type demo.RegisterBean1. ( cai getAllAccount cua em chinh la getAllLophoc cua thầy.)
Đỉnh said
Cai allLophoc la cai nào vậy thầy? nếu là getAllLophoc thì nó là 1 hàm, sao nam trong thuoc tinh value dc?
Võ Văn Hải said
Tữ động nó sẽ bỏ get, viết thường chữ đầu xuống. Đây là nguyên tắc cơ bản.
Đỉnh said
Yeah! cam on thay, giờ thi em đã hiểu.
Quangtrieu said
Hi Thay,
Thay cho em hoi chut ah, e lam chuong trinh nhu vi du cua Thay ma khong chay duoc,
Nguyen nhan la no khong mo duoc connec den DB
Chuoi connec cua em la:
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
Connection con = DriverManager.getConnection(“jdbc:sqlserver:192.168.100.221;databaseName=qlsv”, “sa”, “BacAdm1n”);
Kinh mong thay chi dum!
Võ Văn Hải said
Bạn chắc là có mở cổng 1433 không đấy? Nếu bạn dùng SQL Studio 2005, 2008 thì mặc định TCP/IP port bị disable và bạn phải enable nó lên như sau:
Mở “SQL Server Configuration Manager” lên sau đó chọn server instance bên trái, double mục TCP/IP bên phải, chọn enable=Yes, mở Tab “IP address” gõ port 1433 vào IPAll hoặc vào tất cả IP.
Trần Công Vương said
Em chào thầy ạ.Thầy có thể ví dụ thêm về phần view được không ạ?Bên cạnh 2 commanlink EDIT va DELETE có thêm 1 commanlink la VIEW để khi ta click VIEW thì nó sẽ qua form khác và trên form đó sẽ hiển thị lên tất cả thông tin của GiaoVienChuNhiem đó được không ạ?
Mong thầy sẽ cho ví dụ sớm.Em cảm ơn thầy trước.
Khoa said
javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
at model.User.checkUser(User.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:191)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 20 more
Em chào thầy , mong này giúp em sửa lỗi này. Em làm giống vd của thầy.
public String checkUser(){
String sql =”SELECT * FROM users WHERE username=? AND password=?”;
try{
PreparedStatement prepare= getConnectPlane().prepareStatement(sql);
prepare.setString(1, name);
prepare.setString(2, password);
ResultSet rs = prepare.executeQuery();
while(rs.next()){
return “index”;
}
}catch(SQLException e){e.printStackTrace();}
return “login”;
}
public Connection getConnectPlane(){
Connection con=null;
try{
Class.forName(“com.mysql.jdbc.Driver”);
con =DriverManager.getConnection(“jdbc:mysql://localhost:3306/phplogin”,”root”,”root”);
}catch(Exception e){e.printStackTrace();}
return con;
}
JSF said
Em chào thầy, em đang làm JSF, để có thể làm được các ví dụ
em cần phải có những bộ thư viện nòa ạ. MOng thầy cung cấp cho em.
Em xin cảm ơn thầy.
JSF said
a4j:ajax event=”keyup” render=”out”
Khoa said
Em chào thầy.
Chúng ta có thẻ truyền tham số vào phần value=”#{lophoc.allLophoc}” dược không ạ.
Giả sử em chỉ muốn search các em lớp 6 or lớp 7 tùy vào mình
public ArrayList getAllLopHoc(int lop_may)
{
tim kiếm trong database WHERE lop=lop_may
}
. SAu khi searcg xong , em muốn trình bày tên của 4 em trên 1 hàng được không ạ.
Mong thầy giúp đỡ.
Em cảm ơn thầy
Khoa said
Em chào thầy , thầy có thể cho em biết em cần những gói thư viện nào để có thể làm các vd liên quan tới các tag <a4j <rich
Em muốn làm các vd giông trong trang này
http://richfaces-showcase.appspot.com/richfaces/component-sample.jsf?demo=dataGrid&skin=blueSky
Hiện tại em đang có thư viện JSF 2.1, JSTL1.1
Mong thầy giúp đỡ
Võ Văn Hải said
2 thư viện chuẩn của JSF là jsf-api-….jar và jsf-impl-…jar, cái thẻ là thẻ của richfaces, bạn có thể tìm hiểu thêm ở bài này
Võ Văn Hải said
“Em chào thầy, em đang làm JSF, để có thể làm được các ví dụ
em cần phải có những bộ thư viện nòa ạ. MOng thầy cung cấp cho em.
Em xin cảm ơn thầy.”
Vui lòng tìm kỹ trong blog này sẽ có cau trả lời
Võ Văn Hải said
Nó báo lỗi: Caused by: java.lang.NullPointerException
at model.User.checkUser(User.java:85)
Em coi thử chỗ dòng 85 của file User đó có đảm bảo connection đã thể hiện chưa?
Khoa said
Thầy có thể chỉ cho em cách chèn 1 trang jsf vào 1 trang khác được không.
Ví dụ em tạo ra 1 trang menu, sau đó em chèn trang này cho các trang khác.
Trong jsp em dùng jsp:include, còn trong jsf em không biết.
Mong thầy giúp đỡ. Em chúc thầy mạnh khỏe.
Do Dung said
anh cho em hoi, trong cai vi du nay cua khi ta xoa duoc roi nhung lam the nao de loading lai du lieu o chinh cai trang do a
Ken said
chao thay! e thac mat la khi minh nhan nut delete thi lam seo biet truyen tham so id cho no a. thay co the giai thich ro hon dc hk a. mong thay giup do!
Ken said
Neu mh truyen tham 1 tham so cho nhu the nay:
Thi ben Lophocbean mh lam seo de nhan tham so nay ha Thay? va lieu e viet nhu vay co dung chua?…Kinh mong thay giup dum e!