package com.swift.jztk.servlet;

import java.io.IOException;

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 com.swift.jztk.biz.IQuestionBiz;
import com.swift.jztk.biz.QuestionBizImpl; @WebServlet("/getQuestions")
public class GetQuestions extends HttpServlet {
private static final long serialVersionUID = 1L;
IQuestionBiz biz=new QuestionBizImpl();//生成业务层对象
public GetQuestions() {
super();
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
String testType=request.getParameter("testType");
String json=biz.getQuestions(testType);//业务层对象调用方法,方法中使用dao数据访问层访问数据库,代码问题执行失败
response.getWriter().println(json);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }
biz.getQuestions(testType);//biz业务层调用的方法.getQuestions(testType)如下:
package com.swift.jztk.biz;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random; import com.google.gson.Gson;
import com.swift.jztk.bean.Result;
import com.swift.jztk.bean.Root;
import com.swift.jztk.dao.IQuestionDao;
import com.swift.jztk.dao.QuestionDaoImpl; public class QuestionBizImpl implements IQuestionBiz {
IQuestionDao dao = new QuestionDaoImpl(); @SuppressWarnings("null")
@Override
public String getQuestions(String testType) {
List<Result> list = null;
if (testType.equals("rand")) {
HashSet<Integer> set = new HashSet<Integer>();//生成一个哈希集合,用于存放随机数
Random ran = new Random();
for (;;) {//无限循环
int n = ran.nextInt(200) + 1;// 1~200间的随机整数,不加1是0到199
set.add(n);// 随机数放到 整数类型的哈希集合中,保证没有相同的整数
if (set.size() == 100) {
break;
}
}
Iterator<Integer> it = set.iterator();//迭代器,用于获取集合中各条内容
while (it.hasNext()) {
int id = it.next();
Result result = dao.getResultById(id);
list.add(result);//加入对象列表集合
Collections.sort(list, new Comparator<Result>() {// 比较器 匿名内部类 @Override
public int compare(Result o1, Result o2) {
int id1 = o1.getId();
int id2 = o2.getId();
return id1 - id2;// 按照id大小从小到大排序
}
});
} } else if (testType.equals("order")) {
list = dao.getAll();//MVC架构,数据访问层用接口进行连接,得到数据库中全部数据
}
String json=listToJson(list);
return json;
}
//把得到的List<Result>对象列表集合转换成字符串
public String listToJson(List<Result> list) {
Root root = new Root();
root.setResult(list);
root.setStatusCode("000000");
root.setDesc("请求成功");//json实体类对象赋值
Gson gson = new Gson();
String json = gson.toJson(root);//json实体类对象用Gson解析成字符串
return json;
} }

Result result = dao.getResultById(id);//biz层调用数据访问层的方法.getResultById();

list = dao.getAll();//biz层调用数据访问层的方法.getAll();

数据访问层代码如下:

package com.swift.jztk.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.swift.jztk.bean.Result;
import com.swift.jztk.util.DBUtil; public class QuestionDaoImpl implements IQuestionDao { //@Override
public List<Result> getAll() {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
List<Result> list = null;
try {
ps = conn.prepareStatement("select * from sw_question");
rs = ps.executeQuery();
list = new ArrayList<Result>();
while (rs.next()) {
int id = rs.getInt("id");
String question = rs.getString("question");
String answer = rs.getString("answer");
String item1 = rs.getString("item1");
String item2 = rs.getString("item2");
String item3 = rs.getString("item3");
String item4 = rs.getString("item4");
String expalins = rs.getString("expalins");
String url = rs.getString("url");
Result result = new Result(id, question, answer, item1, item2, item3, item4, expalins, url);
list.add(result);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, ps, rs);
}
return list;
} @Override
public Result getResultById(int id) {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
Result result = null;
try {
ps = conn.prepareStatement("select * from sw_question where id=?");
ps.setInt(1, id);
rs = ps.executeQuery();
if(rs.next()) {
String question = rs.getString("question");
String answer = rs.getString("answer");
String item1 = rs.getString("item1");
String item2 = rs.getString("item2");
String item3 = rs.getString("item3");
String item4 = rs.getString("item4");
String expalins = rs.getString("expalins");
String url = rs.getString("url");
result = new Result(id, question, answer, item1, item2, item3, item4, expalins, url);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, ps, rs);
}
return result;
} }
提示com.mysql.jdbc.Driver找不到 NullClassException异常
导入的这些包都是正常的,没有红线,可是浏览器出现500错误:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.swift.jztk.bean.Result;
import com.swift.jztk.util.DBUtil;
Connection conn = DBUtil.getConn();
都已导入,没有问题
检查数据库工具类:
package com.swift.jztk.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class DBUtil {
// 连接MySQL数据库工具
public static Connection getConn() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
} // 关闭数据库连接、sql连接、结果集
public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
这些包都导入了
com.mysql.jdbc.Driver的驱动却找不到,原因有两个:
一个是数据库突然崩溃,MySQL数据库软件发生问题,重新安装解决
一个是光导包不出红线是没用的,还需要把mysql-connector-java-5.1.7-bin.jar这个jar包没有复制到lib

servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因的更多相关文章

