Servlet介绍(7)-----HttpServletRequest、HttpSession、Se

作者:简简单单 2008-04-28

Servlet中的几个对象:

HttpServletRequestHttpSessionServletContext,这三个对象都有

void setAttribute(String name,  Object o)void removeAttribute(String name)

这两个方法,通过这两个方法我们可以很方便的进行参数的传递。

三个对象的作用域的大小分别由小到大。当我们把一个对象通过void setAttribute(String name,  Object o)添加到这三个对象中的时候,除非我们显示的调用void removeAttribute(String name)或者当这三个对象自己销毁否则不会释放这些对象占用的空间,所以我们在将一个对象通过setAttribute添加到这三个对象时,需要注意用完了就remove(当然用完以后这个添加到的对象本身就快销毁时,我们也没必要多此一举)。而且尽量当对象存放在HttpServletRequest,然后才是HttpSession最后才是ServletContext。尽量不要把大对象存放在这些对象中,因为一个进程占用的资源毕竟是有限的。

 

 

Servlet中路径跳转的问题:

   

让我们先通过一个例子来看一下HttpServletRequest的获取路径的一些方法的返回值。

 

ServletPath:



package squall.servlet.path;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

 

public class ServletPath extends HttpServlet

{

 

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
{

              showParam(req,resp);

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
{

              showParam(req,resp);

       }


       
private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException

       
{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= " ";

 

              

              out.println(docType 
+ " " + " pathshow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /><br />                            </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> " + " "

                            
+"getContextPath():  " + req.getContextPath() + "   
"

                            
+"getPathInfo():        " + req.getPathInfo() + "   
"

                            
+"getRequestURI():   " + req.getRequestURI()+ "   
"

                            
+"getRequestURL():   " + req.getRequestURL()+ "   
"

                            
+"getServletPath():   " + req.getServletPath()+ "   
"

                            
+"getQueryString():  " + req.getQueryString()+ "   
"

                            );

 

          out.println(
"");

       }


       

}


 

将此Servlet部署后,mapping/ServletPath/*

在浏览器输入http://127.0.0.1:8080/train/ServletPath/a/b/c?name=1&passord=2

可以看到如下输出:

getContextPath(): /train
     getPathInfo(): /a/b/c
     getRequestURI(): /train/ServletPath/a/b/c
     getRequestURL(): http://127.0.0.1:8080/train/ServletPath/a/b/c
     getServletPath(): /ServletPath
     getQueryString(): name=1&passord=2

 

我们可以很清楚的看到各个方法的返回值的情况。

 

     一个html,Servlet,jsp访问另外一个Servlet时候可以通过相对路径(相对于当前的路径),相对于同一Web应用下的路径(比如我们的/train,通过request.getContextPath()获得)和绝对路径(直接http://...)

 

我们一般在Servlet中访问另外一个Servlet或者jsp可以通过Servlet输出中的HTML元素FORM的属性值ACTION来实现。但是我们有时候可以采用一些更加方便的方法。

 

 

 

下面简单的介绍3个方法:

RequestDispatcher

     void forward(ServletRequest request, ServletResponse response)

     void include(ServletRequest request, ServletResponse response)方法。

 HttpResponsevoid sendRedirect(String location)方法。

 

 我们先来介绍HttpResponsevoid sendRedirect(String location)方法。

这个方法将请求一个urllocation的页面, location可以是一个相对路径、相对于当前WEB应用的路径或者直接Http开头的路径,下面让我们看一个例子吧。

BeforeSendRedirect

 



package squall.servlet.path;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class BeforeSendRedirect extends HttpServlet

{

 

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= " ";

              req.setAttribute(
"canyousee""this");

              

              out.println(docType 
+ " " + " BeforeSendRedirect</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /><br />                            </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> " + " "

                            
+"     

BeforeSendRedirect

    
"

                            );

                 out.println(
""); 

              resp.sendRedirect(
"AfterSendRedirect");

       

         System.err.println(
"canyousee " + req.getAttribute("canyousee"+ " in BeforeSendRedirect");

         System.err.println(
"end in BeforeSendRedirect");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
{

              doGet(req,resp);

       }


       

}


 

 

AfterSendRedirect

 



package squall.servlet.path;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class AfterSendRedirect extends HttpServlet

{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
{

              System.err.println(
"begin AfterSendRedirect!");

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= " ";

              

              out.println(docType 
+ " " + " AfterSendRedirect</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><br />                            </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> " + " "

                            
+ "     

AfterSendRedirect

    
");

              out.println(
"");

              System.err.println(
"canyousee " + req.getAttribute("canyousee"+ " in AfterSendRedirect");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
{

              doGet(req, resp);

       }


}


 

 

BeforeSendRedirect mapping/BeforeSendRedirect

BeforeSendRedirect mapping/AfterSendRedirect

然后我们访问http://127.0.0.1:8080/train/BeforeSendRedirect ,可以看到页面跳转到http://127.0.0.1:8080/train/AfterSendRedirect,并且页面上显示的内容也是

AfterSendRedirect

并且tomcat控制台输出为:

canyousee this in BeforeSendRedirect

相关文章

精彩推荐

一聚教程网

Copyright © 2010-2024

111com.net All Rights Reserved