站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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 ……

但是这些都不是一定的,不同的服务器会有不同的策略。


恩,多谢.我自己的想法也是这样,呵呵!


↑返回目录
前一篇: 求助关于在servlet中怎样获取 在下拉表单中 用户究竟是选择的哪个选项阿?
后一篇: web modual打包成war和ear,有何不同?哪种方式比较好?