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:
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
:
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
:
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