servlet重定向和请求转发的相关知识点整理

s1.请求转发:
* 请求转发通过HttpServletRequest对象获取请求转发器的实现
* 请求转发是服务器内部的行为,对客户端是隐蔽的
* 客户端只是发送了一次请求,客户端地址栏不变
* 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源
* 因为全程只有一个HttpServletRequest对象,所以请求参数可以传递,请求域中的数据可以传递
* 请求转发可以转发给其他serlvet动态资源,也可以转发给一些静态资源以实现页面跳转
* 请求转发可以转发给WEB-INF下受保护的资源
* 请求转发不能转发到本项目以外的外部资源       比如转发给:http://www.baidu.com

代码示例:

@WebServlet("/setvletb")
public class servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //
        String user = req.getParameter("user");
        System.out.println(user);
        System.out.println("servlet2执行了");
    }
}
@WebServlet("/setvleta")
public class servlet1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求转发器
        //转发到另一个服务器
        RequestDispatcher servlet2 = req.getRequestDispatcher("setvletb");
        //转发到其他静态资源
        //RequestDispatcher requestDispatcher = req.getRequestDispatcher("a.html");
        //让请求转发器做出转发动作
        /*
        * 请求转发相对路径处理方式和前端相同
        *
        * 绝对路径:
        *  请求转发的绝对路径不需要加项目上下文
        * req.getRequestDispatcher("/servlet2").forward(req,resp);
        **/
        //req.getRequestDispatcher("/servlet2").forward(req,resp);

        servlet2.forward(req,resp);
    }
}

 servlet重定向:

* 1.响应重定向通过HttpServletResponse的sendRedirect方法实现
* 2.响应重定向是服务器端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务器提示下的,客户端的行为
* 3.客户端至少发送了两次请求,客户端地址栏是变化的
* 4.服务器产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源
* 5.因为全程产生了多个HttpServletResponse对象,所以请求参数不可以传递,请求域中的数据也不可以传递
* 6.重定向可以是其他servlet动态资源,也可以是一些静态资源以实现页面跳转
* 7.重定向不可以访问WEN-INF下受保护的资源
* 8.重定向可以访问到本项目之外的 外部资源
*
* 重点:同样实现了页面跳转,优先使用重定向

代码示例:

@WebServlet("/servletA")
public class servletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletA执行了");
        //响应重定向
        //resp.sendRedirect("servletB");      //这个方法,设置了响应状态码为302,响应location头信息为servletB
        //这里的路径设置和前端的相同
        //同样可以跳转到视图资源
        resp.sendRedirect("a.html");
    }

}
@WebServlet("/servletB")
public class servletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletB执行了");
    }
}
设置serlvet请求数据的编码格式及响应时的编码数据格式:

 1.设置serlvet请求数据的编码格式

@WebServlet("/servletResponse")
public class testResponse extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接受请求数据的数据格式,更适用于post,
        req.setCharacterEncoding("UTF-8");
    }
}

 设置serlvet响应时的编码数据格式:

@WebServlet("/servletResponse")
public class testResponse extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置响应体的数据编码格式,一般建议写下面的 两步,第一步设置响应体的数据编码格式,第二步设置客户端解析时的数据编码格式
        //设置响应体的数据编码格式
        resp.setCharacterEncoding("UTF-8");
        //设置客户端解析时的数据格式
        resp.setContentType("text/html;character=UTF-8");

        resp.getWriter().write("你好,世界");
    }
}

相对路径和绝对路径设置

相对路径:不以/开头
      首先获取当前访问资源的路径:http://localhost:8080/demo3/a.html
      当前资源所在路径是:http://localhost:8080/demo3/
      当前资源的路径是:a.html
      目标资源的相对路径:image/a.jpg
      所以这里在访问目标资源路径是,就是上面的当前资源所在路径+目标资源路径

代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 this is page a
 <br>
<!-- 这里使用的是相对路径:不以/开头
      首先获取当前访问资源的路径:http://localhost:8080/demo3/a.html
      当前资源所在路径是:http://localhost:8080/demo3/
      当前资源的路径是:a.html
      目标资源的相对路径:image/a.jpg
      所以这里在访问目标资源路径是,就是上面的当前资源所在路径+目标资源路径
-->
<img src="image/a.jpg">
</body>
</html>

绝对路径:

始终以固定的出发点去寻找目标资源,和当前资源所在路径没有关系
语法:以/开头
优点:目标资源路径下的写法不会受当前资源路径的路径所影响,始终是固定的写法
缺点:绝对路径要补充项目的上下文,这个上下文是会改变的

解决措施1:
可以在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径

代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 this is page a
 <br>
<!--这里使用绝对路径
            始终以固定的出发点去寻找目标资源,和当前资源所在路径没有关系
            语法:以/开头
            优点:目标资源路径下的写法不会受当前资源路径的路径所影响,始终是固定的写法
            缺点:绝对路径要补充项目的上下文,这个上下文是会改变的

            解决措施1:
            可以在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径


-->
 <br>
<img src="/demo3/image/b.jpg"/>
</body>
</html>

通过在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径

代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    这里设置路径的公共前缀-->
    <base href="/demo3/">
</head>
<body>
 this is page a
 <br>
 <!--这里使用绝对路径
            始终以固定的出发点去寻找目标资源,和当前资源所在路径没有关系
            语法:以/开头
            优点:目标资源路径下的写法不会受当前资源路径的路径所影响,始终是固定的写法
            缺点:绝对路径要补充项目的上下文,这个上下文是会改变的

            解决措施1:
            可以在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径
            所以这里的访问路径就是:http://localhost:8080/demo3/image/b.jpg
            把相对路径变成了绝对路径
            -->

<img src="image/b.jpg">

</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值