现在的位置: 首页 > 综合 > 正文

Servlet介绍(7)—–HttpServletRequest、HttpSession、ServletContext、RequestDispatcher

2013年01月28日 ⁄ 综合 ⁄ 共 5750字 ⁄ 字号 评论关闭

原创
 
Servlet介绍(7)-----HttpServletRequest、HttpSession、ServletContext、RequestDispatcher

收藏

Servlet

中的几个对象:

HttpServletRequest


HttpSession


ServletContext

,这三个对象都有

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 

=
 
"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
"
;


 


              


              out.println(docType 

+
 
"
<HTML>
"
 
+
 
"
<HEAD><TITLE> pathshow
"
 


                            

+
 
"
</TITLE></HEAD>
"
 
+
 
"
<BODY BGCOLOR="#FDF5E6">
"



                            

+
"
getContextPath():  
"
 
+
 req.getContextPath() 
+
 
"
   </br>
"



                            

+
"
getPathInfo():        
"
 
+
 req.getPathInfo() 
+
 
"
   </br>
"



                            

+
"
getRequestURI():   
"
 
+
 req.getRequestURI()
+
 
"
   </br>
"



                            

+
"
getRequestURL():   
"
 
+
 req.getRequestURL()
+
 
"
   </br>
"



                            

+
"
getServletPath():   
"
 
+
 req.getServletPath()
+
 
"
   </br>
"



                            

+
"
getQueryString():  
"
 
+
 req.getQueryString()
+
 
"
   </br>
"



                            );


 


          out.println(

"
</body></html>
"
);


       }





       


}




 

将此
Servlet

部署后,
mapping


<url-pattern>/ServletPath/*</url-pattern>

在浏览器输入
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)
方法。


 
HttpResponse


void

sendRedirect(String location)
方法。

 

 

我们先来介绍
HttpResponse

void

sendRedirect(String location)
方法。

这个方法将请求一个
url

location
的页面
, 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 

=
 
"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
"
;


              req.setAttribute(

"
canyousee
"

"
this
"
);


              


              out.println(docType 

+
 
"
<HTML>
"
 
+
 
"
<HEAD><TITLE> BeforeSendRedirect
"
 


                            

+
 
"
</TITLE></HEAD>
"
 
+
 
"
<BODY BGCOLOR="#FDF5E6">
"



                            

+
"
     <h1>BeforeSendRedirect</h1>    </br>
"



                            );


                 out.println(

"
</body></html>
"
); 


              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


抱歉!评论已关闭.