服务器重定向和客户端重定向
Posted 上下平中
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器重定向和客户端重定向相关的知识,希望对你有一定的参考价值。
一、服务器重定向
服务器重定向又叫做服务器转发和服务器跳转,在大部分的开发中从用户发送请求到看到数据会经历如下过程:
1.用户发送请求到服务器
2.服务器会将请求交给对应的控制器(目前是Servlet)处理,在控制器中调用业务层方法取得数据
3.之后将取得数据保存到request内置对象
4.然后在跳转到页面将保存在request内置对象中的数据再次取出来之后显示到页面,用户就有能够看到信息
总结:服务器端重定向(跳转,转发)的特征
1.实现的方式是调用RequestDispatcher类的forword()方法
2.服务器端转发浏览器的地址栏信息不会发生改变
3.使用服务器端转发之后,可以在jsp页面中取得保存在request内置对象中的属性
4.使用${参数名}在jsp中取得对应的值的方式叫做EL表达式
服务器重定向简单demo,实现数据库中的雇员信息保存到request内置对象并在jsp中显示
public class EmpServlet extends HttpServlet{ //取得业务层实现类对象 private IEmpService empservice=(IEmpService)ServiceFactory.getInstance(IEmpServiceImpl.class); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //将雇员信息保存到requset内置对象 Integer empno = Integer.parseInt(req.getParameter("id")); try { //将查询到的数据保存到request内置对象 req.setAttribute("emp", empservice.findEmpById(empno)); //跳转显示雇员的页面 //取得实现跳转的对象 RequestDispatcher dispatcher = req.getRequestDispatcher("/pages/emp.jsp"); //开始转发 dispatcher.forward(req, resp); } catch (Exception e) { e.printStackTrace(); } } }
jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1> 显示雇员的信息 ${emp} </h1> <table border="1"> <tr> <td>编号</td><td>姓名</td><td>职位</td><td>领导编号</td><td>入职日期</td> <td>薪资</td><td>奖金</td><td>部门编号</td> </tr> <tr> <td>${emp.empno}</td> <td>${emp.ename}</td> <td>${emp.job}</td> <td>${emp.mgr}</td> <td>${emp.hiredate}</td> <td>${emp.sal}</td> <td>${emp.comm}</td> <td>${emp.deptno}</td> </tr> </table> </body> </html>
二、客户端重定向
客户端重定向又叫做客户端转发,就是每次进行的转发都是客户端的一个新的请求。实现客户端转发的方式有很多,如页面的超链接转发、表单提交、js中使用window.locatino.href实现 的都是客户端转发,但是以上的的转发是在客户端直接实现的,也可以在servlet中实现客户端转发,要在servlet实现客户端转发需要使用到response内置对象的一个方法sendRedirect("转发的路径")。
总结:客户端重定向(转发)的特征
1.浏览器地址栏信息改变,不再是提交表单的路径
2.客户端转发就是发送了一次新的请求,在整个登录中发送了两次请求,第一次点击登录按钮提交表单时候的请求,第二次在servlet中使用sendRediect方法实现的跳转(跳转到欢迎页面)
3.客户端转发之后保存在request内置对象中的属性不存在了,因为是一次新的请求,而request只能表示当次表示请求
与服务器端转发的区别
1.服务器端转发时浏览器的地址栏信息没有发生改变
2.服务器端转发欢迎页面(jsp页面)之后依然可以取得保存在request内置对象中的属性
3.服务器端转发对于客户端来就只发送了一次请求
客户端转发简单demo,实现验证数据库中ALLEN帐户登录
public class EmpServlet extends HttpServlet{ //取得业务层实现类对象 private IEmpService empservice=(IEmpService)ServiceFactory.getInstance(IEmpServiceImpl.class); //客户端转发demo @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String pathInfo=req.getPathInfo(); try { if ("/login".equals(pathInfo)) { this.login(req, resp); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 负责登录的方法 * @param req * @param resp * @throws Exception */ public void login(HttpServletRequest req, HttpServletResponse resp)throws Exception { String name = req.getParameter("username"); String pwd = req.getParameter("pwd"); //查询数据库中的用户名和密码和用户输入的进行对比 Emp emp = empservice.findLogin(name, pwd); if (emp!=null) { System.out.println("登录成功!"); //跳转到欢迎页面或者首页,客户端跳转 req.getSession().setAttribute("emp", emp); resp.sendRedirect("/MvcPro/pages/welcome.jsp"); } else { System.out.println("用户名和密码不正确!"); //重新返回登录页面再次登录,服务器端跳转(转发) req.getRequestDispatcher("/pages/login.html").forward(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1> 欢迎${emp.ename}光临! </h1> </body> </html>
以上是关于服务器重定向和客户端重定向的主要内容,如果未能解决你的问题,请参考以下文章
Javascript发布请求回调,从.NET MVC控制器重定向