文章目錄
案例需求描述
提供登陸頁面,用於用戶信息登錄(用戶名和密碼需要查詢數據庫),如果登陸失敗,需要回到登陸頁面(給出提示信息)。如果登陸成功,頁面進行跳轉,在成功頁面上顯示登陸成功的總人數。
案例流程分析
request作爲域對象作用範圍
request對象其實就是從客戶端瀏覽器向服務器發送的一次請求信息的封裝,實質上向request中所保存的數據有效期也是一次請求範圍。
一次請求範圍:從客戶端瀏覽器向服務器發送一次請求,服務器針對這次請求做出響應。響應之後,請求對象就銷燬了,保存在其中的數據就無效了。
請求轉發和重定向完成頁面的跳轉
- 請求轉發:瀏覽器訪問頁面URL地址沒有改變。
//1.請求轉發的方式
// RequestDispatcher rd = request.getRequestDispatcher("/demo1/demo1.jsp");
// rd.forward(request, response);
//貌似跳轉路徑不用帶工程名,因爲是在服務器端操作?
request.getRequestDispatcher("/demo1/demo1.jsp").forward(request, response);
- 重定向:瀏覽器訪問頁面URL地址改變至重定向路徑。
//2.請求重定向
//重定向帶上了工程名稱 - -
response.sendRedirect("/web02_heima/demo1/demo1.jsp");
請求轉發和重定向區別
- 請求轉發和重定向原理:轉發操作在服務器內部完成,重定向意味着瀏覽器請求了兩次,這也解釋了兩個操作分別在進行頁面跳轉時URL(帶不帶工程名稱)的異同。
- 請求轉發和重定向區別
- 請求轉發一次請求一次響應,重定向兩次請求兩次響應;
- 請求轉發地址欄不發生變化,重定向地址欄發生變化;
- 請求轉發路徑不帶工程名,重定向需要帶工程名。
- 請求轉發只能在本網站內部,重定向可以定到任何網站。
- 如果需要使用resquest進行值傳遞,通過請求轉發完成。如果需要跳轉到其他頁面上,使用重定向。
MVC在案例中的應用
引入相關資源
- 引入相關jar包(WEB-INF下lib文件夾)
注:此處引入的mysql-connector-java-5.1.46 jar包有誤,應引入mysql-connector-java-5.1.46-bin.jar(見尾部文件目錄),否則會報java.sql.SQLException: No suitable driver異常,具體原因暫時不清楚。
1. MySql數據庫驅動包
2. C3P0連接池所需jar包
3. DBUtils開發的jar包
- 引入C3P0配置文件(src下)
- 引入JDBC開發的工具類(放在utils包下)
案例代碼——登陸代碼實現
登陸代碼實現流程
登陸頁面(login.jsp)——登陸的servlet(loginservlet),在這個servlet中需要接收數據,將數據封裝到一個JavaBean中,調用另一個JavaBean處理數據,根據處理結果進行頁面跳轉。
- 第一步:在controller包下創建LoginServlet
- 第二步:在domain包下創建User類
- 第三步:在model包下創建一個UserModel類,類中提供一個login方法
- 第四步:根據處理結果進行頁面跳轉
try {
//1.接收數據
//處理中文亂碼
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.封裝數據
User user = new User();
user.setUsername(username);
user.setPassword(password);
//3.處理數據
UserModel userModel = new UserModel();
User existUser;
existUser = userModel.login(user);
//4.頁面展示
if(existUser == null) {
//登錄失敗
//向request域中保存一個錯誤信息
request.setAttribute("msg", "用戶名或密碼錯誤!");
//使用請求轉發進行頁面跳轉
request.getRequestDispatcher("/login.jsp").forward(request, response);
}else {
//登陸成功 重定向
response.sendRedirect("/web02_heima/success.jsp");
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();//拋一個運行期異常,出錯停止。
}
UserModel類中login方法的實現
public class UserModel {
public User login(User user) throws SQLException {
//連接數據庫,通過傳入的用戶名和密碼去數據庫中進行查詢
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
User existUser = queryRunner.query("select * from user where username = ? and password = ?",
new BeanHandler<User>(User.class), user.getUsername(), user.getPassword());
return existUser;
}
}
若登錄失敗,錯誤信息在登陸頁面(login.jsp)的回顯
<%
//錯誤信息的回顯
String msg = " ";
if(request.getAttribute("msg") != null){
msg = (String)request.getAttribute("msg");
}
%>
<h3><font color="red"><%= msg %></font></h3>
案例代碼——記錄登錄成功人數
- 記錄登錄成功人數分析
- 記錄登錄成功人數代碼實現
1、完成初始化操作,在服務器啓動的時候初始化一個值爲0,將這個值存入到ServletContext域當中。
public class InitServlet extends HttpServlet {
/**
* 初始化的Servlet
* 將這個servlet配置成啓動時加載
*/
@Override
public void init() throws ServletException {
// 初始化一個值爲0
int count = 0;
//將這個值存入到ServletContext域中
this.getServletContext().setAttribute("count", count);
}
}
2、將這個servlet配置成啓動時加載(web.xml中配置)
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.itheima.controller.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.itheima.controller.InitServlet</servlet-class>
<!-- 配置啓動時加載,不能寫1,整數越小,代表啓動時越先被創建 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/InitServlet</url-pattern>
</servlet-mapping>
3、 記錄登陸成功的人數
if(existUser == null) {
//登錄失敗
//向request域中保存一個錯誤信息
request.setAttribute("msg", "用戶名或密碼錯誤!");
//使用請求轉發進行頁面跳轉
request.getRequestDispatcher("/login.jsp").forward(request, response);
}else {
//登陸成功 重定向
//記錄登錄成功的人數:
//將ServletContext中的值取出再+1
int count = (int) this.getServletContext().getAttribute("count");
count++;
//將+1後的值存回到ServletContext中
this.getServletContext().setAttribute("count", count);
response.sendRedirect("/web02_heima/success.jsp");
}
4、 登陸成功的總人數在頁面顯示(在success.jsp頁面顯示)
<%
Integer count = 0;
//判斷,如果ServletContext中有值,獲取並顯示:
if(this.getServletContext().getAttribute("count") != null){
count = (Integer)this.getServletContext().getAttribute("count");
}
%>
<h3>登陸成功的總人數:<%= count %></h3>