forwarud()方法是向服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后再将这些内容发送给浏览器中。在整个过程中,浏览器并不知道服务器中内容来自哪里,所以地址栏中URL不会改变。而在服务器中,当执行到forward()方法时,Servlet会向统一项目下其他资源(可以是其他Servlet也可以是JSP)发送请求,然后第三方处理后再将第三方结果直接返回给浏览器。
工作原理如图:
代码语法:
request.getRequestDispatcher("其他资源(Servlet或者JSP)").forward(request,response);
(2) 利用SendRedirect()方法进行重定向
sendRedirect()方法就是首先浏览器向Servlet(JSP)发送了请求,然后服务器根据业务逻辑,发送一个状态码,然后浏览器通过这个状态码就能够向这个新的地址发起请求,在新地址的Servlet(JSP)中再次获取想要的资源。注意这两次请求视为两次不同的请求,所以在浏览器的地址栏中可以观察到两次的URL地址不同。
工作原理如图:
代码语法:
response.sendRedirect("其他资源的位置(可以使用相对URL地址)");
2.实例演示
以下是一个对数据 *** 作的实例,其中使用到转发进行页面的跳转
HTML源码:
数字计算
这里将进行开根号再乘十的数据处理
示例中,进行分步骤的处理,三个Servlet来完成工作
1 开方
2 乘十
3显示
知识点:
转发处理
传参
数据类型的转换
接下来是Servlet源码:
首先是第一个Servlet代码,只完成一项工作就是将数据进行开方:
public class OperServlet extends HttpServlet
{
public void init(){}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//获取请求参数
String strcount=request.getParameter("count");
int count = (int)Double.parseDouble(strcount);
//int count = (int)Integer.parseInt(strcount);
//进行开根号处理
count = (int)Math.sqrt(count);
String str=String.valueOf(count);
//设置请求上属性的参数
request.setAttribute("count",str);
// 转发给另一个Servlet来处理
request.getRequestDispatcher("operTwoServlet").forward(request,response);
}
}
可以看到代码最后运行一句request.getRequestDispatcher("operTwoServlet").forward(request,response);
这就是将请求转发到其他Servlet(这里是operTwoServlet)进行处理。
接下来是第二个Servlet代码,也只完成了一项工作是将数据乘以10:
public class OperTwoServlet extends HttpServlet
{
public void init(){}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
// 获取请求属性上的参数
String strcount=(String)request.getAttribute("count");
int count=Integer.parseInt(strcount);
// 进行乘10处理
count *= 10;
// 再次置入请求属性的参数
request.setAttribute("count",String.valueOf(count));
// 转发给另一个Servlet来处理
request.getRequestDispatcher("showServlet").forward(request,response);
}
}
最后也使用转发,将请求转发到了showServlet中进行处理。
最后一个Servlet也只完成了显示的功能:
public class ShowServlet extends HttpServlet
{
public void init(){}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//获取请求属性上的参数
String strcount=(String)request.getAttribute("count");
String prefix = "开方十乘处理后的结果是:";
out.println(prefix+strcount);
}
}
这里就最后的数据显示到了浏览器中。
结果演示:
在浏览器中输入9,经过数据处理结果应该是30。
结果正确,说明整个流程实现无误,也可以看到合理使用转发和重定向可以使代码更好地满足高内聚、低耦合的特点。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)