我遇到的这个问题不是入门贴,因为问过许多老师,网上也没有搜索到解决办法
|
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;
|

