how2j.cn

相关下载
文件名 文件大小
mysql-connector-java-5.0.8-bin.jar 528k
j2ee.rar 682k
使用站长秘制下载工具

工具版本兼容问题
CRUD是常见的页面功能,即我们常说的增删改查
C - Creation 增加
R - Retrieve 查询
U - Update 修改
D - DELETE 删除

本章节将介绍如何与JDBC结合,通过servlet查询数据库,根据查询结果,得到一个html页面,显示数据库中的内容。

本例借助JDBC章节的Hero类和HeroDAO类进行数据库查询

步骤 1 : 先运行,看到效果,再学习   
步骤 2 : 模仿和排错   
步骤 3 : 效果   
步骤 4 : 准备实体类Hero   
步骤 5 : 准备DAO 类 HeroDAO   
步骤 6 : 创建表Hero的SQL   
步骤 7 : 为web应用导入mysql-jdbc的jar包   
步骤 8 : 编写 HeroListServlet   
步骤 9 : 配置web.xml   
步骤 10 : 重启tomcat,访问http://127.0.0.1/listHero   

步骤 1 :

先运行,看到效果,再学习

老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
步骤 2 :

模仿和排错

在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
步骤 3 :

效果

这样就把表Hero里的数据都查出来了
效果
步骤 4 :

准备实体类Hero

Hero类有id,name,hp,damage等属性。

并且为每一个属性提供public的getter和setter。
package bean; public class Hero { public int id; public String name; public float hp; public int damage; 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; } public float getHp() { return hp; } public void setHp(float hp) { this.hp = hp; } public int getDamage() { return damage; } public void setDamage(int damage) { this.damage = damage; } }
步骤 5 :

准备DAO 类 HeroDAO

