文章目录
案例需求描述
提供登陆页面,用于用户信息登录(用户名和密码需要查询数据库),如果登陆失败,需要回到登陆页面(给出提示信息)。如果登陆成功,页面进行跳转,在成功页面上显示登陆成功的总人数。
案例流程分析
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>