实在没办法了郁闷中。jsp调用javaBean出错,请高手看看哪出问题了
在csdn上找了个统计在线人数的javaBean,但是引用的地方就报错,搞了一个小时没搞定,高手看看是哪的问题?
/*
onLineUser.java
*/
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;
public class onLineUser implements HttpSessionBindingListener {
public onLineUser(){
}
private Vector users=new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i <users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
}
public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0;i <users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
}
public Vector getOnLineUser()
{
return users;
}
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
if(!existUser(e.getName())){
users.add(e.getName());
System.out.print(e.getName()+ "\t 登入到系统\t "+(new Date()));
System.out.println( " 在线用户数为: "+getCount());
}else
System.out.println(e.getName()+ "已经存在 ");
}
public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
System.out.print(userName+ "\t 退出系统\t "+(new Date()));
System.out.println( " 在线用户数为: "+getCount());
}
}
/*
调用页面onLineUser.jsp
*/
<%@page contentType= "text/html; charset=gb2312 " language= "java " errorPage= " "%>
<%@page import= "java.util.* "%>
<html>
<jsp:useBean id= "onlineuser " scope= "application " class= "onLineUser " type= "onLineUser "> </jsp:useBean>
<head>
<title> 122 </title>
</head>
<body>
<center>
<p> <h1> 333 </h1> </p>
</center>
<%session = request.getSession(false);%>
<%
String username=request.getParameter( "username ");
if (onlineuser.existUser(username)){
out.println( "用户 <font color=red> "+username+ " </font> 已经登陆! ");
}else{
session.setMaxInactiveInterval(50); //Sesion有效时长,以秒为单位
session.setAttribute(username,onlineuser);
out.println( "欢迎新用户: <font color=red> "+username+ " </font> 登陆到系统! ");
}
out.println( " <br> 当前在线用户人数: <font color=red> "+onlineuser.getCount()+ " </font> <br> ");
Vector vt=onlineuser.getOnLineUser();
Enumeration e = vt.elements();
out.println( "在线用户列表 ");
out.println( " <table border=1> ");
out.println( " <tr> <td> 用户名 </td> </tr> ");
while(e.hasMoreElements()){
out.println( " <tr> <td> ");
out.println((String)e.nextElement()+ " <br> ");
out.println( " </td> </tr> ");
}
out.println( " </table> ");
%>
<center>
<%
out.println( " <p> <a href= 'logout.jsp?username= "+username+ " '> 退出系统 </a> </p> ");
%>
</center>
</body>
</html>
/*
出错信息
*/
严重: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to compile class for JSP
An error occurred at line: 4 in the jsp file: /onLineUser1.jsp
Generated servlet error:
onLineUser cannot be resolved or is not a type
An error occurred at line: 4 in the jsp file: /onLineUser1.jsp
Generated servlet error:
onLineUser cannot be resolved or is not a type
An error occurred at line: 4 in the jsp file: /onLineUser1.jsp
Generated servlet error:
onLineUser cannot be resolved or is not a type
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:397)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:288)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:556)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:293)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
/*
运行环境
*/
tomcat5.5
jdk1.5.0_05
请高手帮忙看看
[解决办法]
这是一个HttpSessionBindingListener
目的是在session.setAttribute的时候自动记数
在session.removeAttribute的时候减数
通过一个Vector来保存
但是这个程序似乎问题多多啊
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
if(!existUser(e.getName())){
users.add(e.getName());
System.out.print(e.getName()+ "\t 登入到系统\t "+(new Date()));
System.out.println( " 在线用户数为: "+getCount());
}else
System.out.println(e.getName()+ "已经存在 ");
}
这里在session.setAttribute的时候想要记录用户名
但是users.add(e.getName()); 这里记录的e.getName()实际上却是attribute的名字
实际上这个程序做的是在每次往session里面设置attribute的时候看看这个attribute名字是否存在,如果不存在就记录这个attribute name。如果要做计数器应该记录的是对应用户名的那个attribute value
其实users不必用Vector,用Set就行了,最好设置为static
这个HttpSessionBindingListener在web.xml里面配置好就可以了
不需要在jsp页面多做什么
[解决办法]
高深,看一下飘过,楼下继续,学习..
[解决办法]
请楼主检查一下 tomcat5.5的jsp compiler与jdk1.5.0_05 是否兼容.
用jdk1.5.0_05写个简单的jsp放在tomcat5.5中看是否可以跑
[解决办法]
用jdk1.5.0_05写个简单的class放在tomcat5.5中看是否可以跑
[解决办法]
我试过了,写了个简单的class都能运行
HttpSessionBindingListener要在web.xml做配置?具体要怎么做?
请vdragon(紫龙)说清楚点,谢谢
[解决办法]
HttpSessionBindingListener不需要在web.xml中配置!把你的onLineUser.java加上包名!
[解决办法]
补充:users.add(e.getName()); 这句没有问题,他得到的就是用户名。因为在登录的时候需要把实现SessionBindingListener接口的一个对象作为属性的值存入session,而对应的属性名是用户名。即:
SessionBindingListener oSessionBindingListener = new SessionBindingListener();
session.setAttribute(sUID,oSessionBindingListener);
楼主没有把这部分代码贴出,我不知道你是否这么做了,如果没有那是没有效果的。这个代码在网上流传很广,在监控在线名单、单点登录方面效果还是不错的。
[解决办法]
<listener>
<listener-class> onLineUser </listener-class>
</listener>
这个程序根本没实现他声称的在线统计人数的功能
你要使用的话需要自己去修改很多地方
------解决方案--------------------
to pczhouji(咱也进城了):
我猜你可能搞错了HttpSessionBindingListener的用法了
这个Listener在web.xml里面声明以后
整个context运行期间所有对session.setAttribute和session.removeAttribute方法的调用都会由服务器去自动调用listener.valueBound和listener.valueUnbound方法
而参数HttpSessionBindingEvent的getName得到的是attribute name,getValue得到的是attribute value对象
使用Listener的好处是可以由服务器对session attribute进行监控,不需要在servlet/jsp中做其他特别的处理
[解决办法]
楼上,这个监听器不需要在web.xml里声明的,我估计你没有实际用过。这段代码没有问题,我现在一直用的跟这个大同小异。当然,你说的有一点是对的,存放在线用户名单的那个容器,Vector也好,Hashtable也好,必须是static的。
[解决办法]
楼上
我确实没有这样用过Listener。一般对Listener的使用我都是在web.xml里面声明
而且把listener放到session的attribute的做法确实以前没有见过
感觉比较怪异
我觉得不如修改这个listener
在valueBound和value unBound的时候
判断e.getName
假如是loginName(记录用户登陆时的用户名时,用的session attribute name)
则将e.getValue加入在线用户列表中或从在线用户列表中删除
这样其他的代码不需要在对这个listener进行操作
只需要在用户登陆的时候用session.setAttribute( "loginName ", userLoginName)就可以了
[解决办法]
所有的 bean 文件一定要放在包中,否则无法调用.
[解决办法]
to紫龙兄:呵呵,HttpSessionBindingListener是所有Listner中唯一不需要在web.xml中声明的,准确的说应该是声明了也不起作用吧。要触发它的valueBound()或者valueUnbound()方法,就必须把它的实例加入HttpSesion对象的属性或从HttpSesion对象的属性移除。的确是比较独特,我想这也是 "Binding "的体现吧。
[解决办法]
to pczhouji(咱也进城了)
确实没有遇到过这种情况
回去试试先
我的异常网推荐解决方案:org.apache.jasper.JasperException: Unable to compile class,http://www.myexception.cn/j2ee/2308.html