Servlet详解---Servlet跳转

Servlet跳转

从一个JSP或者是一个HTML页面可以通过表单或超链接跳转进Servlet,那么从Servlet也可以跳转到其他的Servlet、JSP或其他页面。

关于跳转,之前强调过有两种:

1):客户端跳转:地址栏跳转之后改变,而且无法传递request范围的属性,是在所有的操作都执行完毕之后才发生跳转的操作,语法:response sendRedirect()。

2):服务器端跳转:地址栏不改变,而且可以传递request范围的属性,属于无条件跳转,只要执行到了,则立刻执行跳转操作,语法:<jsp:forword>


Servlet之中也是可以完成跳转的,而且既然Servlet本身已经存在了HttpServletResponse对象,所以,直接通过此对象的sendRedirect()方法就可以完成跳转操作。


Servlet程序跳转的验证程序如下:【ClientRedirectDemo.java】

package com.skewrain.demo2;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ClientRedirectDemo extends HttpServlet {

    public void doGet(HttpServletRequest req,HttpServletResponse resp)

        throws ServletException,IOException{

        req.getSession().setAttribute("name","斜雨");

        req.setAttribute("info","skewrain");

        resp.sendRedirect("get_info.jsp");

    }

    public void doPost(HttpServletRequest req,HttpServletResponse resp)

        throws ServletException,IOException{

        this.doGet(req,resp);

    }

}

该Servlet程序的配置信息如下:

<servlet>

    <servlet-name>client</servlet-name>

    <servlet-class>com.skewrain.demo2.ClientRedirectDemo</servlet-class>

</servlet>

<servlet-mapping>

     <servlet-name>client</servlet-name>

     <url-pattern>/servletforward/ClientRedirectDemo</url-pattern>

</servlet-mapping>

这个程序中,我们在虚拟目录org目录下新建了一个servletforward目录,里面存放该Servlet要跳转进入的JSP文件,所以,在配置该Servlet的时候要特别注意。


【get_info.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>www.baidu.com</title></head>

<body>

    <%   request.setCharacterEncoding("GBK");  %>

    <h2>session属性:<%=session.getAttribute("name")%></h2>

    <h2>request属性:<%=request.getAttribute("info")%></h2>

</body>

</html>

首先,我们先执行Servlet:

我们用浏览器打开虚拟目录在“skewrain/”后面加上servletforward/ClientRedirectDemo,结果如下:


可见,浏览器的地址栏发生了改变,已经跳转到了get_info.jsp页面。


此时执行完成之后,可以发现已经将session的属性的内容进行了传递,但是request属性范围并没有传递,因为客户端跳转根本就无法完成request属性的传递。


服务器端跳转(重点)

在Servlet中没有像JSP中的<jsp:forward>指令,所以,如果要想执行服务器端跳转的话,就必须依靠RequestDispatcher接口完成,此接口中提供了如下的两个方法:

Public void forward(ServletRequest request,ServletResponse response)throws ServletException,IOException

Public void include(ServletRequest request,ServletResponse response)throws ServletException,IOException

使用RequestDispather接口的forward()方法就可以完成跳转功能的实现,但是如果要想使用此接口还需要使用ServletRequest接口提供的如下方法进行实例化

Public RequestDispatcher getRequestDispatcher(String path)。


在JSP中存在了<jsp:forward>,但是在Servlet之中,此操作并不存在,所以必须依靠RequestDispather接口。

但是现在的一个问题是RequestDispather是一个接口,那么如果要想使用此接口必须为其进行接口的对象实例化操作,但是此时只能依靠ServletRequest接口才可以完成。


在ServletRequest接口中,存在如下方法:

RequestDispatcher getRequestDispatcher(String path)。

 

服务器端跳转的演示程序如下:【ServerRedirectDemo.java】

package com.skewrain.demo2;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ServerRedirectDemo extends HttpServlet {

    public void doGet(HttpServletRequest req,HttpServletResponse resp)

        throws ServletException,IOException{

        req.getSession().setAttribute("name","斜雨");

        req.setAttribute("info","skewrain");

        RequestDispatcher rd = req.getRequestDispatcher("get_info.jsp"); //准备好了跳转操作

        rd.forward(req,resp);  //完成跳转

    }

    public void doPost(HttpServletRequest req,HttpServletResponse resp)

        throws ServletException,IOException{

        this.doGet(req,resp);

    }

}

配置的xml文件如下:

<servlet>

    <servlet-name>server</servlet-name>

    <servlet-class>com.skewrain.demo2.ServerRedirectDemo</servlet-class>

</servlet>

<servlet-mapping>

     <servlet-name>server</servlet-name>

     <url-pattern>/servletforward/ServerRedirectDemo</url-pattern>

</servlet-mapping>

Get_info.jsp的内容不变。我们在打开虚拟目录skewrain,在后面输入:servletforward/ServerRedirectDemo,然后回车,产生的结果如下:


而且,地址栏没有发生任何改变。页面跳转成功。

服务器端跳转在实际开发中的应用比率为95%。


小结:

1):两种跳转的区别;

2):服务器端跳转可以传递request范围的属性,而客户端跳转无法传递request范围的属性。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值