前言
這是一篇最初版本的mvc設計模式的demo。弄明白這其中的邏輯,對后面掌握ssh,ssm等框架大有裨益。
另外計算機系的同學們也要為畢設做准備了,希望可以幫你們邁出自己做畢設的第一步(微笑臉.jgp)。
特別提示:不要被文章篇幅嚇到(再次微笑臉.jpg)。文中貼出了部分過程圖片便於大家理解,並且代碼部分未折疊,拿來即用!
補充:由於部分同學在根據說明搭建demo的過程中會遇到一些問題,所以我把代碼在我的github上放了一份。大家可以先下載再看下面的搭建過程,也可以先自己動手搭建,遇到問題再對比異同,隨意咯~
github地址:https://github.com/QubingHuo/javabean-jsp-servlet-jdbc
使用方法:
1.新建一個名為MyServlet的Dynamic Web Project,不論你使用的是idea,eclipse,還是STS,都可以
2.將github中的代碼下載
3.分別用從github中下載的代碼里面的src目錄和webContent目錄,替換你新建的MyServlet項目中的src目錄和webContent目錄
4.修改helper.DbHelper中連接數據庫的用戶名和密碼
5.使用tomcat啟動項目,並通過 http://localhost:8080/MyServlet/list 訪問項目
下面進入詳細解說環節:
本篇采用javabean+jsp+servlet+jdbc,附源碼。
- M = JavaBean:用於傳遞數據,擁有與數據相關的邏輯處理
- V = JSP:從Model接收數據並生成HTML
- C = Servlet:接收HTTP請求並控制Model和View
環境:win7 64位,jdk1.8,tomcat7,mysql 5.5
工具:eclipse,Navicat premium
jar包:mysql-connector-java-5.1.13-bin.jar
一. 新建數據表
在mysql中新建一個名為my-db的數據庫,並在其中新建一個user數據表,包含三個字段:id,name,age,如圖
ps:在這里給各位同學安利一個叫做Navicat的數據庫操作軟件,功能十分強大。有了它,可以大幅減少在cmd中輸入creat table...之類的命令數量,推薦Navicat Premium。

注意:將id設為自動遞增,否則后面新增會出錯。id設為自增,新增時就只需關注user的其它屬性。
二. 新建web項目
1. eclipse新建一個名為MyServlet的Dynamic Web Project

修改class的默認輸出目錄為:WebContent/WEB-INF/classes

勾選自動生成web.xml

生成的項目在java EE透視圖中的結構如下,
2. 將連接mysql的驅動jar包(mysql-connector-java-5.1.7-bin.jar)copy到WEB-INF下的lib目錄下

3. 新建4個包,common存放實體類(User),dao存放數據庫操作類(UserDao),servlet存放控制類(addServlet,updateServlet,deleteServlet,listServlet),helper存放開發幫助類(這里是數據庫操作幫助類,封裝了數據庫連接部分代碼,避免大量重復代碼)

4. 新建類(最愉快的搬磚環節 -.-),java類放在對應包中,jsp頁面放在WebContent目錄下,替換web.xml中內容,結構如圖

