登陸頁面示例(包含請求轉發、重定向解析及MVC應用)

案例需求描述

提供登陸頁面,用於用戶信息登錄(用戶名和密碼需要查詢數據庫),如果登陸失敗,需要回到登陸頁面(給出提示信息)。如果登陸成功,頁面進行跳轉,在成功頁面上顯示登陸成功的總人數。

案例流程分析

在這裏插入圖片描述

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>

web項目文件目錄

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章