  1. 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据

    package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...

  2. 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...

  3. idea运行Tomcat的servlet程序时报500错误解决方法

    今天在测试使用Tomcat运行servlet小程序时,在传递参数时,出现了如上错误. 开始我以为是配置出了问题,就把项目删除了又建立了一遍,结果亦然. 经过仔细排查,发现问题,先说明问题原因:idea ...

  4. 在包a中新建一个类A,在类A中有一个int add(int m)方法,用来求1+2+…+m 的和。在包b中新建一个类B,在类B中有一个int cheng(int n)方法,用来求n! 的结果。在包c中新建一个主类C,调用A、B中的方法输出1+2+…+30的和, 以及5!的计算结果。

    package a; public class A { public void add(int m) { int sum=0; for (int i = 1; i <=m; i++) { sum ...

  5. view是视图层+action是控制层+service是业务层+dao是数据访问层。

  6. 项目架构开发:数据访问层之Repository

    接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...

  7. 数据访问层 (DAO)

    数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...

  8. 数据访问层之Repository

    数据访问层之Repository   接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...

  9. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

随机推荐

  1. AT2045 Salvage Robots

    传送门 这个题只要想到移动机器人和移动出口是等价的就好做了 考虑设\(f[i][j][k][t]\)为最远向左移动\(i\),向右移动\(j\),向上移动\(k\),向下移动\(t\),这个矩形内最多 ...

  2. 008-数据类型(Dictionary)

    数据类型(Dictionary) 一.定义 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括 ...

  3. weblogic.xml

    <?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="ht ...

  4. Jenkins +Maven+Tomcat+SVN +Apache项目持续集成构建

    详解Jenkins +Maven+Tomcat+SVN +Apache项目持续集成 一:前言 1. Jenkins jenkins版本大全http://mirrors.jenkins-ci.org/ ...

  5. jquery click嵌套 事件重复注册 多次执行的问题

    jquery click嵌套 事件重复注册 多次执行的问题 上面只是参考,我自己的解决方法是先使用unbind("click")解除事件然后再绑定新事件: $("#tes ...

  6. 全排列函数(next_permutation)

    顾名思义,这个函数就是用来求数组的全排列的,至于怎么用,看下面的介绍: 这是一个c++函数,包含在头文件algorithm里面,这个函数可以从当前的数组的大小按照字典序逐个递增的顺序排列 看下面的模板 ...

  7. Abbreviation ---- hackerrank

    ---恢复内容开始--- https://www.hackerrank.com/contests/world-codesprint-6/challenges/abbr 给定两个串str和sub. 对于 ...

  8. spring mvc 注解扫描问题 ,扫描不到controller, use-default-filters="false"

    今天搭了个spring mvc项目,怎么也扫描不到controller,最后发现问题在use-default-filters="false"上面,乱copy出的问题 (默认值是tr ...

  9. CentOS 6.2安装nagios

    nagios分为监控机和被监控机两类机器      监控主机:gserver150(192.168.111.150) 被监控主机:gserver151(192.168.111.151)   一.  监 ...

  10. C 碎片五 数组

    构造类型数据是有基本类型数据按照一定规则组成的.数组,结构体,共用体都属于构造类型的数据.数组是有序数据的集合,C语言数组中的每一个元素都属于同一个数据类型,用数组名和下标来唯一确定数组中的元素. 一 ...