1.MVC的含義
M - model(模型)
1.實體模型:每個對象的實體,即一個java類,它具有屬性、設置和獲取屬性的方法
例:Student.java(學生類),Teacher.java(教師類),Food.java (食物類)...
2.業務模型:執行web項目的基本業務
例:Dao(數據訪問層) ,Service(業務邏輯層)...
V - view (視圖)
1.HTML 靜態視圖
2.JSP 動態視圖
C - control (控制層)
Servlet獲取不同的業務請求,去執行不同的業務邏輯,控制不同的響應反饋
例.登錄功能 - 調用登錄服務模型 - 調用登錄數據訪問模型 - 通過數據庫拿到的數據反饋給視圖
2.MVC具體執行順序
上圖中首先瀏覽器發送請求,Servlet通過Xml建立實例收到請求,通過分析決定這次業務是什麼,連接到指定的業務Service,Service再通過Dao來訪問數據庫內的數據,JdbcUtils只是連接數據庫的一個工具類;取回數據後原路返回至Servlet,Servlet將數據解析成jsp可識別的狀態,然後轉發至各個jsp頁面,瀏覽器通過這些數據更改視圖。
3.具體例子
假如我們現在需要一個登錄功能,用戶在頁面輸入用戶名和密碼,後臺通過後臺連接數據庫驗證賬號密碼,隨後反饋給頁面。
(1)login.html(沒有使用jsp,因爲html已經足夠做完這個小例子)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>登錄</title>
</head>
<body>
<form action="UserSevlet" method="post">
<div>
<ul>
<li><input name="uname" type="text"/></li>
<li><input name="upassword" type="password"/></li>
<li>
<input name="" type="submit"/>
<input name="" type="reset"/>
</li>
</ul>
</div>
</form>
</body>
</html>
(2)後臺結構
(3)具體後臺代碼
3.1 JdbcUtil(jdbc的連接類,需要項目導入mysql驅動jar)
package com.hc.JDBCdemo.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JdbcUtil {
//數據庫驅動類
public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
//數據庫的連接地址
public static final String URL = "jdbc:mysql://localhost:3306/javawebjdbcdemo?serverTimezone=UTC";
//賬號
public static final String UID = "root";
//密碼
public static final String PWD = "123";
//獲取Connection實例
public static Connection getCon() {
Connection con = null;
try {
Class.forName(DRIVER);//ClassNotFoundException
con = DriverManager.getConnection(URL, UID, PWD);//SQLException
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//關閉Connection對象
public static void closeCon(Connection con, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (con != null) {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 User 實體類(跟數據庫的屬性對接)
package com.hc.JDBCdemo.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 4649979572893086618L;
private int uid;
private String uname;
private String upassword;
private String sex;
private String hobbys;
private String message;
public User(int uid, String uname, String upassword, String sex, String hobbys, String message) {
this.uid = uid;
this.uname = uname;
this.upassword = upassword;
this.sex = sex;
this.hobbys = hobbys;
this.message = message;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobbys() {
return hobbys;
}
public void setHobbys(String hobbys) {
this.hobbys = hobbys;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3.3 業務邏輯層
UserService (接口)
package com.hc.JDBCdemo.service;
import com.hc.JDBCdemo.entity.User;
public interface UserService {
//用戶登錄服務,通過賬號密碼登錄
public User getUserByCon(String uid, String pass);
}
UserServiceImpl (實現接口的類)
package com.hc.JDBCdemo.service.serviceImpl;
import com.hc.JDBCdemo.dao.UserDao;
import com.hc.JDBCdemo.entity.User;
import com.hc.JDBCdemo.service.UserService;
public class UserServiceImpl implements UserService {
//內聚強,但是耦合度高。
//實例化用戶Dao
UserDao dao = new UserDao();
@Override
public User getUserByCon(String uname, String upassword) {
return dao.getUser(uname,upassword);
}
}
3.4 dao 數據訪問層
package com.hc.JDBCdemo.dao;
import java.sql.SQLException;
import com.hc.JDBCdemo.entity.User;
import com.hc.JDBCdemo.util.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao {
//聲明JDBC_API
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
//通過賬號密碼獲得用戶
public User getUser(String uname, String upassword){
User user = null;
String sql = "select * from user where uname = ? and upassword = ?";
con = JdbcUtil.getCon();
try {
ps = con.prepareStatement(sql);
ps.setString(1, uname);
ps.setString(2, upassword);
rs = ps.executeQuery();
if(rs.next()){
user = new User(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
rs.getString(6)
);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
JdbcUtil.closeCon(con, ps, rs);
}
return user;
}
}
3.5 UserSevlet(Servlet控制層)
package com.hc.JDBCdemo.controller;
import com.hc.JDBCdemo.entity.User;
import com.hc.JDBCdemo.service.UserService;
import com.hc.JDBCdemo.service.serviceImpl.UserServiceImpl;
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.io.PrintWriter;
@WebServlet(name = "UserSevlet")
public class UserSevlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取用戶接口的服務
UserService service = new UserServiceImpl();
//設置請求端的字符編碼集
request.setCharacterEncoding("utf-8");
//獲取請求的參數
String uname = request.getParameter("uname");
String upassword = request.getParameter("upassword");
//調用服務,傳入參數,判斷登錄是否成功
User user = service.getUserByCon(uname, upassword);
if(user != null){
//轉發到index.html
request.getRequestDispatcher("index.html").forward(request, response);
}else{
//輸出登錄失敗信息
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.print("<h2>賬號:</h2>"+uname);
pw.print("<h2>密碼:</h2>"+upassword);
pw.print("<h2>是非法賬號,請重新嘗試</h2>");
pw.print("<h2><a href='login.html'>傳送門</a></h2>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
3.6 web.xml中註冊Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UserSevlet</servlet-name>
<servlet-class>com.hc.JDBCdemo.controller.UserSevlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserSevlet</servlet-name>
<url-pattern>/UserSevlet</url-pattern>
</servlet-mapping>
</web-app>
(4)使用tomcat啓動web項目
啓動跳出login.html
查看一下數據庫的數據(數據自己隨便寫幾個)
輸入小明和123
登錄成功
失敗會這樣
如果對您有幫助,請點個贊支持一下,謝謝~