首页 > 开发 > JSP > 正文

问题集锦:Servlets/JSP开发技术问答

2020-02-05 13:39:06
字体:
来源:转载
供稿:网友

  为什么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)方法。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表