网络编程---重定向和转发底层原理以及Servlet

我们在访问网站的时候,经常需要充一个页面调到另个一个页面,那么低层是怎么实现 的呢?
重定向和转发
底层示意图
这里写图片描述

简要说一下两者区别:重定向是通过两次访问来实现跳转、而转发是一次(战内),重定向是两次请求,所以第二次请求可以是任意网站,而转发是把服务器的其他页面显示上去,因此不能跳转至服务器内没有的页面,即不能是站外的网页。

重定向代码实现

package cn.hncu.servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RedirectServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        System.out.println(name+","+pwd);

        //法1: 通过HTTP协议的方式来实现重定向
        //resp.setStatus(HttpServletResponse.SC_FOUND);//设置状态码
        //resp.setHeader("Location", "/httpWebDemo/jsps/1.jsp");

        //法2: 利用HttpServletResponse类中的sendRedirect()方法帮我们完成
        //resp.sendRedirect("/httpWebDemo/jsps/1.jsp");
        resp.sendRedirect("/httpWebDemo/jsps/1.jsp?name="+name+"&pwd="+pwd);//如果要给重定向的结果页面传参数,得把参数添加到url地址中
        //resp.sendRedirect("http://www.hncu.net");//可以重定向到站外---我们的项目以外的其它项目(网站)
    }
}

转发代码实现

package cn.hncu.servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ForwardServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        System.out.println("2--"+name+","+pwd);

        //转发
        RequestDispatcher rd = req.getRequestDispatcher("/jsps/2.jsp");
        //RequestDispatcher rd = req.getRequestDispatcher("http://www.hncu.net");//WA:转发只能在站内进行
        rd.forward(req, resp);//转发,同时把参数req和resp向前传递

    }
}

两者都是web项目的服务实现类代码。


servlet的简介

Servlet是JavaWeb应用中最核心的组件,是运行在服务中的程序。
Servlet可以完成以下任务:

  • 动态生成HTML文档。
  • 将请求转发给Servlet组件
  • 读取客户端的Cookie,以及向客户端写入Cookie。
  • 访问服务器的资源,如数据库、 XML、文件对像等。

Servlet的特点如下:

  • Servlet对像,由Servlet容器(Tomcat)创建。
  • Servlet是一个接口:位于javax.servlet包中。

init方法
- 只会被初始化一次。由容器初始化。初始化成功后将缓存与容器中。

它的初始时间分为两种:

  1. 用户第一次访问时。
  2. 服务器启动时。-需要配置


service方法

  1. 每次请求都会访问此方法。
  2. 每次请求都会创建新的Request和Response对像。

destory方法
当服务器关闭时由容器调用并销毁。

下面是两个演示Servlet方法生命周期的代码

package cn.hncu.servlets;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstServlet implements Servlet{
    private String charset=null;
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("1初始化");

        //读取参数
        charset = config.getInitParameter("charset");

    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("2读取该servlet在web.xml中的配置参数...");
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse resp)
            throws ServletException, IOException {
        System.out.println("3--进行服务响应....");
        System.out.println(this);
        System.out.println("req:"+req);
        System.out.println("resp:"+resp);

        req.setCharacterEncoding(charset);

        String name = req.getParameter("name");
        System.out.println(name);
    }

    @Override
    public String getServletInfo() {
        System.out.println("很少用,一般是返回该servlet的信息如作者和版本等");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("4--消亡了....");
    }

}
package cn.hncu.servlets;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SecondServlet implements Servlet{

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("aaaa1初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("aaaaa2读取该servlet在web.xml中的配置参数...");
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        System.out.println("aaaa3--进行服务响应....");
        System.out.println(this.hashCode());
    }

    @Override
    public String getServletInfo() {
        System.out.println("aaaa很少用,一般是返回该servlet的信息如作者和版本等");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("aaaaa4--消亡了....");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值