用这种反射的方式遇到一个问题
我仿照老师用反射的方法去找控制器,控制器里边掉service层,service层掉dao, dao层的代码用junit测试可以通过,用了这个反射好像就报错了, 感觉像是与这个反射有关,service和dao层的代码junit测试都是通过的
核心控制器代码
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代码
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工具代码
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;
}
}
}报错信息
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积分~
来为老师/同学的回答评分吧
0 星