Enterprise Application Development in Java EE
Lab 05
Singleton Session Beans
Mục tiêu
- Thao tác với Singleton Session Beans
Phần I Bài tập step by step
Bài 1
Tạo project EJB với Singleton Session Beans có interface là Remote cho phép đăng ký,
đăng nhập User của ChatRoom:
UserChat
Column
Data Type
Characteristic
Description
UserID
Int
PK, Auto Increment(1,1)
Mã User
UserName
Nvarchar(50)
Not Null
Tên đăng nhập
Password
Nvarchar(50)
Not Null
Mã đăng nhập
Ucreated
Date
Not Null
Ngày đăng ký
Mail
Nvarchar(50)
Allow Null
Mail của User
Address
Nvarchar(100)
Allow Null
Địa chỉ
Phone
Nvarchar(50)
Allow Null
Số điện thoại
Project thực hiện các công việc sau:
- Tạo class UserChat tương ứng với bảng UserChat trong CSDL
- Tạo Singleton Session Bean Remote gồm các phương thức sau:
+ registerUser: Đăng ký User
+ login: Đăng nhập User
IT Research Department
@BKAP 2015
Page 1 / 17
Enterprise Application Development in Java EE
Step 1: Tạo Table UserChat trong Database EJB và các procedure thực hiện nghiệp vụ
registerUser, login
Tạo Database EJB và Table UserChat
Create DataBase EJB
go
USE [EJB]
GO
/****** Object: Table [dbo].[UserChat] Script Date: 6/3/2016 11:31:31 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserChat](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](50) NOT NULL,
[Password] [nvarchar](50) NOT NULL,
[UCreated] [date] NOT NULL,
[Mail] [nvarchar](50) NULL,
[Address] [nvarchar](100) NULL,
[Phone] [nvarchar](50) NULL,
[StatusLogin] [int] NULL,
CONSTRAINT [PK_EUser] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS =
ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Tạo Procedure
checkLogin
USE [EJB]
GO
CREATE PROCEDURE [dbo].[checkLogin]
@userName nvarchar(50),
@password nvarchar(50),
@checkNumber int OUTPUT,
@numberOnline int OUTPUT
AS
BEGIN
SELECT @checkNumber = COUNT(*) FROM UserChat u WHERE u.UserName = @userName and u.Password
= @password
if @checkNumber > 0
BEGIN
UPDATE UserChat
SET StatusLogin = 1;
SELECT @numberOnline = COUNT(*) FROM UserChat u WHERE u.StatusLogin = 1;
END
END
IT Research Department
@BKAP 2015
Page 2 / 17
Enterprise Application Development in Java EE
registerUser
USE [EJB]
GO
CREATE PROCEDURE [dbo].[registerUser]
@userName nvarchar(50),
@password nvarchar(50),
@mail nvarchar(50),
@address nvarchar(100),
@phone nvarchar(50)
AS
BEGIN
DECLARE @date date;
SET @date = GETDATE();
INSERT INTO UserChat
VALUES (@userName,@password,@date,@mail,@address,@phone,0)
END
Step 2: Tạo Project EJB tên Session05 với Session Bean là Singleton - tên S05SingletonBean
và Interface là Remote – tên S05InterfaceRemote (Như đã hướng dẫn ở Lab trước)
IT Research Department
@BKAP 2015
Page 3 / 17
Enterprise Application Development in Java EE
Cấu trúc ứng dụng sau khi hoàn thành
Step 3: Khai báo các phương thức nghiệp vụ trên S05SingletonBeanRemote
S05SingletonBeanRemote.java
package bean;
import javax.ejb.Remote;
/**
*
* @author Quang
*/
@Remote
public interface S05SingletonBeanRemote {
public String registerUser(String userName, String password, String mail, String address, String phone);
public int login(String userName, String password);
}
Step 4: Xây dựng java class DBConnection kết nối với DataBase SQL Server 2012 (Đặt trong
package util)
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
*
* @author admin
*/
public class DBConnection {
IT Research Department
@BKAP 2015
Page 4 / 17
Enterprise Application Development in Java EE
private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=EJB";
private static final String DB_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String user_db = "sa";
private static final String pass_db = "Gacon1984";
public static Connection getDBConnection() {
Connection conn = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(URL, user_db, pass_db);
} catch (SQLException ex) {
ex.printStackTrace();
}
return conn;
}
}
Step 5: Thực thi các phương thức nghiệp vụ trên S05SingletonBean
S03_04StatelessBean.java
package bean;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;
import javax.ejb.Singleton;
import util.DBConnection;
/**
*
* @author Quang
*/
@Singleton
public class S05SingletonBean implements S05SingletonBeanRemote {
@Override
public String registerUser(String userName, String password, String mail, String address, String phone) {
Connection conn = null;
CallableStatement callableStatement = null;
try {
conn = DBConnection.getDBConnection();
String registerUser = "{call registerUser(?,?,?,?,?)}";
callableStatement = conn.prepareCall(registerUser);
callableStatement.setString(1, userName);
callableStatement.setString(2, password);
callableStatement.setString(3, mail);
callableStatement.setString(4, address);
callableStatement.setString(5, password);
callableStatement.executeUpdate();
IT Research Department
@BKAP 2015
Page 5 / 17
Enterprise Application Development in Java EE
return "Success";
} catch (Exception e) {
e.printStackTrace();
return "Error";
}
}
@Override
public int login(String userName, String password) {
Connection conn = null;
CallableStatement callableStatement = null;
int check = 0;
int numberOnline = 0;
try {
conn = DBConnection.getDBConnection();
String checkLogin = "{call checkLogin(?,?,?,?)}";
callableStatement = conn.prepareCall(checkLogin);
callableStatement.setString(1, userName);
callableStatement.setString(2, password);
callableStatement.registerOutParameter(3, Types.INTEGER);
callableStatement.registerOutParameter(4, Types.INTEGER);
callableStatement.execute();
check = callableStatement.getInt(3);
numberOnline = callableStatement.getInt(4);
} catch (Exception e) {
e.printStackTrace();
}
if (check > 0) {
return numberOnline;
} else {
return 0;
}
}
}
Step 6: Build and Deploy Project Session05
Step 7: Tạo Project Web Application với Framework là Struts2 làm các client cho User đăng
ký và đăng nhập
IT Research Department
@BKAP 2015
Page 6 / 17
Enterprise Application Development in Java EE
IT Research Department
@BKAP 2015
Page 7 / 17
Enterprise Application Development in Java EE
IT Research Department
@BKAP 2015
Page 8 / 17
Enterprise Application Development in Java EE
Step 8: Tạo Entity Class tên UserChat như table UserChat trong package entities (Có
get,set, constructor)
UserChat.java
package entities;
import java.util.Date;
/**
*
* @author Quang
*/
public class UserChat {
private int userID;
private String userName;
private String password;
private Date uCreated;
private String mail;
private String address;
private String phone;
public UserChat() {
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getuCreated() {
return uCreated;
}
public void setuCreated(Date uCreated) {
this.uCreated = uCreated;
IT Research Department
@BKAP 2015
Page 9 / 17
Enterprise Application Development in Java EE
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
Step 9: Tạo css cho roomchat
Chat.css
.content {
width: 600px;
height: 400px;
overflow: auto;
border: 1px solid #991111;
}
.msg-input {
width: 400px;
border: 1px solid #119911;
}
Step 10: Tạo các trang jsp để cho User đăng ký (register.jsp), đăng nhập (login.jsp) và chat
(roomchat.jsp)
register.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chat Room Register</title>
</head>
<body>
User Registration
<s:form action="register" method="Post">
IT Research Department
@BKAP 2015
Page 10 / 17
Enterprise Application Development in Java EE
<s:textfield label="User Name" name="userRegister.userName"/>
<s:password label="Password" name="userRegister.password"/>
<s:textfield label="Mail" name="userRegister.mail"/>
<s:textfield label="Address" name="userRegister.address"/>
<s:textfield label="Phone" name="userRegister.phone"/>
<s:submit value="Register"/>
</s:form>
</body>
</html>
login.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login Room Chat</title>
</head>
<body>
Login
<s:form action="login" method="Post">
<s:textfield label="User Name" name="userLogin.userName"/>
<s:password label="Password" name="userLogin.password"/>
<s:submit value="Login"/>
</s:form>
<a href="register.jsp">Đăng Ký</a>
</body>
</html>
roomchat.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri=" /><%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<c:if test="${userName == null}">
<c:redirect url="login.jsp" />
</c:if>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Room Chat Page</title>
<link href="css/chat.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<s:form action="message" method="post">
<div style="color: red">
Your name: <span id="userName">${userName}</span>
--Number Online: <span id="userName">${numberOnline}</span>
</div>
<div id="content" class="content"></div>
<div>
<s:textarea cssClass="msg-input" name="message" label="Input Text Here"/>
<s:submit value="Send" name="send"/>
IT Research Department
@BKAP 2015
Page 11 / 17
Enterprise Application Development in Java EE
</div>
</s:form>
</body>
</html>
Step 11: Tạo Action Struts 2 thực hiện đăng ký và đăng nhập cho User (gọi qua Enterprise
java Bean S05SingletonBeanRemote)
package action;
import bean.S05SingletonBeanRemote;
import com.opensymphony.xwork2.ActionSupport;
import entities.UserChat;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
/**
*
* @author Quang
*/
public class UserAction extends ActionSupport implements ServletRequestAware{
S05SingletonBeanRemote s05SingletonBean = lookupS05SingletonBeanRemote();
private UserChat userRegister;
private UserChat userLogin;
private HttpServletRequest request;
public UserAction() {
userRegister = new UserChat();
userLogin = new UserChat();
}
public String register() {
String result = null;
try {
result = s05SingletonBean.registerUser(userRegister.getUserName(), userRegister.getPassword(),
userRegister.getMail(), userRegister.getAddress(), userRegister.getPhone());
if (result.equals("Success")) {
return SUCCESS;
}
return ERROR;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
public String login(){
int numberOnline = 0;
try {
numberOnline = s05SingletonBean.login(userLogin.getUserName(), userLogin.getPassword());
if (numberOnline>0) {
request.getSession().setAttribute("userName", userLogin.getUserName());
IT Research Department
@BKAP 2015
Page 12 / 17
Enterprise Application Development in Java EE
request.getSession().setAttribute("numberOnline", numberOnline);
return SUCCESS;
}
return ERROR;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
private S05SingletonBeanRemote lookupS05SingletonBeanRemote() {
try {
Context c = new InitialContext();
return (S05SingletonBeanRemote) c.lookup("java:global/Session05/Session05ejb/S05SingletonBean!bean.S05SingletonBeanRemote");
} catch (NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
throw new RuntimeException(ne);
}
}
public UserChat getUserRegister() {
return userRegister;
}
public void setUserRegister(UserChat userRegister) {
this.userRegister = userRegister;
}
public UserChat getUserLogin() {
return userLogin;
}
public void setUserLogin(UserChat userLogin) {
this.userLogin = userLogin;
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletRequest(HttpServletRequest hsr) {
this.request = hsr;
}
}
Step 12: Khai báo struts.xml
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
" />
IT Research Department
@BKAP 2015
Page 13 / 17
Enterprise Application Development in Java EE
<struts>
<!-- Configuration for the default package. -->
<action name="register" class="action.UserAction" method="register">
<result name="input">register.jsp</result>
<result name="success">login.jsp</result>
<result name="error">register.jsp</result>
</action>
<action name="login" class="action.UserAction" method="login">
<result name="success">roomChat.jsp</result>
<result name="error">login.jsp</result>
</action>
</package>
</struts>
Cấu trúc Project sau khi hoàn thành
IT Research Department
@BKAP 2015
Page 14 / 17
Enterprise Application Development in Java EE
Step 13: Build and Run Application
IT Research Department
@BKAP 2015
Page 15 / 17
Enterprise Application Development in Java EE
Phần II Bài Tập Tự Làm
Phát triển tiếp bài tập hướng dẫn Step by Step, Thêm các chức năng sau:
IT Research Department
@BKAP 2015
Page 16 / 17
Enterprise Application Development in Java EE
- Phát triển chức năng Log Out trong Room Chat, khi log out thì cập nhật lại Status của
User đó trong bảng Userchat là 0
IT Research Department
@BKAP 2015
Page 17 / 17