帮我看下这段JSP代码,我很纳闷 本帖最后由 jxsfreedom 于 2010-07-02 23:14:27 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般来说,Web容器会把每个JSP生成一个与之对应的Servlet,而且采用单例管理,也就是说,用户的每次请求都会访问同一个JSP对应的Servlet,你在<%!%>中声明的变量是作为与JSP对应的Servlet的一个成员变量,由于所有用户都是访问同一个Servlet,那它里面的成员变量当然是共享的,针对每个JSP页面生成的Servlet源文件楼主可以去Tomcat的work目录中找。楼主可以试一下,第一次访问以后重启一下Web容器,然后再进行第二次访问,你会发现这回是“D 0”了,因为重启后原来Web容器中加载的Servlet全部销毁,需要重新加载,会执行int number=0。 lz的jsp生成的Servlet代码类似于class ...{int number=0;//定义一个变量,记录访问人数。synchronized void countPeople(){ if(number==0){ try{ File f=new File("E:\\countPeople.txt"); FileInputStream in=new FileInputStream(f); DataInputStream dataIn=new DataInputStream(in); number=dataIn.readInt(); number++; in.close();dataIn.close(); System.out.println("A " + number); }catch(FileNotFoundException e){ number++; try{ File f=new File("E:\\countPeople.txt"); FileOutputStream out=new FileOutputStream(f); DataOutputStream dataOut=new DataOutputStream(out); dataOut.writeInt(number); out.close();dataOut.close(); System.out.println("B " + number); }catch(IOException ee){} }catch(IOException ee){} }else{ number++; try{ File f=new File("E:\\countPeople.txt"); FileOutputStream out=new FileOutputStream(f); DataOutputStream dataOut=new DataOutputStream(out); dataOut.writeInt(number); out.close();dataOut.close(); System.out.println("C " + number); }catch(FileNotFoundException e){} catch(IOException e){} } }public ... service(...){ System.out.println("D " + number); if(session.isNew()){ countPeople(); String str=String.valueOf(number); session.setAttribute("count",str); }}}而tomcat的执行过程是: 当以个请求过来后tomcat会首先去找请求的Servlet实例对象,如果找到了则直接执行service方法,如果没找到,才会重新创建一个.也就是说在不重启服务器的情况下Servlet只会创建一次,初始化一次,除非Servlet创建后又被销毁了. 如果要统计访问人数吧,最好还是每次都去文件中拿最新的数据再++,这样也就不会因为服务器重启,而导致数据丢失了 Donde Voy Java 群组1号: 820853732号: 551918143号: 892387484号: 564183645号: 1571811296号: 74671714请勿重复加群...... 你加不加synchronized是一样,因为tomcat本身就是多线程的,你要想让这个页面不用多线程,需要在页面加上<%@ page isThreadSafe="false"%> JTabbedPane如何实现嵌套? Map的查找用的是什么算法 关于Jtable中添加行 怎么看JAVA文档 正则表达式匹配 XML文件解析的问题--大家帮帮忙吧! 如何将String型的转为Date型的???急! Java中继承的一点疑问 在JTextPane中Paragraph的概念是什么? 一个DNS解析的问题 加密。。。。。。。。。很急,可加分 关于远程控制和远程监视,这样的程序该用到什么技术,请高手指点
class ...{
int number=0;//定义一个变量,记录访问人数。
synchronized void countPeople(){ if(number==0){ try{
File f=new File("E:\\countPeople.txt");
FileInputStream in=new FileInputStream(f);
DataInputStream dataIn=new DataInputStream(in);
number=dataIn.readInt();
number++;
in.close();dataIn.close();
System.out.println("A " + number);
}catch(FileNotFoundException e){
number++;
try{
File f=new File("E:\\countPeople.txt");
FileOutputStream out=new FileOutputStream(f);
DataOutputStream dataOut=new DataOutputStream(out);
dataOut.writeInt(number);
out.close();dataOut.close();
System.out.println("B " + number);
}catch(IOException ee){}
}catch(IOException ee){}
}else{ number++;
try{
File f=new File("E:\\countPeople.txt");
FileOutputStream out=new FileOutputStream(f);
DataOutputStream dataOut=new DataOutputStream(out);
dataOut.writeInt(number);
out.close();dataOut.close();
System.out.println("C " + number);
}catch(FileNotFoundException e){}
catch(IOException e){} } }
public ... service(...){
System.out.println("D " + number);
if(session.isNew()){
countPeople();
String str=String.valueOf(number);
session.setAttribute("count",str);
}}
}
而tomcat的执行过程是:
当以个请求过来后tomcat会首先去找请求的Servlet实例对象,如果找到了则直接执行service方法,如果没找到,才会重新创建一个.也就是说在不重启服务器的情况下Servlet只会创建一次,初始化一次,除非Servlet创建后又被销毁了.
如果要统计访问人数吧,最好还是每次都去文件中拿最新的数据再++,这样也就不会因为服务器重启,而导致数据丢失了
1号: 82085373
2号: 55191814
3号: 89238748
4号: 56418364
5号: 157181129
6号: 74671714请勿重复加群......
<%@ page isThreadSafe="false"%>