用这种反射的方式遇到一个问题

用这种反射的方式遇到一个问题

我仿照老师用反射的方法去找控制器,控制器里边掉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


正在回答

登陆购买课程后可参与讨论,去登陆

7回答

同学你好!

1.反射不会造成这个问题呢,老师这里也做了测试,没有抛出异常呢

http://img1.sycdn.imooc.com/climg/5de216b20926131e09710597.jpg

2.建议同学在进行Test时,在JDBCUtils中打断点看一下是否使用到这个类了

3.如果Test时,进入了JDBCUtils,但是运行项目时,依然报错,建议你重新编译一下项目,测试一下

http://img1.sycdn.imooc.com/climg/5de21753097ff4d703510233.jpg

4.如果不可以,可能是同学你在打包时,并没有将相应的jar添加到war包中,所以运行报错,建议同学将之前项目运行时的war包删除,重新打一个测试一下

File-》Project structure,以下位置删除原来的war

http://img1.sycdn.imooc.com/climg/5de217fc0988082112300983.jpg

以下步骤重新生成war包

http://img1.sycdn.imooc.com/climg/5de2181309e30f8e03710406.jpg

5.然后重新添加最新的war包

http://img1.sycdn.imooc.com/climg/5de21838094bc5ef15020807.jpg

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~


  • 慕才子 提问者 #1
    非常感谢。重新生成war包解决了。想起当年一些往事,不由心生感慨。 当年学习struts2, 搞了半天跑不起来, 然后也没有人可以问,后来搞好了, 又遇到一些乱七八糟的事情,很打击人, 然后就放弃java转前端了。
    2019-11-30 16:09:38
  • 好帮手慕柯南 回复 提问者 慕才子 #2
    同学,开发就是这样呢,会遇到各种各样的问题,所以开发人员会经常自黑说自己在”写bug“,因此在遇到问题的时候不要着急要冷静的分析是什么原因。遇到问题解决问题的过程其实进步是很大的,除了技术的提升,还有自我解决问题的能力的提升。加油,祝学习愉快~
    2019-11-30 17:09:21
提问者 慕才子 2019-11-30 13:59:44

应该不是您说的这个问题,因为我直接用junit测试dao层是可以通过的,就是用了老师讲的核心控制器的方案出现了问题,核心控制器里用了反射, 加载mysql驱动时又用了反射, 我感觉是这个问题,不知道怎么解决

下图是我用junit测试的结果, 这应该可以证明驱动那块是没有写错的,如果错了这个也出不来才对


http://img1.sycdn.imooc.com//climg/5de2051b09f2d77613421000.jpg

好帮手慕柯南 2019-11-30 13:53:15

同学你好!

很抱歉回复同学迟了,老师这里是按照时间顺序回答的,另外不建议同学在问答中多次回答,这样会导致时间更新,老师看到你问答的时间就会延后。

报错的信息是:找不到com.mysql.cj.jdbc.Driver类

http://img1.sycdn.imooc.com//climg/5de2027609cb495e06170121.jpg

com.mysql.cj.jdbc.Driver是mysql8的驱动,请问同学你的pom文件中引入的mysql的jar是什么版本呢?

1.如果你的电脑安装的mysql是8.0,请加载8.0的jar,

http://img1.sycdn.imooc.com//climg/5de2031d0957f3cb05610161.jpg

Class.forName("com.mysql.cj.jdbc.Driver");这么写就是正确的

2.如果数据库是5.0的版本,建议加载5.0的jar

http://img1.sycdn.imooc.com//climg/5de2036f093291f905100155.jpg

Class.forName("com.mysql.jdbc.Driver");去掉驱动中的cj

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

提问者 慕才子 2019-11-30 12:45:48

今天放假了吗, 这个问题搞了一个上午了,没搞定,求解下, 感谢感谢

提问者 慕才子 2019-11-30 11:24:12

Class.forName("com.mysql.cj.jdbc.Driver");这个代码抛出

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

提问者 慕才子 2019-11-30 11:10:53

通过断点发现是  调用JDBCUtils.getConnection()方法报错,但是没搞懂为啥会报错

提问者 慕才子 2019-11-30 11:09:00

我没有用MyBatis, 但是用了老师这里讲到的这个核心控制器

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码