Servlet中的转发和重定向总结

4 篇文章 1 订阅

Servlet中的转发和重定向总结

1. 关于项目下的WEB-INF目录

Web-INF目录下的资源文件安全性都很高。他不能直接通过浏览器来访问访问它的方式只有一种:那就是通过服务器来访问

所以WEB-INF目录下一般存放的是lib、Spring配置文件,服务器配置文件,以及一些访问安全性较高的jsp/html页面(后台管理等页面)。

==如果要访问WEB-INF下的jsp/html页面,只能通过请求转发(控制层)==来访问,不能通过重定向来访问(因为重定向是让浏览器来直接发出请求)。

2. 转发
1. 转发的概念

转发主要是将为浏览器的请求交给另外一个servlet或jsp来处理,借助request对象完成,在服务器内部跳转,浏览器的地址并不发生变化,并且浏览器并不知道服务器内部发生了跳转,整个过程只会发生一次请求,转发和调用者都可以共享request对象和response对象。

2. 使用方法
request.getRequestDispatcher(String url).forward(req, resp);
3. 转发的优点

转发的优点一是安全性高,在内部发生跳转,浏览器地址不变;二是节省资源,转发只需要一次请求,就可以访问至少两个servlet或jsp页面。在实际开发中,转发用到最多。

转发缺点是只能在同一个web应用内使用,不能转发到外部的url地址。

3. 重定向
1. 重定向的概念

重定向是指服务器通知浏览器向一个新的地址发送请求,由response对象完成,可以重定向到新的servlet(服务器内部),也可以重定向到外部url(外部应用),浏览器地址发生变化,浏览器知道发生了跳转,整个过程会产生两次请求,重定向的调用者和被调用者不能共同共享request对象和response对象。

2. 使用方法
response.sendRedirect(String url);
3. 重定向的缺点

重定向的优点是不限制应用范围,可以重定向到服务器内部其它资源,也可以是外部的应用。

重定向的缺点是耗费请求资源,重定向的整个过程发生了两次的请求,一个是资源消耗上比转发大,效率也比转发低;另外,因为浏览器的地址发生了变化,相对转发来讲,安全性没有转发高。

4. 路径问题

不管使用重定向还是使用转发,都会涉及到路径的问题。他们都可以使用绝对路径或相对路径。

绝对路径以"/“开头,相对路径不以”/"开头。

在项目中如果要使用绝对路径,需要注意:

  • 重定向的路径是从应用名(上下文)开始,因为重定向时,服务器不知道这个请求是否在应用内部还是外部,所以需要加上应用名
  • 转发时的路径是从应用名之后开始,转发是在服务器内部,在同一应用下,可以不写应用名。

总结一下就是,转发时使用"/"开头则代表了"http://127.0.0.1:8080/Myweb/"路径;重定向时使用"/"开头,则代表了"http://127.0.0.1:8080/"路径,需要再加上应用名。

当然,为了避免直接将应用名卸载地址中,可以直接使用request.getContextPath()方法来代替。

5. 一个例子

这里写了两个Servlet,Servlet1对应请求路径/s1,Servlet5对应请求路径/s5。通过请求/s1,Servlet1将请求转发给Servlet5,Servlet5再将请求重定向到一个a.jsp页面。

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        System.out.println("请求/s1,转发到/s5");
        req.getRequestDispatcher("/s5").forward(req, resp);
    }
}
public class Servlet5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        System.out.println("/s5收到转发请求,重定向给a.jsp");
        resp.sendRedirect("a.jsp");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值