准备一个HeroDAO,提供增加,删除,修改,查询等常规数据库操作方法
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import bean.Hero; public class HeroDAO { public HeroDAO() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public Connection getConnection() throws SQLException { return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin"); } public int getTotal() { int total = 0; try (Connection c = getConnection(); Statement s = c.createStatement();) { String sql = "select count(*) from hero"; ResultSet rs = s.executeQuery(sql); while (rs.next()) { total = rs.getInt(1); } System.out.println("total:" + total); } catch (SQLException e) { e.printStackTrace(); } return total; } public void add(Hero hero) { String sql = "insert into hero values(null,?,?,?)"; try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) { ps.setString(1, hero.name); ps.setFloat(2, hero.hp); ps.setInt(3, hero.damage); ps.execute(); ResultSet rs = ps.getGeneratedKeys(); if (rs.next()) { int id = rs.getInt(1); hero.id = id; } } catch (SQLException e) { e.printStackTrace(); } } public void update(Hero hero) { String sql = "update hero set name= ?, hp = ? , damage = ? where id = ?"; try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) { ps.setString(1, hero.name); ps.setFloat(2, hero.hp); ps.setInt(3, hero.damage); ps.setInt(4, hero.id); ps.execute(); } catch (SQLException e) { e.printStackTrace(); } } public void delete(int id) { try (Connection c = getConnection(); Statement s = c.createStatement();) { String sql = "delete from hero where id = " + id; s.execute(sql); } catch (SQLException e) { e.printStackTrace(); } } public Hero get(int id) { Hero hero = null; try (Connection c = getConnection(); Statement s = c.createStatement();) { String sql = "select * from hero where id = " + id; ResultSet rs = s.executeQuery(sql); if (rs.next()) { hero = new Hero(); String name = rs.getString(2); float hp = rs.getFloat("hp"); int damage = rs.getInt(4); hero.name = name; hero.hp = hp; hero.damage = damage; hero.id = id; } } catch (SQLException e) { e.printStackTrace(); } return hero; } public List<Hero> list() { return list(0, Short.MAX_VALUE); } public List<Hero> list(int start, int count) { List<Hero> heros = new ArrayList<Hero>(); String sql = "select * from hero order by id desc limit ?,? "; try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) { ps.setInt(1, start); ps.setInt(2, count); ResultSet rs = ps.executeQuery(); while (rs.next()) { Hero hero = new Hero(); int id = rs.getInt(1); String name = rs.getString(2); float hp = rs.getFloat("hp"); int damage = rs.getInt(4); hero.id = id; hero.name = name; hero.hp = hp; hero.damage = damage; heros.add(hero); } } catch (SQLException e) { e.printStackTrace(); } return heros; } }
步骤 6 :

创建表Hero的SQL

用于创建表Hero的SQL语句
DROP TABLE IF EXISTS `hero`; CREATE TABLE `hero` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `hp` float DEFAULT NULL, `damage` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `hero`;

CREATE TABLE `hero` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `hp` float DEFAULT NULL,
  `damage` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
步骤 7 :

为web应用导入mysql-jdbc的jar包

为web应用导入mysql-jdbc的jar包与为项目导入mysql-jdbc的jar包不同,其作用的web应用在tomcat中运行起来后,能够找到jar包中的类。
所以需要把 mysql 的jar包放在WEB-INF/lib 目录下。

注: mysql-connector-java-5.0.8-bin.jar 可以在右侧下载
注: 放在WEB-INF/lib 下指的是能够web应用中找到对应的class,如果要在eclipse中做调试,还是需要为项目添加该jar才可以。
为web应用导入mysql-jdbc的jar包
步骤 8 :

编写 HeroListServlet

做一个Hero的维护页面需要一些通用的操作,比如增加,删除,编辑,修改,查询等。

每个不同的操作,都需要一个对应的Servlet,除了做Hero之外,还会做到其他的一些表的相关操作,所以好的规范会对将来的维护更有好处。

一般会这样命名,以查询为例 HeroListServlet : [表][行为]Servlet 这样一种命名规则。

所以对于Hero而言就会如此命名:
增加 HeroAddServlet
删除 HeroDeleteServlet
编辑 HeroEditServlet
修改 HeroUpdateServlet
查询 HeroListServlet


在HeroListServlet中,会使用HeroDAO把数据查询出来,然后拼接成一个table用于显示其内容
package servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import bean.Hero; import dao.HeroDAO; public class HeroListServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); List<Hero> heros = new HeroDAO().list(); StringBuffer sb = new StringBuffer(); sb.append("<table align='center' border='1' cellspacing='0'>\r\n"); sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>\r\n"); String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>\r\n"; for (Hero hero : heros) { String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage()); sb.append(tr); } sb.append("</table>"); response.getWriter().write(sb.toString()); } }
步骤 9 :

配置web.xml

在web.xml中把路径 listHero映射到HeroListServlet上。
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>RegisterServlet</servlet-name> <servlet-class>RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RegisterServlet</servlet-name> <url-pattern>/register</url-pattern> </servlet-mapping> <servlet> <servlet-name>HeroListServlet</servlet-name> <servlet-class>servlet.HeroListServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HeroListServlet</servlet-name> <url-pattern>/listHero</url-pattern> </servlet-mapping> </web-app>
步骤 10 :

重启tomcat,访问http://127.0.0.1/listHero

重启tomcat,访问

http://127.0.0.1/listHero
重启tomcat,访问http://127.0.0.1/listHero


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-07-15 StringBuffer中存放html标签的这几行代码看不懂
Geetaaaaaa
关于 J2EE-Servlet-查询 的提问
StringBuffer sb = new StringBuffer(); sb.append("<table align='center' border='1' cellspacing='0'>\r\n"); sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>\r\n"); String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>\r\n"; for (Hero hero : heros) { String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage()); sb.append(tr); } sb.append("</table>");




1 个答案

Lon2ly_Nig6t 答案时间:2018-07-26
把这段代码看作一个html文件,String tr 是遍历出数据库的每一行,然后格式化输出




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-07-12 我用的是Oracle,仿写了一样的HeroDAO,其他的都OK,就是在web里面需要做些改动。。。
学生new
关于 J2EE-Servlet-查询 的提问



RT,在web.xml里要将这一段代码: <servlet> <servlet-name>HeroListServlet</servlet-name> <servlet-class>servlet.HeroListServlet</servlet-class> </servlet> 改成: <servlet> <servlet-name>HeroListServlet</servlet-name> <servlet-class>HeroListServlet</servlet-class> </servlet> 才能运行,不知道是不是站长给的代码不适合我修改情况。 有这方面的大神,麻烦给予详细的这方面讲解,在下不胜感激!
     //修改前的代码片段
        <servlet>
        <servlet-name>HeroListServlet</servlet-name>
        <servlet-class>servlet.HeroListServlet</servlet-class>
    </servlet>
 

     //修改后的代码片段
        <servlet>
        <servlet-name>HeroListServlet</servlet-name>
        <servlet-class>HeroListServlet</servlet-class>
    </servlet>
    

							


2 个答案

学生new 答案时间:2018-07-13
突然明白了,站长在这里加的Servlet是包的名字,我在编写代码的时候并没有定义包....... 不好意思惹了笑话......
package servlet;
 
import java.io.IOException;
import java.util.List;

学生new 答案时间:2018-07-12
补充一下,其实是不明白站长给的代码里,为什么要在HeroListServlet前面加上servlet,不加不是没问题吗? 加了反而有点不明白是怎么回事了。。。




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-07-05 笔记
2018-07-04 只有表头 没有数据的问题
2018-06-27 用eclipse导入项目每次访问都是404,但是同样目录下的项目配置在tomcat里通过浏览器访问却成功了
2018-06-26 为啥解压下载的项目无法作为web项目运行?
2018-04-30 访问的地址为http://127.0.0.1:8080/j2ee/listHero才能访问
2018-04-23 无效的列索引
2018-04-13 运行你现成给的 报错
2018-04-05 代码贴上去好使 但是看不懂代码怎么破
2018-04-03 eclipse启动tomcat成功 但无法访问http://127.0.0.1/listHero
2018-04-02 还是那个try()括号里面有参数的问题
2018-03-14 characterEncoding = UTF-8为什么=后面不能有空格?
2018-03-07 连接数据库异常
2018-02-23 页面访问OK,访问数据库报错
2018-02-22 当前页面教程,发现个问题,使用的都不是默认包,所以在XML配置中应该是
2018-02-19 HeroListServlet查询不到oracle库数据
2018-02-11 教程中 ResultSet 出现异常
2018-01-10 地址问题
2018-01-06 在查询这一步是怎么取到数据库中的值呢,因为没有看到相关的语句。。。
2017-12-04 为什么访问http://localhost:8080/listHero是错误404,http://localhost:8080/j2ee/listHero才能显示出列表
2017-11-26 Short.MAX_VALUE
2017-11-16 可以运行却报错
2017-11-05 只显示表头问题
2017-11-02 问题如图
2017-10-29 “\r\n”这个是规范吗?用格式化输出呢n%
2017-10-24 错别字
2017-10-13 關於response.setContentType("text/html; charset=UTF-8")
2017-09-28 您好,我看到您的HeroDao里面的每个方法都用到了重新连接数据库
2017-09-28 您的 j2ee.rar 项目里面LoginServlet.java里面有个东西写错了
2017-09-18 怎么没数据 只有表头, 是直接下载项目运行的
2017-09-14 步骤4 HeroDAO的add方法好像少了个参数
2017-09-11 Eclipse启动Tomcat提示错误
2017-09-10 站长,步骤四有个不理解
2017-08-29 只有表头没有内容
2017-07-24 实体类的属性为啥要设置为public啊
2017-07-11 为什么在运行右上角下载的J2EE时只有表头,没有具体英雄数据呢?
2017-07-03 步骤7 的最后依据代码
2017-06-23 不知道DAO类里什么错误了!
2017-06-16 增删改查!
2017-06-16 不用设置html页面吗?
2017-06-16 try 圆弧里 不能放参数,提示错误
2017-05-21 忘了传参了
2017-04-24 报错500 怎么解决
2017-04-23 几个问题
2017-04-10 互联网公司里实际工作就是这么写的吗?
2016-05-26 为什么需要设置id?




提问之前请登陆
关于 J2EE-Servlet-查询 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 620943819
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图