User.java
package common; public class User { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
UserDao.java
package 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 common.User; import helper.DbHelper; public class UserDao { /** * 查詢所有用戶信息 * @return */ public List<User> getAllUser(){ List<User> list = new ArrayList<User>(); Connection conn = DbHelper.getConnection();//連接數據庫 String sql = "select * from user"; try { PreparedStatement pst = conn.prepareStatement(sql); ResultSet rst = pst.executeQuery(); while (rst.next()) { User user = new User(); user.setId(rst.getInt("id")); user.setName(rst.getString("name")); user.setAge(rst.getInt("age")); list.add(user); } rst.close(); pst.close(); } catch (SQLException e) { e.printStackTrace(); } return list; } /** * 添加用戶 * @param user * @return */ public boolean addUser(User user){ String sql = "INSERT INTO `user`(`name`,`age`) VALUES (?,?)"; Connection conn = DbHelper.getConnection(); try { PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, user.getName()); pst.setInt(2, user.getAge()); int count = pst.executeUpdate(); pst.close(); return count>0?true:false; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 修改用戶信息 * @param user * @return */ public boolean updateUser(User user){ String sql = "UPDATE `user` SET `name`=?,`age`=? WHERE `id` = ?"; Connection conn = DbHelper.getConnection(); try { PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, user.getName()); pst.setInt(2, user.getAge()); pst.setInt(3, user.getId()); int count = pst.executeUpdate(); pst.close(); return count>0?true:false; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 刪除用戶 * @param id * @return */ public boolean deleteUser(int id){ String sql = "delete from user where id = ?"; Connection conn = DbHelper.getConnection(); try { PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, id); int count = pst.executeUpdate(); pst.close(); return count>0?true:false; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 根據ID進行查詢用戶 * @param id * @return */ public User selectUserById(int id){ Connection conn = DbHelper.getConnection(); String sql = "select * from user where id = "+id; User user = null; try { PreparedStatement pst = conn.prepareStatement(sql); ResultSet rst = pst.executeQuery(); while (rst.next()) { user = new User(); user.setId(rst.getInt("id")); user.setName(rst.getString("name")); user.setAge(rst.getInt("age")); } rst.close(); pst.close(); } catch (SQLException e) { e.printStackTrace(); } return user; } }
DbHelper.java
package helper; import java.sql.Connection; import java.sql.DriverManager; public class DbHelper { private static String url = "jdbc:mysql://localhost:3306/my-db"; //數據庫地址 private static String userName = "root"; //數據庫用戶名 private static String passWord = "123456"; //數據庫密碼 private static Connection conn = null; private DbHelper(){ } public static Connection getConnection(){ if(null == conn){ try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, userName, passWord); } catch (Exception e) { e.printStackTrace(); } } return conn; } public static void main(String[] args) { //測試數據庫是否連通 System.out.println(getConnection()); } }
AddServlet.java
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import common.User; import dao.UserDao; public class AddServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); Integer age = Integer.valueOf(req.getParameter("age")); User user = new User();//創建user對象 user.setName(name); user.setAge(age); UserDao dao = new UserDao(); dao.addUser(user);//添加到數據庫中 req.getRequestDispatcher("list").forward(req, resp); } }
DeleteServlet.java
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.UserDao; public class DeleteServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String idStr = req.getParameter("id"); // 刪除數據的ID,根據ID刪除 if (idStr != null && !idStr.equals("")) { int id = Integer.valueOf(idStr); UserDao dao = new UserDao(); dao.deleteUser(id); } req.getRequestDispatcher("list").forward(req, resp); } }
ListServlet.java
package servlet; import java.io.IOException; import java.util.List; 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 common.User; import dao.UserDao; //@WebServlet("/list") //上面注釋的是WebServlet3.0的使用方式,通過這樣的注解,不需要配置web.xml也可運行程序 public class ListServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserDao dao = new UserDao(); List<User> list = dao.getAllUser(); req.setAttribute("userInfoList", list); req.getRequestDispatcher("list.jsp").forward(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
UpdateServlet.java
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import common.User; import dao.UserDao; public class UpdateServlet extends HttpServlet { /** * 查詢到選中ID的值所對應的數據 */ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String idStr = req.getParameter("id"); if (idStr != null && !idStr.equals("")) { int id = Integer.valueOf(idStr); UserDao dao = new UserDao(); User user = dao.selectUserById(id); req.setAttribute("user", user); } req.getRequestDispatcher("update.jsp").forward(req, resp); } /** * 根據此ID對數據的值進行修改 */ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String idStr = req.getParameter("id"); if (idStr != null && !idStr.equals("")) { int id = Integer.valueOf(idStr); String name = req.getParameter("name"); Integer age = Integer.valueOf(req.getParameter("age")); User user = new User(); user.setId(id); user.setName(name); user.setAge(age); UserDao dao = new UserDao(); dao.updateUser(user); } req.getRequestDispatcher("list").forward(req, resp); } }
jsp頁面放在WebContent目錄下
add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>新增用戶</title> <script type="text/javascript"> function check(form) { with (form) { if (name.value == "") { alert("用戶名不能為空"); return false; } } } </script> </head> <body> <form action="add" method="post" onsubmit="check(this)"> <table align="center" width="450"> <tr> <td align="center" colspan="2"> <h2>添加用戶信息</h2> <hr> </td> </tr> <tr> <td align="right">用戶名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td align="right">年齡:</td> <td><input type="text" name="age"></td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" value="添 加"> </td> </tr> </table> </form> </body> </html>
list.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@page import="java.util.List"%> <%@page import="common.User"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>所有用戶</title> <style type="text/css"> td { font-size: 12px; } h2 { margin: 0px } </style> <script type="text/javascript"> </script> </head> <body> <h2 align="center"> <a href="add.jsp">添加新用戶</a> </h2> <br> <table align="center" width="450" border="1" height="180" bordercolor="white" bgcolor="black" cellpadding="1" cellspacing="1"> <tr bgcolor="white"> <td align="center" colspan="7"> <h2>所有用戶信息</h2> </td> </tr> <tr align="center" bgcolor="#e1ffc1"> <td><b>ID</b></td> <td><b>姓名</b></td> <td><b>年齡</b></td> <td colspan="2"><b>操作</b></td> </tr> <% // 獲取用戶信息集合 List<User> list = (List<User>) request.getAttribute("userInfoList"); // 判斷是否有數據 if (list == null || list.size() < 1) { %> <tr bgcolor="white"><td colspan="5" ><h4 align="center">沒有數據</h4></td></tr> <% } else { // 遍歷用戶集合中的數據 for (User user : list) { %> <tr align="center" bgcolor="white"> <td><%=user.getId()%></td> <td><%=user.getName()%></td> <td><%=user.getAge()%></td> <td > <a href="update?id=<%=user.getId()%>">修改</a> </td> <td> <a href="delete?id=<%=user.getId()%>">刪除</a> </td> </tr> <% } } %> </table> </body> </html>
update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="common.User"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>修改用戶信息頁面</title> </head> <body> <div> <table> <thead><tr><td><h1>修改用戶信息</h1></td></tr></thead> <tbody> <form action="update" method="post"> <tr> <td>ID:</td> <td><input type="text" name="id" value="${user.id}" readonly="readonly" /></td> </tr> <tr> <td>name:</td> <td><input type="text" name="name" value="${user.name}" /></td> </tr> <tr> <td>age:</td> <td><input type="text" name="age" value="${user.age}" /></td> </tr> <tr> <td><input class="btn" type="submit" value="提交" /> <input class="btn" type="reset" value="重置" /></td> </tr> </tbody> </form> </table> </div> </body> </html>
替換web.xml中內容
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>MyServlet</display-name> <servlet> <!-- servlet的注冊名稱,自定義。每個servlet的name不一樣 --> <servlet-name>listServ</servlet-name> <!-- servlet的完整類名: 包名+類名;如果ctrl+鼠標左擊能 點開,說明成功--> <servlet-class>servlet.ListServlet</servlet-class> </servlet> <!-- servlet的映射配置 --> <servlet-mapping> <!-- servlet的注冊名稱,一定要和上面的內部名稱保持一致!! --> <servlet-name>listServ</servlet-name> <!-- servlet的對外訪問路徑(訪問servlet的名稱) --> <url-pattern>/list</url-pattern> </servlet-mapping> <!-- ps:同一個servlet可以配置多個servlet-mapping,舉個栗子 --> <servlet-mapping> <!-- 還是上面的那個servlet --> <servlet-name>listServ</servlet-name> <!-- 除了/ListServlet,又配置了一個list2,通過這兩個路徑都可訪問listServ這個servlet --> <url-pattern>/list2</url-pattern> </servlet-mapping> <servlet> <servlet-name>addServ</servlet-name> <servlet-class>servlet.AddServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>addServ</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping> <servlet> <servlet-name>updateServ</servlet-name> <servlet-class>servlet.UpdateServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>updateServ</servlet-name> <url-pattern>/update</url-pattern> </servlet-mapping> <servlet> <servlet-name>delServ</servlet-name> <servlet-class>servlet.DeleteServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>delServ</servlet-name> <url-pattern>/delete</url-pattern> </servlet-mapping> </web-app>
注意:代碼copy完成之后,需要將DbHelper.java中的連接數據庫的用戶名密碼修改為連接自己的數據庫的用戶名和密碼
三. 可能遇到的問題
有些同學可能會遇到這樣的報錯:


這是由於沒有將以上報錯的類所在的包添加到項目中,解決辦法:
右鍵項目->build path->configure bulid path->add library->server runtime->next->finish
四. 愉快的運行
發布到tomcat並運行,訪問 http://localhost:8080/MyServlet/list




