java求助帖

在网上学着做了个小练习,练习使用的是JQ+Mysql+redies+tomcat,
做的功能,简单来说就是有一个“省份”下拉框,通过调用mysql调用出来,放到option上显示,存到redis中缓存。
正确的应该是这个样子:
在这里插入图片描述
而我的:
在这里插入图片描述

报错如下:

访问index.html:
在这里插入图片描述
在这里插入图片描述
访问provinceServlet:
在这里插入图片描述
IDEA内报错:

04-Apr-2021 21:30:25.318 严重 [http-nio-80-exec-8] org.apache.catalina.core.StandardWrapperValve.invoke 在路径为[]的上下文中,servlet[cn.han.web.servlet.ProvinceServlet]的Servlet.service()引发异常
	java.lang.NullPointerException: Cannot invoke "com.alibaba.druid.stat.JdbcDataSourceStat.getRuningSqlList()" because the return value of "com.alibaba.druid.pool.DruidDataSource.getDataSourceStat()" is null
		at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1105)
		at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:941)
		at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:921)
		at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:911)
		at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:98)
		at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
		at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
		at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:390)
		at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:470)
		at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:480)
		at cn.han.dao.impl.ProvinceDaoImpl.findAll(ProvinceDaoImpl.java:18)
		at cn.han.service.impl.ProvinceServiceImpl.findAll(ProvinceServiceImpl.java:17)
		at cn.han.web.servlet.ProvinceServlet.doPost(ProvinceServlet.java:21)
		at cn.han.web.servlet.ProvinceServlet.doGet(ProvinceServlet.java:32)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
		at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
		at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
		at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
		at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
		at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
		at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
		at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
		at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
		at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
		at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)
		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
		at java.base/java.lang.Thread.run(Thread.java:832)

练习代码:
在这里插入图片描述

package cn.han.dao.impl;

import cn.han.dao.ProvinceDao;
import cn.han.domain.Province;
import cn.han.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class ProvinceDaoImpl implements ProvinceDao {

    //声明成员变量 jdbctemplement
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    @Override
    public List<Province> findAll() {
        String sql = "select * from province";
        List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
        return list;
    }
}
package cn.han.dao;

import cn.han.domain.Province;

import java.util.List;

public interface ProvinceDao {

    public List<Province> findAll();
}
package cn.han.domain;

public class Province {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "Province{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package cn.han.jedis.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class JedisPoolUtils {
    private static JedisPool jedisPool;

    static{
        //读取配置文件
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));

    }

    /**
     * 获取连接方法
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

package cn.han.service.impl;

import cn.han.dao.ProvinceDao;
import cn.han.dao.impl.ProvinceDaoImpl;
import cn.han.domain.Province;
import cn.han.service.ProvinceService;

import java.util.List;

public class ProvinceServiceImpl implements ProvinceService {

    //声明dao
    private ProvinceDao dao = new ProvinceDaoImpl();

    @Override
    public List<Province> findAll() {
        return dao.findAll();
    }

}

package cn.han.service;

import cn.han.domain.Province;

import java.util.List;

public interface ProvinceService {

    public List<Province> findAll();
}

package cn.han.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

//JDBC工具类,使用Durid连接池
public class JDBCUtils {
    private static DataSource ds;

    static {

        try {
            Properties pro = new Properties();
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    //获取连接池对象
    public static DataSource getDataSource() {
        return ds;
    }
    //获取连接Connection对象
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

package cn.han.web.servlet;

import cn.han.domain.Province;
import cn.han.service.ProvinceService;
import cn.han.service.impl.ProvinceServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用service查询
        ProvinceService service = new ProvinceServiceImpl();
        List<Province> list = service.findAll();
        //2.序列化list为json
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(list);
        System.out.println(json);
        //响应结果
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(json);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

tomcat:
在这里插入图片描述
在这里插入图片描述

druid.properties:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/exercise01
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000

数据库:
在这里插入图片描述
在这里插入图片描述

jedis.properties:

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        $(function () {
            //发送ajax请求,加载所有省份数据
            $.get("/provinceServlet",{},function (data) {
                //1.获取select
                var province = $("#province");
                //2.遍历json数组
                $(data).each(function (){
                    //3.创建<option>
                    var option = "<option name='" + this.id + "'>" + this.name + "</option>";
                    //4.调用select的append追加option
                    province.append(option);
                });
            });
        });
    </script>
</head>
<body>
<select id="province">
    <option>--请选择省份--</option>
</select>
</body>
</html>

已检查过的:
数据库检查过,账号密码接口库名都没有问题,javabean和数据库字段也对应;
使用测试module,$get发送ajax请求无问题;
使用测试module,"/provinceServlet"虚拟目录指向正确;
使用测试module,jquery-min文件可以正常使用;
redis-server已开启

其他我就不知道应该检查什么了,求大佬相助

posted @ 2021-04-04 22:15  丰北丰  阅读(416)  评论(1)    收藏  举报