当前页面: 开发资料首页 → JSP 专题 → 如果线程安全,JSP被翻译成Servlet后,为什么会产生2个对象?第一个对象有何用处?
如果线程安全,JSP被翻译成Servlet后,为什么会产生2个对象?第一个对象有何用处?
摘要: 如果线程安全,JSP被翻译成Servlet后,为什么会产生2个对象?第一个对象有何用处?
<%! public int count = 0; %>
<% this.count++; %>
<%=this.count%>
以上是JSP页面代码.
第一次请求后,页面显示1
第二次请求后,页面显示1
第三次请求后,页面显示2
第四次请求后,页面显示3
以后依次递增.
本人想知道产生的第一个Servlet对象有何用?谢谢!
我用的是tomcat5.5.12
第一个servlet对象指哪个?count?
一个类成员变量
确认你刷了几下,应该是1、2、3,一次递增的
楼主搞错了对象的概念了,int是java的基本类型,而不是对象Integer才是对象。你可以把这个jsp页面,看成是一个对象,每个jsp页面,都会被容量翻译成一个servlet文件,其中你在jsp上写的代码,都会被翻成servlet中的代码,变量count是这个对象的一个属性变量,初始值为0,你每刷新一次,就执行servlet文件中的某个方法,方法中,有this.count++;这句,你那三句jsp命令翻译成servlet代码为:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class _22_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
public int count = 0;
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('/r');
out.write('/n');
this.count++;
out.write('/r');
out.write('/n');
out.print(this.count);
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
你可以在上面代码中,找到你的那三句代码分别在什么地方的。
楼上不懂别乱说.
Servlet对象,我是说这个,大哥.
JSP页面不是先翻译成.java源文件,在解释成.class文件,然后生成一个Servlet对象.
我说为什么第一次请求和第二次请求不是同一个Servlet对象负责工作.以后的所有请求都是由为第二次请求工作的Servlet对象来负责的.
我用的是线程安全的,也就是异步机制
这些jsp在执行时是一个线程,tomcat为了提高响应速度,为这些页面建立了线程池,
你的第一、第二次访问分别访问了线程池中不同的线程。所以出现了两个 1
其实完全有可能出现更多的 1
也会出现更多的 2 和 3 ……
但是这些都不是一定的,不同的服务器会有不同的策略。
恩,多谢.我自己的想法也是这样,呵呵!