JavaWeb專案開發(二):Servlet+Bean+Dao+MySQL
需要使用的技術:
JSP動態網頁
Servlet獲得客戶端請求、轉發請求、跳轉到下一個介面
JavaBean 業務Bean (業務邏輯具體實現類),處理業務邏輯
Dao 訪問資料庫,操作資料庫例表 (增刪查改)
MySQL 資料庫
實現系統以下介面和功能:
登入
我的資料
詳細資訊檢視
更新我的資料
1、Tomcat配置
下載Tomcat安裝檔案apache-tomcat-8.0.42.tar.gz
下載連結: https://pan.baidu.com/s/1dFwzgXF 密碼: s537
解壓檔案並命名資料夾為Tomcat,將Tomcat資料夾移動到/usr/local/檔案目錄下。
開啟終端,修改檔案許可權,輸入sudochmod 755 /usr/local/Tomcat
在/usr/local/Tomcat/bin 目錄下,執行下面的語句
sh startup.sh
結果顯示:Tomact started
表示Tomact伺服器以及成功開啟。
此時開啟瀏覽器輸入locolhost:8080驗證tomact是否成功開啟
出現該頁面,表示tomcat以及成功打開了。
2、安裝MySQL資料庫
下載MySQL資料庫安裝檔案mysql-5.7.17-macos10.12-x86_64.dmg
下載連結: https://pan.baidu.com/s/1nvK5xYp 密碼: 9ewg
在Mac上安裝MySQl
安裝完成後,開啟Mac系統便好設定
系統便好設定中出現了MySQL的圖示,表示MySQL安裝成功
雙擊MySQL圖示,開啟MySQL服務,開啟後如下圖所示:
3、安裝MySQL視覺化檢視工具navicat
下載navicat安裝檔案navicat112_mysql_cs.dmg
下載連結: https://pan.baidu.com/s/1jILX1wa 密碼: 9nrm安裝完成後,開啟navicat,連線我們剛才安裝的MySQL資料庫
連線需要輸入我們安裝MySQL時設定的相關資訊,包括密碼。
連線建立後,我們便可以看到navicat介面檢視中我們剛才建立的localhost連線。
4、Eclipse配置Tomcat
Eclipse下載連結: https://pan.baidu.com/s/1eSqX1Hg 密碼: 73m8
1.8Jar下載連結: https://pan.baidu.com/s/1bpEekRt 密碼: utnx
開啟eclipse,在eclipse便好設定-server-add介面中選中剛才安裝的tomcat版本,點選finish。
編輯Tomcat server 執行環境,在空白欄中輸入我們安裝Tomcat的路徑,點選finish。
成功之後,我們看到了下面的檢視
在java EE檢視下,Servers欄目中新建一個Tomcat伺服器
完成後,Servers欄下就會出現一個Tomcat伺服器,如下圖所示
右鍵選擇start將伺服器開啟
控制檯顯示如下,表示伺服器以及成功開啟。
5、Eclipse連線資料庫
開啟資料檢視,右擊database connections,選擇新建連線。
選擇MySQL,點選next。
輸入我們在MySQL視覺化工具navicat中建立的資料庫連線的相關資訊,點選finish,完成eclipse資料庫的連線。
6、測試Eclipse和資料庫的連通性
我們首先在MySQL視覺化工具navicat中新建一個數據庫,命名為demo。在demo資料庫中新建使用者資料表,如下圖所示:
建立“資料庫源類”,建立資料庫連線。具體實現內容如下:
public class DataSource {
private static String url = "jdbc:mysql://localhost:3306/demo"; //連線路徑
private static String user = "root"; //使用者名稱
private static String password = "123"; //密碼
/*開啟並返回資料庫連線 */
public static Connection getConnection() {
try {
MysqlDataSource dataSource = new MysqlDataSource();
//設定連線屬性
dataSource.setUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
//開啟並返回連線
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
建立“使用者資料訪問Dao具體實現類”,實現資料庫資料各項屬性的讀取,儲存、修改、刪除等功能。具體實現內容如下:
public class UserDaoServiceImpl implements IUserDaoService {
@Override
public List<TDemoUser> query() throws Exception {
//獲得資料庫連線
Connection conn = DataSource.getConnection();
//建立資料庫操作的語句物件
Statement stm = conn.createStatement();
//查詢資料庫返回結果集
ResultSet rs = stm.executeQuery("select * from t_demo_user"
+ " where isdel=0 order by opertime desc");
//建立封裝使用者資料的集合
List<TDemoUser> list = new ArrayList<>();
//遍歷結果集,封裝使用者資料
while(rs.next()) {
//建立使用者物件
TDemoUser user = new TDemoUser();
//封裝資料,給屬性設值
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name")); user.setUserPassword(rs.getString("user_password")); user.setUserGender(rs.getString("user_gender")); user.setUserRole(rs.getString("user_role")); user.setUserEmail(rs.getString("user_email")); user.setUserTelphone(rs.getString("user_telphone")); user.setUserBirthday(rs.getDate("user_birthday"));
user.setIsdel(rs.getString("isdel"));
user.setOpertime(rs.getTimestamp("opertime"));
//新增使用者物件到集合中
list.add(user);
}
//關閉連線
conn.close();
//返回使用者資料的集合
return list;
}
@Override
public List<TDemoUser> query(String userName) throws Exception {
//獲得資料庫連線
Connection conn = DataSource.getConnection();
//建立資料庫操作的語句物件
Statement stm = conn.createStatement();
//查詢資料庫返回結果集
ResultSet rs = stm.executeQuery("select * from t_demo_user"
+ " where isdel=0 and user_name like '%"+userName+"%' order by opertime desc");
//建立封裝使用者資料的集合
List<TDemoUser> list = new ArrayList<>();
//遍歷結果集,封裝使用者資料
while(rs.next()) {
//建立使用者物件
TDemoUser user = new TDemoUser();
//封裝資料,給屬性設值
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPassword(rs.getString("user_password")); user.setUserGender(rs.getString("user_gender")); user.setUserRole(rs.getString("user_role"));
user.setUserEmail(rs.getString("user_email"));
user.setUserTelphone(rs.getString("user_telphone"));
user.setUserBirthday(rs.getDate("user_birthday"));
user.setIsdel(rs.getString("isdel"));
user.setOpertime(rs.getTimestamp("opertime"));
//新增使用者物件到集合中
list.add(user);
}
//關閉連線
conn.close();
//返回使用者資料的集合
return list;
}
@Override
public TDemoUser getUserById(String id) throws Exception {
//獲得資料庫連線
Connection conn = DataSource.getConnection();
//建立資料庫操作的語句物件
Statement stm = conn.createStatement();
//查詢資料庫返回結果集
ResultSet rs = stm.executeQuery("select * from t_demo_user"
+ " where isdel=0 and user_id="+id);
//定義使用者變數
TDemoUser user = null;
//遍歷結果集,封裝使用者資料
while(rs.next()) {
//建立使用者物件
user = new TDemoUser();
//封裝資料,給屬性設值
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPassword(rs.getString("user_password"));
user.setUserGender(rs.getString("user_gender")) user.setUserRole(rs.getString("user_role")); user.setUserEmail(rs.getString("user_email")); user.setUserTelphone(rs.getString("user_telphone")); user.setUserBirthday(rs.getDate("user_birthday"));
user.setIsdel(rs.getString("isdel"));
user.setOpertime(rs.getTimestamp("opertime"));
}
//關閉連線
conn.close();
//返回使用者資料的集合
return user;
}
@Override
public TDemoUser find(String userName, String password) throws Exception {
//獲得資料庫連線
Connection conn = DataSource.getConnection();
//建立資料庫操作的語句物件
Statement stm = conn.createStatement();
//查詢資料庫返回結果集
ResultSet rs = stm.executeQuery("select * from t_demo_user"
+ " where isdel=0 and user_name='"+userName+"' and user_password='"+password+"'");
System.out.println("select * from t_demo_user"
+ " where isdel=0 and user_name='"+userName+"' and user_password='"+password+"'");
//定義使用者變數
TDemoUser user = null;
//遍歷結果集,封裝使用者資料
while(rs.next()) {
//建立使用者物件
user = new TDemoUser();
//封裝資料,給屬性設值
user.setUserId(rs.getInt("user_id")); user.setUserName(rs.getString("user_name")); user.setUserPassword(rs.getString("user_password")); user.setUserGender(rs.getString("user_gender")); user.setUserRole(rs.getString("user_role")); user.setUserEmail(rs.getString("user_email"));
user.setUserTelphone(rs.getString("user_telphone"));
user.setUserBirthday(rs.getDate("user_birthday"));
user.setIsdel(rs.getString("isdel")); user.setOpertime(rs.getTimestamp("opertime"));
break;
}
//關閉連線
conn.close();
//返回使用者資料的集合
return user;
}
@Override
public void save(TDemoUser user) throws Exception {
//獲得資料連線
Connection conn = DataSource.getConnection();
//建立資料庫操作語句物件
PreparedStatement stm = conn.prepareStatement("insert into t_demo_user("
+ "user_name,user_password,user_gender,user_role,user_email,user_telphone,"
+ "user_birthday,isdel,opertime) values(?,?,?,?,?,?,?,?,?)");
//設定儲存的資料
stm.setString(1, user.getUserName());
stm.setString(2, user.getUserPassword());
stm.setString(3, user.getUserGender());
stm.setString(4, user.getUserRole());
stm.setString(5, user.getUserEmail());
stm.setString(6, user.getUserTelphone());
stm.setDate(7, user.getUserBirthday());
stm.setString(8, "0");
stm.setTimestamp(9, new Timestamp(System.currentTimeMillis()));
//執行SQL,儲存資料到資料庫
stm.executeUpdate();
//關閉連線
conn.close();
}
@Override
public void update(TDemoUser user) throws Exception {
//獲得資料連線
Connection conn = DataSource.getConnection();
//建立資料庫操作語句物件
PreparedStatement stm = conn.prepareStatement("update t_demo_user set "
+ "user_name=?,user_password=?,user_gender=?,user_role=?,user_email=?,"
+ "user_telphone=?,user_birthday=?,isdel=?,opertime=? where user_id=?");
//設定儲存的資料
stm.setString(1, user.getUserName());
stm.setString(2, user.getUserPassword());
stm.setString(3, user.getUserGender());
stm.setString(4, user.getUserRole());
stm.setString(5, user.getUserEmail());
stm.setString(6, user.getUserTelphone());
stm.setDate(7, user.getUserBirthday());
stm.setString(8, "0");
stm.setTimestamp(9, new Timestamp(System.currentTimeMillis()));
stm.setInt(10, user.getUserId());
//執行SQL,儲存資料到資料庫
stm.executeUpdate();
//關閉連線
conn.close();
}
接下里編寫測試程式碼,嘗試從資料庫讀取使用者資料內容,並在控制檯列印輸出。測試內容為修改使用者資訊和查詢使用者資料列表。測試程式碼以及測試結果都如下入所示:
7、實現登入介面
首先要新建登入的業務介面類,主要宣告一個login函式。實現內容如下:
public interface ILoginService {
public String login(HttpServletRequest request) throws Exception;
}
接著新建登入業務的具體實現類,類中首先定義資料訪問Dao物件,接著對使用者輸入的賬戶資訊進行驗證。獲得使用者輸入的賬戶名和密碼,並以此為索引查詢相應的使用者,如果找到就登入成功,跳轉到系統首頁,如果沒有找到,就要提示“使用者名稱或密碼輸入錯誤!”,頁面保留在登入介面。具體實現內容如下:
public class LoginServiceImpl implements ILoginService {
private IUserDaoService idao = new UserDaoServiceImpl(); //定義資料訪問Dao物件
/*登入驗證*/
@Override
public String login(HttpServletRequest request) throws Exception {
//獲得請求中的使用者名稱與密碼
String userName = request.getParameter("userName");
String password = request.getParameter("password");
//通過Dao介面,訪問資料庫,使用者名稱與密碼為條件查詢使用者資料
TDemoUser user = idao.find(userName, password);
//驗證登入是否成功
if(user!=null) { //成功
System.out.println("登入成功");
//會話中新增使用者物件
HttpSession session = request.getSession(); //會話在伺服器快取使用者的資料,預設30分鐘
session.setAttribute("user", user);
return "/index.jsp";
} else { //失敗
//請求中新增錯誤資訊
request.setAttribute("error", "使用者名稱或密碼錯誤!");
return "/login.jsp";
}
}
}
然後新建一個LoginServlet類做為登入(Login)的控制器,宣告一個登入服務介面類的服務,並實現請求中資料的編碼格式的設定、訪問業務Bean,驗證登入,跳轉到下一個頁面等功能。具體實現如下:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ILoginService service = new LoginServiceImpl();
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設定請求中資料的編碼格式
request.setCharacterEncoding("utf-8"); //解決中文亂碼問題,只支援post模式
try {
//訪問業務Bean,驗證登入
String path = service.login(request);
//跳轉到下一個頁面 request.getRequestDispatcher(path).forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
此時我們在Tomcat伺服器上執行該web專案,可以看到下面的介面圖,此時我們故意輸入錯誤的使用者資訊。
可以看到顯示如下。頁面沒有跳轉到系統首頁,而是停留在了登入頁面,並且提示:使用者名稱或密碼輸入錯誤!
我們重新輸入正確的賬戶和密碼,成功登入才優備團隊內部系統,頁面展示如下。在頁面的右上角,我們可以看到剛才輸入登入的賬戶的簡要資訊。
8、實現“我的資料”頁面,完成資訊檢視和更新功能
類似“登入”頁面的顯示,為了能夠在頁面動態的和資料庫資訊進行互動,我們首先得新建一個我的資料業務介面類,介面類中包含我們需要在該頁面上實現的功能函式的宣告,包括頁面的檢視和內容的修改,具體實現如下:
public interface IMyInfoService {
/ * 查詢當前使用者資料 */
public String view(HttpServletRequest request) throws Exception;
/* 修改當前使用者資料 */
public String update(HttpServletRequest request) throws Exception;
}
接著是我的資料頁面的具體實現類,在登入時建立的會話快取中,獲得當前使用者物件及一系列相關資訊,以實現使用者資訊的展示。在更新操作上,我們需要獲取請求中使用者的資訊,並將該資訊設定為當前使用者的相應屬性,最後將使用者屬性設定回會話當中。具體實現如下:
public class MyInfoServiceImpl implements IMyInfoService {
private IUserDaoService idao = new UserDaoServiceImpl(); //定義資料訪問Dao物件
@Override
public String view(HttpServletRequest request) throws Exception {
//從會話快取中,獲得當前使用者物件
TDemoUser user = (TDemoUser) request.getSession().getAttribute("user");
//獲得使用者的ID
String id = String.valueOf(user.getUserId()); //整型轉換成字串型
//查詢獲得使用者的最新資料
user = idao.getUserById(id);
//使用者資料設定回會話中
request.getSession().setAttribute("user", user);
return "/admin/myinfo/message.jsp";
}
@Override
public String update(HttpServletRequest request) throws Exception {
//獲得請求中使用者的資料
String userName = request.getParameter("userName");
String password = request.getParameter("passwordA");
String gender = request.getParameter("gender");
String role = request.getParameter("role");
String email = request.getParameter("email");
String telphone = request.getParameter("telphone");
String birthday = request.getParameter("birthday");
//從會話快取中,獲得當前使用者物件
TDemoUser user = (TDemoUser) request.getSession().getAttribute("user");
//封裝使用者資料(設定使用者的屬性)
user.setUserName(userName);
user.setUserPassword(password);
user.setUserGender(gender);
user.setUserRole(role);
user.setUserEmail(email);
user.setUserTelphone(telphone);
//建立時間格式化物件
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
user.setUserBirthday(new Date(format.parse(birthday).getTime()));
user.setOpertime(new Timestamp(System.currentTimeMillis()));
//通過Dao介面,修改使用者資料
idao.update(user);
//更新快取中的資料
//獲得使用者的ID
String id = String.valueOf(user.getUserId());
//查詢獲得使用者的最新資料
user = idao.getUserById(id);
//使用者資料設定回會話中
request.getSession().setAttribute("user", user);
return "/login.jsp";
}
}
然後要做的就是我的資料頁面的控制器,宣告一個我們資料業務介面物件,並實現更新資訊和檢視資訊功能。具體實現內容如下
@WebServlet("/MyInfoServlet1")
public class MyInfoServlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
private IMyInfoService service = new MyInfoServiceImpl();
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//獲得當前的操作步驟
String status = request.getParameter("status");
//判斷進入不同的操作步驟
if("update".equals(status)) {
update(request, response);
} else {
view(request, response);
}
}
/*查詢當前使用者資料*/
protected void view(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String path = service.view(request);
request.getRequestDispatcher(path).forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
/*修改當前使用者資料 */
protected void update(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String path = service.update(request);
request.getRequestDispatcher(path).forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
public MyInfoServlet1() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
此時我們在Tomcat伺服器上重新執行該web專案,並正確登入,點選左側欄“我的資料”,頁面顯示了當前使用者的具體資訊。詳情如下:
看到頁面上顯示的使用者資訊之後,我們可以回到MySQL視覺化工具navicat中檢視使用者資訊在資料庫中的具體情況。結果顯示,頁面讀取的使用者資訊和資料庫中的使用者資訊完全一致。資料庫中使用者資訊如下圖所示:
接著,我們測試使用者資訊的更新功能。接上步驟頁面,我做了部分使用者資訊的修改,即修改了使用者名稱和聯絡電話。具體修改資訊如下:
完成更新資訊的輸入之後,點選確定,頁面跳轉到了登入頁面。此時,我們再次回到navicat頁面,檢視資料庫使用者資訊,可以看到我們剛才在頁面上做的使用者資料更新已經存回了資料庫。
接著我們重新登入才優備團隊內部系統,這次我們輸入更改後的使用者名稱稱和相應的密碼,登入成功後進入到系統首頁。
這個時候,我們再次點選“我的資料”,檢視使用者資訊。顯示的資訊內容和我們更改後的內容保持一致。詳情如下圖所示: