客户端跳转也叫重定向,是一个外部的跳转,使用的是HttpServletResponese对象中response.sendRedirect(Sting location)方法。是一个响应对象的方法,调用这个方法,表明整个请求已经结束。服务器开始向客户端返回执行的结果。
response.sendRedirect("main.jsp");*注意:*客户端跳转只能传递session和application范围的属性,不能传递request范围的属性
客户端跳转过程图
有图可以看出客户端会发送两个请求,页面的路径会发生变化所以不能专递request。
[外链图片转存失败(img-eExiOXMF-1568950286322)(https://i.imgur.com/asiqRh1.png)]
什么是服务器端跳转服务器端跳转也叫请求转发,是javax.servlet.RequestDispatcher接口的forward("")方法来实现的。
request.getRequestDispatcher("index.jsp").forward(request, response);注意:服务器跳转地址是不会发生变化,所以可以接受request范围内的属性
服务器端跳转过程
[外链图片转存失败(img-kvxBeqIs-1568950286323)(https://i.imgur.com/DZP6AEZ.png)]
客户端跳转“/ ”代表服务器路径webapps ,即服务器根路径,服务器端跳转“/ ”代表站点根路径,即应用程序根路径
使用服务器端跳转时,客户浏览器的地址栏并不会显示目标地址的URL,而是用客户端跳转时,地址栏当中会显示目标资源的URL
客户端跳转向服务器请求两次,服务器响应给客户端响应两次
服务器端跳转 客户端请求一次,服务器端响应一次
在进行客户端跳转和服务器端跳转时,都需要指定目标资源的URL,如果这个路径以“”开始。在客户端跳转当中“”代表的是应用服务器根目录,而在服务器端跳转当中代表的是 应用程序 根目录。
登录验证数据库的处理流程创建LoginServlet类 用来处理登录验证的流程
mvc开发模式(图片来源网络)
[外链图片转存失败(img-6iD1oAZu-1568950286324)(https://i.imgur.com/NiipS3K.png)]
继承HTTPServlet父类重写 doGet() 和doPost()方法
先从前台获取输入的内容
验证从前台传入的数据是不是null 如果是null 在浏览器上输出提示信息,进行服务器端跳转,跳转到登录页面,结束当前的方法
前台传来的数据不是null时,创建数据库连接、用户对象,将传来的值用来初始化用户对象。
数据库查询,查询是否有着对象,如果没有给出提示,有的话进行客户端跳转
关闭数据库连接
代码
package com.it.web; import java.io.IOException; import java.sql.Connection; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.it.dao.UserDao; import com.it.model.User; import com.it.util.Dbutil; import com.it.util.StringUtil; /** * 登录功能的servlet * @author YandeHu * */ public class LoginServet extends HttpServlet{ //创建数据库工具类的连接 Dbutil dbutil=new Dbutil(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName=request.getParameter("userName");//从前台获取userName的数据 String password=request.getParameter("password");//从前台获取password的数据 request.setAttribute("userName", userName); request.setAttribute("password", password); //服务器端进行验证 验证用户名和密码是不是空的 if(StringUtil.isEmpty(userName)||StringUtil.isEmpty(password)){ //服务器端跳转和客户端跳转的区别 request.setAttribute("error", "用户名或者密码为空!"); request.getRequestDispatcher("index.jsp").forward(request, response);//服务器端跳转\ return; } //连接数据库 User user=new User(userName,password); //创建从客户端输入的信息的 所初始化的对象 Connection con=null; try { con=dbutil.getCon(); //进行数据库查询 User currentUser=UserDao.login(con, user); //这是返回从数据库中查询后 返回的User对象 if(currentUser==null){ request.setAttribute("error", "用户名或者密码错误"); //服务器端跳转 重定向 request.getRequestDispatcher("index.jsp").forward(request, response); return;//结束这个方法 }else{ response.sendRedirect("main.jsp"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { dbutil.closeCon(con); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }