我们在访问网站的时候,经常需要充一个页面调到另个一个页面,那么低层是怎么实现 的呢?
重定向和转发
底层示意图
简要说一下两者区别:重定向是通过两次访问来实现跳转、而转发是一次(战内),重定向是两次请求,所以第二次请求可以是任意网站,而转发是把服务器的其他页面显示上去,因此不能跳转至服务器内没有的页面,即不能是站外的网页。
重定向代码实现
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方法。
- 只会被初始化一次。由容器初始化。初始化成功后将缓存与容器中。
它的初始时间分为两种:
- 用户第一次访问时。
- 服务器启动时。-需要配置
。
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--消亡了....");
}
}