案例需求: 使用Java程序操作数据库,并把结果显示在jsp页面上。
(这里只做查询操作,增删改操作类似如此)
使用工具: maven,idea,tomcat,MySQL数据库。
使用技术: javabean+servlet+jsp。
准备阶段:
第一步: 使用配置好maven工具的idea创建一个web项目。
第二步: 创建好项目后,补充相应的目录,使得项目的结构是一个标准的maven项目结构。
第三步: 在pom.xml文件导入此项目所需的jar包
完成以上的准备工作后就可以开始进入项目工程了。
第一步: 创建此项目所需要的包目录。
1. 在main包的java目录下写项目所需的java执行代码。
vo: 在这个目录下写本次项目所要使用的对象(如:user)
tools: 在这个目录下执行java代码与数据库的交互。
dao: 这个目录的功能与vo相同。
model: 服务层,用于调用dao层的业务。
controller: 最重要的枢纽,连接jsp页面并且也调用model层。
2. 在webapp目录下写jsp代码。
3. 在test包的java目录下写项目的测试代码。
第二步: 编写java代码
1. 开始写代码,首先完成vo层的对象代码。
package com.lu.vo;
public class User {
private int id;
private String username;
private String sex;
private String birthday;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
2. 创建好user类后开始写访问数据库的tools层代码。
(在这里采用模板设计模式进行编写)
package com.lu.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DbManager {
private Connection conn = null;
private Statement state = null;
private ResultSet rs = null;
private String username = "root";
private String password = "root";
private String driver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/mybatis";
public Connection getConnection(){
try {
Class.forName(driver);
System.out.println("loading driver success.......");
conn = DriverManager.getConnection(url,username,password);
System.out.println("connection tools success.....");
return conn;
}catch (Exception ex){
ex.printStackTrace();
}
return conn;
}
// insert update delete
public int nonQueryMethod(String strSql){
int flag = 0;
try {
conn = this.getConnection();
state = conn.createStatement();
flag = state.executeUpdate(strSql);
return flag;
}catch (Exception ex){
ex.printStackTrace();
}
return flag;
}
public ResultSet queryMethod(String strSql){
try {
conn = this.getConnection();
state = conn.createStatement();
rs = state.executeQuery(strSql);
return rs;
}catch (Exception ex){
ex.printStackTrace();
}
return rs;
}
public void closeDb(){
try {
if(rs != null) rs.close();
if(state!= null) state.close();
if(conn != null) conn.close();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
3. 编写dao层代码,调用tools层来执行具体的访问数据库操作。
package com.lu.dao;
import com.lu.tools.DbManager;
import com.lu.vo.User;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class QueryUserDao {
public List<User> queryUser() {
//由于User可能不止一个,所以用一个list进行接收
List<User> list = new ArrayList<>();
DbManager dbManager = new DbManager();
try {
String sql = "select * from user";
ResultSet rs = dbManager.queryMethod(sql);
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setBirthday(rs.getString("birthday"));
user.setSex(rs.getString("sex"));
user.setAddress(rs.getString("address"));
if (user != null) {
list.add(user);
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
dbManager.closeDb();
}
return list;
}
}
4. 编写model层代码,调用dao层
(这里为了便于扩展。采用接口+实现类的面向对象编程模式)
package com.lu.model;
import com.lu.vo.User;
import java.util.List;
public interface UserService {
public List<User> queryUser();
}
package com.lu.model;
import com.lu.dao.QueryUserDao;
import com.lu.vo.User;
import java.util.List;
public class UserServiceImpl implements UserService{
private QueryUserDao queryUserDao = new QueryUserDao();
@Override
public List<User> queryUser() {
return queryUserDao.queryUser();
}
}
5. 在这里由于业务逻辑比较简单,所以这一步可以直接编写controller层的核心代码,但是为了保证代码的可靠性,在此处应该需要进行test测试,验证前面的代码是否可执行到这一步。
执行上述测试代码,结果如下:
通过测试,我们得到了预期的结果,所以可以放心的执行本该执行的这一步。
6. 编写controller层代码。
package com.lu.controller;
import com.lu.model.UserService;
import com.lu.model.UserServiceImpl;
import com.lu.vo.User;
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("/queryUser")
public class QueryServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置字符集
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//执行业务逻辑
UserService queryUserService = new UserServiceImpl();
List<User> list = queryUserService.queryUser();
//转向jsp页面
request.setAttribute("userListKey",list);
request.getRequestDispatcher("jsp/query.jsp").forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
以上,java部分的代码就以完毕,开始编写jsp代码。
第三步: 编写jsp代码
注意:此处的文件名必须与上述转向页面的名字一样,并且包路径也需在转向时显示指出,否则最后结果会出现404的错误。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: VULCAN
Date: 2019/8/15
Time: 14:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>查询列表</title>
</head>
<body>
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th><input type="checkbox"></th>
<th>编号</th>
<th>姓名</th>
<th>生日</th>
<th>性别</th>
<th>地址</th>
</tr>
<c:forEach items="${userListKey}" var="user" varStatus="s">
<tr>
<td><input type="checkbox"></td>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.birthday}</td>
<td>${user.sex}</td>
<td>${user.address}</td>
<td><a class="btn btn-default btn-sm" >修改</a>
<a class="btn btn-default btn-sm" >删除</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
这里还需注意一点:在jsp文件的配置里需要显示的指出isELIgnored="false (因为我们需要用jstl和el表达式来获取我们在controller层所传出的内容,而jsp文件默认是ture),否则最后结果会出现500的错误。
最后一步: 配置tomcat
配置好之后,点击类似甲壳虫的debug按钮,会出现如下界面:
然后在搜索框上输入在controller层的类上的注解所配置的目录,得到如下结果:
到此,一个简单的web项目就运行成功了。