JavaWeb之綜合小項目

案例需求: 使用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>&nbsp;
                <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項目就運行成功了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章