我遇到的这个问题不是入门贴,因为问过许多老师,网上也没有搜索到解决办法

llm6101 2007-11-16
帖子链接http://www.javaeye.com/topic/141291
标题: 您的帖子被JavaEye会员集体投票评为入门贴
正文:
您的帖子:Struts1.1中用dbcp实现数据源后调用返回游标类型的存储过程出错 被JavaEye用户民主投票评为入门贴,减积分10分。发贴前请仔细阅读 JavaEye版规和提问的智慧,如有异议,可以到JavaEye站务圈子申诉。

Struts1.1中用dbcp实现数据源后调用返回游标类型的存储过程出错 请教大家
都郁闷好几天了
没有找到相关的帖子
例子很简单 就是验证登陆 如果用户名和密码正确则返回此用户的所有信息游标

登陆页面


代码
<html:form action="/allAction.do?method=login" method="post" focus="userName">
<table border="0">
<tr>
<td>用户名:</td>
<td><html:text property="userName" /></td>
</tr>
<tr>
<td>密码:</td>
<td><html:password property="psw" /></td>
</tr>
<tr>
<td colspan="2" align="center"><html:submit>登陆</html:submit></td>
</tr>
</table>
</html:form>


struts-config.xml配置文件


代码
<struts-config>
<data-sources>
<data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<set-property property="url"
value="jdbc:oracle:thin:@localhost:1521:llm" />
<set-property property="username" value="scott" />
<set-property property="password" value="l3294832" />
<set-property property="maxActive" value="20" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="true" />
</data-source>
</data-sources>
<form-beans >
<form-bean name="loginForm" type="form.LoginForm" />

</form-beans>
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
parameter="method"
path="/allAction"
scope="request"
type="action.AllActionAction">
<forward name="error" path="/login.jsp" />
<forward name="success" path="/welcome.jsp" />

</action>

</action-mappings>

<message-resources parameter="ApplicationResources" />
</struts-config>


AllAction控制器类


代码
package action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import beans.UserBO;
import beans.UserVO;
import form.LoginForm;

public class AllActionAction extends DispatchAction {
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
DataSource ds=this.getDataSource(request,"A");
UserVO user=new UserVO();
System.out.println("AllActionAction");
try {
BeanUtils.populate(user,BeanUtils.describe(loginForm));
} catch (Exception e) {
e.printStackTrace();
}
user=new UserBO(ds).checkLogin(user);
if(user!=null){
try {
BeanUtils.populate(loginForm,BeanUtils.describe(user));
} catch (Exception e) {
e.printStackTrace();
}
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}
}
}


业务Bean,与数据库连接,调用过程,返回游标


代码
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
public class UserBO {
DataSource ds;
public UserBO(DataSource ds){
this.ds=ds;
}
public UserVO checkLogin(UserVO user){ //存储过程不好用
UserVO uservo=null;
String sql="{call checkLogin(?,?,?)}";
Connection conn;
CallableStatement cs;
ResultSet rs;
try {
conn=ds.getConnection();
cs=conn.prepareCall(sql);
cs.setString(1,user.getUserName());
cs.setString(2,user.getPsw());
cs.registerOutParameter(3,OracleTypes.CURSOR);
cs.execute();
rs=((OracleCallableStatement)cs).getCursor(3);
while(rs.next()){
uservo=new UserVO();
uservo.setId(rs.getInt(1));
uservo.setUserName(rs.getString(2));
uservo.setPsw(rs.getString(3));
uservo.setAge(rs.getInt(4));
uservo.setSex(rs.getInt(5));
uservo.setBirthday(rs.getDate(6));
uservo.setEmail(rs.getString(7));
}
} catch (SQLException e) {
e.printStackTrace();
}
return uservo;
}


错误信息为

java.lang.ClassCastException: org.apache.commons.dbcp.DelegatingCallableStatement
at beans.UserBO.checkLogin(UserBO.java:23)
at action.AllActionAction.login(AllActionAction.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
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:868)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
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(Thread.java:595)


以下是数据库的代码

/*用户表*/
create table users(
id int primary key,
username varchar(15) not null,
psw varchar(15) default '123',
age int default 20,
sex int default 1,
birthday date default '1-1月-1980',
email varchar(20) default 'abc@163.com');
/*用户ID主键的序列*/
create sequence seq_username
start with 1001
increment by 1
/*检测用户名和密码是否存在,若存在返回此用户*/
create or replace procedure checklogin(
in_username users.username%type,
in_psw users.psw%type,
out_cursor out sys_refcursor)
is
begin
open out_cursor for select id,username,psw,age,sex,birthday,email
from users where username=in_username and psw=in_psw;
end;


连接Oracle用的jar包和commons-pool-1.3.jar、commons-dbcp-1.2.1.jar已经加到构建路径里了 并且试验了不用存储过程用普通的select语句就好用 不知道为什么 恳请各位指点!