用这种反射的方式遇到一个问题
我仿照老师用反射的方法去找控制器,控制器里边掉service层,service层掉dao, dao层的代码用junit测试可以通过,用了这个反射好像就报错了, 感觉像是与这个反射有关,service和dao层的代码junit测试都是通过的
核心控制器代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package com.xiong.global; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CoreController extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String className = "" ; String methodName = "" ; try { String path = req.getServletPath(); methodName = path.substring(path.lastIndexOf( "/" ) + 1 , path.lastIndexOf( '.' )); // /bbb/message/Cccc path = path.substring( 0 , path.lastIndexOf( '/' )); String controllerName = path.substring(path.lastIndexOf( '/' ) + 1 ) + "Controller" ; // /bbb/message String modulePath = path.substring( 0 , path.lastIndexOf( '/' )); String module = "" ; if (!modulePath.equals( "" )) { // 有模块名的情况 module = modulePath.replace( '/' , '.' ); } className = "com.xiong.controller" + module + "." + controllerName; System.out.println( "className=" + className); System.out.println( "methodName=" + methodName); } catch (Exception e) { e.printStackTrace(); resp.getWriter().write( "解析异常" ); return ; } try { Class Controller = Class.forName(className); Controller.getMethod(methodName, HttpServletRequest. class , HttpServletResponse. class ).invoke(Controller.newInstance(), req, resp); } catch (ClassNotFoundException e) { e.printStackTrace(); resp.getWriter().write( "模块不存在" ); return ; } catch (NoSuchMethodException e) { e.printStackTrace(); resp.getWriter().write( "方法不存在" ); } catch (Exception e) { e.printStackTrace(); resp.getWriter().write( "未知异常" ); } } } |
IndexController代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package com.xiong.controller; import com.xiong.entity.Message; import com.xiong.service.MessageService; import com.xiong.service.MessageServiceImpl; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; public class IndexController { public void index(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String pageSizeStr = req.getParameter( "pageSize" ); String pageNumStr = req.getParameter( "pageNum" ); int pageSize = 0 ; int pageNum = 0 ; if (pageSizeStr == null ) { pageSizeStr = "10" ; } if (pageNumStr == null ) { pageNumStr = "1" ; } try { pageNum = Integer.parseInt(pageNumStr); } catch (Exception e) { e.printStackTrace(); resp.getWriter().write( "pageNum转换失败" ); return ; } try { pageSize = Integer.parseInt(pageSizeStr); } catch (Exception e) { e.printStackTrace(); resp.getWriter().write( "pageSize转换失败" ); return ; } if (pageSize <= 0 || pageNum < 1 ) { resp.getWriter().write( "参数不正确" ); System.out.println( "参数不正确" ); return ; } MessageService messageService = new MessageServiceImpl(); int total = messageService.getTotal(); int pages = ( int )Math.ceil(total/( double )pageSize); // 总页数 if (pageNum > pages) { pageNum = pages; } List<Message> list = messageService.getPageList(pageSize, pageNum); System.out.println( "dddd" ); req.setAttribute( "list" , list); req.setAttribute( "pages" , pages); req.setAttribute( "curPage" , pageNum); req.getRequestDispatcher( "/WEB-INF/message_list.jsp" ).forward(req, resp); } } |
JDBCUtils工具代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | package com.xiong.utils; import java.sql.*; public class JDBCUtils { private static final String jdbcUrl = "jdbc:mysql://localhost:3306/message_board" ; private static final String user= "root" ; private static final String password= "123456ybx" ; private JDBCUtils() { } static { try { Class.forName( "com.mysql.cj.jdbc.Driver" ); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(jdbcUrl,user, password); } public static void release(Statement stmt, Connection conn) { if (stmt!= null ) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null ; } if (conn!= null ) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null ; } } public static void release(ResultSet rs, Statement stmt, Connection conn) { if (rs!= null ) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null ; } if (stmt!= null ) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null ; } if (conn!= null ) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null ; } } } |
报错信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | ava.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java: 1365 ) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java: 1188 ) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java: 264 ) at com.xiong.utils.JDBCUtils.<clinit>(JDBCUtils.java: 16 ) at com.xiong.dao.MessageDaoImpl.getTotal(MessageDaoImpl.java: 130 ) at com.xiong.service.MessageServiceImpl.getTotal(MessageServiceImpl.java: 17 ) at com.xiong.controller.IndexController.index(IndexController.java: 51 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 ) at java.lang.reflect.Method.invoke(Method.java: 498 ) at com.xiong.global.CoreController.service(CoreController.java: 41 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 741 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 231 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java: 53 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at com.xiong.global.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java: 13 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 202 ) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 96 ) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java: 526 ) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 139 ) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 92 ) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java: 678 ) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 74 ) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 343 ) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java: 408 ) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java: 66 ) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java: 861 ) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java: 1579 ) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java: 49 ) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1149 ) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 624 ) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java: 61 ) at java.lang.Thread.run(Thread.java: 748 ) java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 ) at java.lang.reflect.Method.invoke(Method.java: 498 ) at com.xiong.global.CoreController.service(CoreController.java: 41 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 741 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 231 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java: 53 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at com.xiong.global.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java: 13 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 ) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 202 ) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 96 ) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java: 526 ) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 139 ) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 92 ) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java: 678 ) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 74 ) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 343 ) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java: 408 ) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java: 66 ) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java: 861 ) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java: 1579 ) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java: 49 ) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1149 ) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 624 ) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java: 61 ) at java.lang.Thread.run(Thread.java: 748 ) Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.xiong.utils.JDBCUtils at com.xiong.dao.MessageDaoImpl.getTotal(MessageDaoImpl.java: 141 ) at com.xiong.service.MessageServiceImpl.getTotal(MessageServiceImpl.java: 17 ) at com.xiong.controller.IndexController.index(IndexController.java: 51 ) ... 31 more |
正在回答
同学你好!
1.反射不会造成这个问题呢,老师这里也做了测试,没有抛出异常呢
2.建议同学在进行Test时,在JDBCUtils中打断点看一下是否使用到这个类了
3.如果Test时,进入了JDBCUtils,但是运行项目时,依然报错,建议你重新编译一下项目,测试一下
4.如果不可以,可能是同学你在打包时,并没有将相应的jar添加到war包中,所以运行报错,建议同学将之前项目运行时的war包删除,重新打一个测试一下
File-》Project structure,以下位置删除原来的war
以下步骤重新生成war包
5.然后重新添加最新的war包
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
同学你好!
很抱歉回复同学迟了,老师这里是按照时间顺序回答的,另外不建议同学在问答中多次回答,这样会导致时间更新,老师看到你问答的时间就会延后。
报错的信息是:找不到com.mysql.cj.jdbc.Driver类
com.mysql.cj.jdbc.Driver是mysql8的驱动,请问同学你的pom文件中引入的mysql的jar是什么版本呢?
1.如果你的电脑安装的mysql是8.0,请加载8.0的jar,
Class.forName("com.mysql.cj.jdbc.Driver");这么写就是正确的
2.如果数据库是5.0的版本,建议加载5.0的jar
Class.forName("com.mysql.jdbc.Driver");去掉驱动中的cj
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
- 参与学习 人
- 提交作业 357 份
- 解答问题 8016 个
本阶段将带你学习MySQL数据库,JDBC接口,MyBatis框架等,带你掌握的数据的存放和管理。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