我们在访问网站的时候,经常需要充一个页面调到另个一个页面,那么低层是怎么实现 的呢? 重定向和转发 底层示意图
简要说一下两者区别:重定向是通过两次访问来实现跳转、而转发是一次(战内),重定向是两次请求,所以第二次请求可以是任意网站,而转发是把服务器的其他页面显示上去,因此不能跳转至服务器内没有的页面,即不能是站外的网页。
重定向代码实现
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是JavaWeb应用中最核心的组件,是运行在服务中的程序。 Servlet可以完成以下任务:
动态生成HTML文档。将请求转发给Servlet组件读取客户端的Cookie,以及向客户端写入Cookie。访问服务器的资源,如数据库、 XML、文件对像等。Servlet的特点如下:
Servlet对像,由Servlet容器(Tomcat)创建。Servlet是一个接口:位于javax.servlet包中。init方法。 - 只会被初始化一次。由容器初始化。初始化成功后将缓存与容器中。
它的初始时间分为两种:
用户第一次访问时。服务器启动时。-需要配置。 service方法
每次请求都会访问此方法。每次请求都会创建新的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--消亡了...."); } }