Servlet概述
開發我們的第一個Servlet(手工創建)
HttpServlet的創建(工具創建)
Servlet工作原理
Servlet獲取參數代碼示例
1、MVC模式介紹,爲什麼要使用模式?Model模型層-View視圖層-Control控制層
因爲模式是一種指導,在一個良好的指導下,有助於你完成任務,
有助於你作出一個優良的設計方案,達到事半功倍的效果。
而且會得到解決問題的最佳辦法。 設計模式的目標就是
提高系統的可維護性和可複用性。
(私人承包的建築隊伍和中國建設集團的區別,參考圖片)
M odel : entity實體類 表示一個表的數據模型User.java
V iew : JSP 收集數據、事件處理、展示數據
C ontrol: Servlet 控制跳轉
在J2EE中,一般由jsp扮演View層、Servlet扮演Control層、java撰寫Model層。
JSP 僅能作爲表現層(View)技術,作用有三點:
1. 負責收集用戶請求參數。2. 用戶事件的處理。3、狀態數據呈現給用戶。
Servlet 則僅充當控制器(Controller)角色,用戶類似於調度員:(所以用戶的請求發送給 Servlet , Servlet 調用 Model 來處理用戶請求,並調用 JSP 來呈現處理結果;)
Model 通常由 JavaBean 來充當,所以業務邏輯、數據訪問邏輯都在 Model 中實現。
3、新建MVC分層模式下的包,便於對不同層面的對象進行操作(面向對象思想)
com.style.control 訪問控制層Servlet
com.style.dao 數據訪問層DAO Data Access Object
com.style.entity 實體層 User Student等實體對象
com.style.dbutil 工具包 封裝數據連接類等
4、在com.style.dbutil裏寫數據庫的連接工具類【DBConnection.java】
5、在com.style.entity裏寫從數據庫表抽象出來的用戶User對象【User.java】
屬性有int uid;String uname;String upwd;跟數據庫表的字段一一對應。
6、在com.style.dao裏寫數據庫表User的訪問DAO【UserDao.java】
//根據用戶名和密碼來獲取用戶對象
public User getUser(String name,String pwd)
7、在com.style.control裏寫用戶登錄的Servlet【LoginServlet.java】
用戶填入用戶名密碼後跳這個Servlet,
在doPost方法中調用UserDao判斷用戶是否有權限登錄,
能登錄跳轉到stuinfo.jsp,不能登錄踢回login.jsp
注意:JSP中和Java中導包的區別!
JSP: <%@page import="com.style.dao.StuDao"%>
Java: import com.style.dao.StuDao;
首先參考系統的流程圖。
1、獲取全部學生展示到頁面上
a、首先新建學生表錄入學生的信息,
並在com.style.entity包中新建Student.java類。【實體層】
b、在com.style.dao包中新建StuDao.java的類,
用於學生表的數據訪問(增刪改查)。【數據訪問層】
新增獲取所有學生的方法:public ArrayList<Student> getAllStudents()
PreparedStatement是預編譯的,對於批量處理可以大大提高效率
也叫JDBC存儲過程。
c、在com.style.control包中新增一個StuInfoServlet,
在doPost方法中調用StuDao的獲取所有學生的方法,用戶獲得所有學生信息。
刪除學生信息成功後跳轉回stuinfo.jsp頁面。
1、解決請求亂碼問題、解決響應亂碼問題。
2、調用DAO查詢到集合數據。
3、將查到的數據存到request對象中。
4、頁面轉發到stuinfo.jsp。
d、準備stuInfo.jsp頁面(分析原來的頁面,純jsp怎麼寫)
原來純JSP頁面:在尖括號百分號寫java代碼,頁面上寫【數據庫連接查詢、學生的每一條信息】html和java混合,循環tr輸出內容
MVC實現JSP頁面:
1、從請求request中得到所有學生的集合【得到數據】
2、循環tr輸出內容。【展示數據】
a、在com.style.dao包StuDao.java類中,
新增刪除指定學生的方法:public void deleteStudent(String sno)
b、在com.style.control包中新增一個delete的Servlet,
在doPost方法中調用StuDao的刪除學生方法,用於刪除學生信息。
刪除學生信息完成後跳轉到stuinfo的Servlet
c、JSP界面stuinfo.jsp上調用刪除事件
<a href="delete?num=<%=s.getSno()%>" οnclick="return confirm('是否刪除該學生信息?')">刪除</a>
-----------------------------------------------------------------------
注意:【常見錯誤】
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
沒有導包、數據庫驅動字符串沒有寫對。
java.sql.SQLException: No value specified for parameter 1
你sql語句中的參數和你設置的?不對應
-----------------------------------------------------------------------
3、添加學生信息
a、在com.style.dao包StuDao.java類中,
新增添加學生的方法:public void addStudent(Student s)
b、在stuinfo.jsp上新增添加的學生的鏈接:
<a href="addstu.jsp">添加學生</a>
c、新建addstu.jsp頁面、參考前期的新增學生頁面(純表單界面)。
d、在新學生信息填寫完畢後,提交到一個處理數據的Servlet:
在com.style.control包中新增一個add的Servlet
1、解決請求亂碼問題、解決響應亂碼問題
2、獲取前一個頁面傳遞過來的參數
3、把數據封裝成Student
4、調用DAO,將數據插入數據庫
5、新增完成後跳轉到stuinfo的Servlet
a、在com.style.dao包StuDao.java類中,
新增修改學生的方法:public void updateStudent(Student s)
b、JSP界面stuinfo.jsp上調用修改事件
<a href="update?num=<%=s.getSno()%>">修改</a>
c、新建updatestu.jsp頁面參考前期的修改學生頁面(純表單界面,對比之前界面)
d、在新學生信息修改完畢後(學生編號不能改),提交到update的Servlet。
e、在com.style.control包中新增一個update的Servlet
1、解決請求亂碼問題、解決響應亂碼問題
2、調用DAO,進行數據庫修改操作
5、修改完成後跳轉到stuinfo的Servlet
a、轉發和重定向的區別
見示例項目:WebDemo
轉發:
request.getRequestDispatcher("/index").forward(request, response);
重定向:
response.sendRedirect("index"); 不能有斜槓
區別:
地址欄:轉發地址欄的URL不會變化,重定向地址欄的URL會變成定向後的地址。
參數: 轉發會將request和response裏的參數帶過去,重定向不能攜帶參數。
發生在:轉發發生在服務器,重定向發生的客戶端。
原理: 轉發----->請求--->demo1--->帶着你和你的禮物私下去找--->index.jsp
重定向--->請求--->demo2--->收下你的禮物給你一個消息(去找index.jsp)
--->請求--->index.jsp (禮物沒有了)
圖示:見圖示。
問題:帳號密碼錯誤了,要跳轉回login.jsp,重定向還是轉發?點擊修改按鈕,進入UpdateInitServlet,根據拿到的學號,查詢到一個Student信息,跳轉到update.jsp,重定向還是轉發?
1、對於JSP頁面來說,斜槓代表web服務器(tomcat)的根目錄
2、對於Servlet來說,斜槓代表項目的根目錄。
response.sendRedirect("login.jsp"); //響應是JSP頁面級別的
c、Servlet中怎麼獲取客戶端瀏覽器傳過來的參數?
String name = request.getParameter("name"); 姓名
String[] strs= request.getParameterValues("ah"); 愛好
c、每一步DAO中訪問數據庫的方法開發完成後在main方法中測試一次。
d、DBConnection.java數據庫連接工具類。
e、數據庫中字段使用數據庫關鍵字如:like、in等,sql中使用``包起來可以解決。
f、關於DAO層繼續抽象出BaseDao的擴展