服务器重定向和客户端重定向

一、服务器重定向

  服务器重定向又叫做服务器转发和服务器跳转,在大部分的开发中从用户发送请求到看到数据会经历如下过程:

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>

 服务器重定向和客户端重定向