来到上海也一个月了,好歹也面试了几家了,可惜没有结果.有的呢是刚好问到我不知道的地方,有的呢是因为我没经验,有点郁闷,呵呵.
闲来无事,总结一下面试的心得吧.
好多公司的面试题目,也就是网上流传的所谓"葵花宝典",准备充分的话应该没有问题(当然,这些面试都是像我一样的新手),关键是与主管的所谓聊聊.
有些问题看似简单,可真正回答起来不一定能很完美.我就遇到过这样的问题:
1.客户请求的时候Servlet怎么工作,一共加载几次?
2.什么时候用doGet()与doPost(),系统是如何判断的?这两种都在什么情况下使用?
3.在MVC中,C是如何通过M传递数据给V的?用一句话来概括一下工作方式.
4.详细谈一下forward与redirect.
看起来很简单吧,但当你试着想把它们详细的说的很明白时,估计会发现词不达意了吧.和很多人一样,往往是"知其然不知其所以然".
那天面试时,有位主管的一句话给我的触动很大,"貌似简单的东西往往不简单",这都是些基础,但能考验出一个人的真正水平吧.
我还没有找到工作,所以我还在努力的总结这些貌似简单的东西.
有什么心得大家一起分享吧.
评论
likeblood 2007-06-14
这些题貌似也不不简单啊
就像是jdk,有多少人会去看HashMap是如何实现的呢?但是都会用
抛出异常的爱 2007-06-14
robbln 写道
这些题网上都有啊.
你面试之前怎么不看一下呢,要有备而战噻!
ddandyy 写道
ls真行............
投完票之后真痛快。。。。
ddandyy 2007-06-14
ls真行............
robbln 2007-06-14
这些题网上都有啊.
你面试之前怎么不看一下呢,要有备而战噻!
myyate 2007-06-06
楼主真是的,把我骗进来了。这些题目其实看那个jsp书就学过的。
jjunix 2007-05-31
servlet-2_4-fr-spec.pdf
p24-p25

For a servlet not hosted in a distributed environment(thedefault),the servlet container must use only one instance per servlet declaration.However,for a servlet implementing the SingleThreadModel interface,the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance.

注意:
The SingleThreadModel Interface is deprecated in this version of the specification.
justin8335 2007-05-27
学Servlet就是培养基础。
zexunlee 2007-05-26
ddandyy 写道
前面还行 第4个根本就没看过
-_-

另外看这题怎么这公司根本不用框架的说


第四题可是搞Java公司必考题目。《Head First Jsp/Servlet》看看,这本书将JSP和Servlet内部机制讲的再详细不过了。再想深入就看源代码吧,特别使JBoss和Tomcat的源代码。
Puras 2007-05-25
会不会写是一回事
知不知道原理是另外一回事
dennis_zane 2007-05-25
很难吗?相当基础的问题了
servlet的单线程模型完全是多此一举,已经不建议使用,可以不用考虑
我认为一个java程序员如果连servlet都不会写,那是怎么都说不过去的
dovecat 2007-05-24
基础的东西.MS LZ只知道用...
ASDF1982 2007-05-24
同意LS,非常基础的问题,不明白这个,你怎么做web
fins 2007-05-24
貌似简单 实际也不难
ken1984 2007-05-24
抛出异常的爱 写道
你写的代码更麻烦。。。。爬到N层父类之上去看一个过滤器,。。。

恶梦。

PS:客户请求的时候Servlet怎么工作。
1这题问的是有几种生命周期。。。你写的还少。。。
2你写的不是他想要的答案。。。
3.。。。
4.。。。
楼上你有很多servlet经验,但是这种面试题是有标准答案的。。。


1:生命周期由Servlet接口定义,里面的方法就是生命周期,可见
http://java.sun.com/webservices/docs/1.6/api/javax/servlet/Servlet.html

2:

Server创建一个Servlet的实例

  Server调用Servlet的init()方法

  一个客户端的请求到达Server

  Server创建一个请求对象 //由HTTP信息创建ServletRequest对象

  Server创建一个响应对象

  Server激活Servlet的service()方法,传递请求和响应对象作为参数

  service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息 //此分根据GET,POST的不同传给不同的doXXX。

  service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法

  对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。





ps:下面源代码是我复制过来的
.......
/**
*
* Receives standard HTTP requests from the public
* <code>service</code> method and dispatches
* them to the <code>do</code><i>XXX</i> methods defined in
* this class. This method is an HTTP-specific version of the
* {@link javax.servlet.Servlet#service} method. There's no
* need to override this method.
*
*
*
* @param req the {@link HttpServletRequest} object that
* contains the request the client made of
* the servlet
*
*
* @param resp the {@link HttpServletResponse} object that
* contains the response the servlet returns
* to the client
*
*
* @exception IOException if an input or output error occurs
* while the servlet is handling the
* TRACE request
*
* @exception ServletException if the request for the
* TRACE cannot be handled
*
* @see javax.servlet.Servlet#service
*
*/

protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();

if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}

} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);

} else if (method.equals(METHOD_POST)) {
doPost(req, resp);

} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);

} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);

} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);

} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);

} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//

String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);

resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
.........
ken1984 2007-05-24
max.h.chen 写道
也不一定只加载一次,要看servlet的运行模式,如果使用了线程安全模式则一个线程绑一个实例,那就不只一次了,一般是对象池管理了,不过通常都不会这样用。



我上面说的是对同一个实例来说。如果你要创建多个新实例必然会有多次加载,但这样肯定会增加系统开销,因为是一对一的关系,比起一对多效果如何可想而知。
max.h.chen 2007-05-23
也不一定只加载一次,要看servlet的运行模式,如果使用了线程安全模式则一个线程绑一个实例,那就不只一次了,一般是对象池管理了,不过通常都不会这样用。
抛出异常的爱 2007-05-23
你写的代码更麻烦。。。。爬到N层父类之上去看一个过滤器,。。。

恶梦。

PS:客户请求的时候Servlet怎么工作。
1这题问的是有几种生命周期。。。你写的还少。。。
2你写的不是他想要的答案。。。
3.。。。
4.。。。
楼上你有很多servlet经验,但是这种面试题是有标准答案的。。。
ken1984 2007-05-23
抛出异常的爱 写道
不去那家公司。。。
因为要手动写servlet很麻烦,很累的说。。
如果要改前人的程序。。。。杀了我吧再也不想看几K行的servlet了


手写不难吧,我都是自己手写,继承HttpServlet实现几个方法就行了。
ken1984 2007-05-23
1.客户请求的时候Servlet怎么工作,一共加载几次?
init->service->doXXX->destroy

加载一次,即容器执行init方法时。生命周期与加载次数不一样,只要执行了init而没有destroy或者容器还在运行,那这个SERVLET实例就依然存在容器内。

2.什么时候用doGet()与doPost(),系统是如何判断的?这两种都在什么情况下使用?

分析HTTP头信息,如果没有实现services则递交给相应的doXXX方法。

3.在MVC中,C是如何通过M传递数据给V的?用一句话来概括一下工作方式.

执行流程client->control->model->control->client

4.详细谈一下forward与redirect.
简单点说吧,forward是同一请求。
shaucle 2007-05-23
MS都是最基础的问题啊(最基本的web概念)
tomzhu0526
搜索本博客
最近加入圈子
存档
最新评论
评论排行榜