登陆页面示例(包含请求转发、重定向解析及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项目文件目录

在这里插入图片描述

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