问题集锦:Servlets/JSP开发技术问答
2024-09-05 00:20:09
供稿:网友
为什么genericservlet在init(servletconfig config)基础上增加了一个init()方法?
init()方法被genericservlet.init(servletconfig config)方法调用。
init()方法方便了开发人员定制servlet的初始化,而无须去维护servletconfig对象的存储工作。
重写genericservlet.init(servletconfig config)必须要显示的调用super.init(config)方法。
servletcontext.getcontect(java.lang.string uripath)的作用是什么?
返回同一server中指定的path对应的servletcontext对象,通过该对象可以实现与server中的其他context打交道。
uripath必须是以"/"开始(该路径的含义是相对于整个servlet文档的根路径,而不是当前servletcontext的根路径)。
servlet生命周期是什么?
一般的servlet(genericservlet,即与协议无关的servlet)的生命周期:init() --> genericservlet.service(servletrequest req, servletresponse res) --> destroy.
httpservlet的生命周期: init() --> genericservlet.service(servletrequest req, servletresponse res)---> service(httpservletrequest req, httpservletresponse resp) --> doxxxx()-->destroy.
有没有必要重写genericservlet.service()方法?
对于httpservlet来说没有必要。只需要重写它的doxxxx()方法就可以了。httpservlet中service()方法会自动的根据用户请求类型把请求转发给相应的doxxxx()方法(例如doget()方法)。
servletrequest.getreader()和servletrequest.getinputstream()如何使用?
注意两个方法不能同时使用。
servletrequest.getrealpath(string path)方法已经不推荐使用。
请使用servletcontext.getrealpath(string path)方法。
servletresponse缺省的字符集(charset)是什么?
servletresponse缺省的字符集(charset)是iso-8859-1,可以通过setcontenttype(java.lang.string)方法改变新的字符集。
例如:setcontenttype("text/html; charset=shift_jis").
关于字符集信息,可以浏览rfc 2045
httpservletrequest.getrequesturi()和httpservletrequest.getrequesturl()区别是什么?
request.getrequesturi() 返回值类似:/xuejava/requestdemo.jsp
request.getrequesturl() 返回值类似:http://localhost:8080/xuejava/requestdemo.jsp
httpservletrequest.encodeurl()和httpservletrequest.encoderedirecturl(()区别是什么?为什么要有两个不同的方法呢?
当用url-rewriting方式来管理session的时候,需要用到以上的两个方法。
两个方法的不同点是:两个方法确定是否需要包含session id的逻辑不同。
在调用httpservletresponse.sendredirect前,应该先调用encoderedirecturl()方法,否则可能会丢失sesssion信息。 ...
如何使你的servlet或者jsp实现single thread model?
对于servlet实现javax.single.singlethreadmodel接口。
对于jsp,在page directive中写如下的语句<%@ page isthreadsafe="false" %>
jsp tag 和 jsp xml-based tag
...
如何把某一个jsp page定义成为error page?为什么要这样做?
实现方法: <%@ page iserrorpage="true" %>
为什么? 因为需要获取exception 对象(缺省情况下,在jsp page中是不能直接使用“隐含对象” exception的)。
jsp page的执行顺序是如何的?
jsp page的执行顺序如下:
jsp page translation. jsp page --> servlet source code.
jsp page compilation. servlet source code --> servlet class.
load class(first time or the server restarted)
create instance(可能会很多次,如果jsp page中声明了<%@ page isthreadsafe="false" %>)
call jspinit method(一般的jsp page都没有重写这个方法,重写需要在声明语句段中)。
call _jspservice method(类似与一般httpservlet的doget和dopost方法,但是可以同时用来处理post和getq请求)。
call jspdestroy method(server在卸载servet的时候,例如当servlet很久没有使用的情况)。
jsp page中有哪些隐含对象(implicity object)?各自的类型和作用是什么?
request --
reponse --
session --
application --
out --
page --
pagecontext --
exception -- 只有在当前jsp page为error page的时候才有效。
config --
<jsp:include page="/foo/foo.jsp" %> 和 <@ include file="/foo/foo.jsp" %>的区别是什么?
<jsp:include ... -- request time.
<@ include ... -- page translation time.
servlets/jsp container(engine)有几种运行方式?
standalone
tomcat standalone mode
in-process
tomcat running inside apache web server.
out-of-process
apache + mod_jk + tomcat
servlet,servlet开发人员,servlet api, servlet container的关系是什么?
servlet,servlet开发人员 --->servlet api --> servlet container
the parts of an http message
message part description
the initial line: specifies the purpose of the request or response message
例子:get /reports/sales/index.html http/1.0
the header section:specifies the meta-information, such as size, type, and encoding,
about the content of the message
a blank line:
an optional message body: the main content of the request or response message
下面是一个response的例子:
http/1.0 200 ok
date: tue, 01 dec 2001 23:59:59 gmt
content-type: text/html
content-length: 52
<html>
<body>
<h1>hello, john!</h1>
</body>
</html>
http规范中定义了哪些方法?各自有什么用途?
get
head
post
从 http 1.1规范开始,增加了以下的方法:
put
options
trace
delete
connect
servetrequest中为什么要定义:getcontenttype(),getcontentlength()方法。
根据http协议规范,request 和 response一样也有这些必不可少的内容!
所以需要首先了解 http message的概念和其内容的格式,这些东西对于request和reponse是一样的。
对于get方式发送的请求,其内容类型为:null
对于post方式发送的请求,其内容类型为:application/x-www-form-urlencoded
post方式发送请求的内容类似于:username=xuejava.
requestdispatcher.forward()和httpservletresponse.sendredirect()的区别是什么?
requestdispatcher.forward()是在服务器端运行;httpservletresponse.sendredirect()是通过向客户浏览器发送命令来完成。
所以requestdispatcher.forward()对于浏览器来说是“透明的”;而httpservletresponse.sendredirect()则不是。
另外,还要注意requestdispatcher.forward()在调用的时候response不能已经commit了(response.iscommitted())。
servletcontext.getrequestdispatcher(string url)和servletrequest.getrequestdispatcher(string url)的区别是什么?为什么?
servletcontext.getrequestdispatcher(string url)中的url只能使用绝对路径;而servletrequest.getrequestdispatcher(string url)中的url可以使用相对路径。
因为servletrequest具有相对路径的概念;而servletcontext对象无次概念。
如何把请求转移到另外一个web app中的某个地址?
servletcontext.getrequestdispatcher(string url)和servletrequest.getrequestdispatcher(string url)只能把请求转移到同一个web app中的地址。
如果需要把请求转移到另外一个web app中的某个地址,可以按下面的做法:
1. 获得另外一个web app的servletconext对象(currentservletcontext.getcontext(uripath)).
2. 调用servletcontext.getrequestdispatcher(string url)方法。