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

来源:互联网 发布:vb.net 双引号转义字符 编辑:程序博客网 时间:2024/05/17 10:39

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

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

重定向代码实现

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--消亡了....");    }}