JavaWeb之MVC模式

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

登錄成功

失敗會這樣

如果對您有幫助,請點個贊支持一下,謝謝~

 

 

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