java 框架mvc_JAVA框架-MVC模式

MVC

MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用于應用程序的分層開發。

Model(模型) - 模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯,在數據變化時更新控制器。

View(視圖) - 視圖代表模型包含的數據的可視化。

Controller(控制器) - 控制器作用于模型和視圖上。它控制數據流向模型對象,并在數據變化時更新視圖。它使視圖與模型分離開。

3ecc1a9740d044fed2d487e9a0b761e9.png

案例

下面我們來寫一個簡單的登錄的案例,來提現MVC的設計模式

首先,我們有一個數據庫,里面存放用戶信息如下:

a3e4db96dcb565e40a844e3507f9cc2e.png

OK,下一步我們建立一個簡單的登錄界面前端的頁面如下:

登錄界面

${requestScope.err}

用戶名:

密碼:

如果我們不使用MVC的設計的話,程序應該如下:

package Servelet;

import utils.JDBCutil;

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.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

@WebServlet(name = "LoginServlet", urlPatterns = "/LoginServlet")

public class LoginServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

String username = request.getParameter("username");

String password = request.getParameter("password");

System.out.println(username);

System.out.println(password);

System.out.println("測試");

try {

//1.數據庫的連接

String JDBCDRVIER="com.mysql.jdbc.Driver";

String URL="jdbc:mysql://localhost:3306/ProjectServlet";

String USER="root";

String PASSWORD="3692512";

Class.forName(JDBCDRVIER);

Connection c = DriverManager.getConnection(URL,USER,PASSWORD)

System.out.println("數據庫連接成功,正在查詢....");

//2.數據的查詢

String sql = "select * from user where username=? and password=?";

PreparedStatement p = c.prepareStatement(sql);

p.setObject(1,username);

p.setObject(2,password);

ResultSet rs = p.executeQuery();

//3.進行業務邏輯判斷

if(rs.next()) {

request.getSession().setAttribute("username",username);

request.getSession().setAttribute("password",password);

System.out.println("用戶查詢成功!跳轉主頁中.....");

//不能轉發,要用重定向,防止用戶多次回車訪問

//request.getRequestDispatcher("index.jsp");

response.sendRedirect("index.jsp");

}else{

System.out.println("用戶名或密碼不正確,跳轉登錄頁面中.....");

request.setAttribute("err","用戶名或密碼不正確");

request.getRequestDispatcher("login.jsp").forward(request,response);

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

下面我們使用MVC設計模式,來重寫上述案例。

01be85b93b537a6bc3507f97b701c499.png

Model

其實MVC中的M實際上就是根據數據庫封裝的Bean。這部分沒什么好說的,我們利用Bean對象來存儲我們的數據。

package Servelet.models;

//用于對應數據庫中的信息

public class UserBean {

String username;

String password;

String nickname;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getNickname() {

return nickname;

}

public void setNickname(String nickname) {

this.nickname = nickname;

}

@Override

public String toString() {

return "UserBean{" +

"username='" + username + '\'' +

", password='" + password + '\'' +

", nickname='" + nickname + '\'' +

'}';

}

}

Controller

這部分是Servelet程序,頁面訪問首先觸發controller,主要作用就是

package Servelet.controllers;

import Servelet.models.UserBean;

import Servelet.services.UserServices;

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;

@WebServlet(name = "UserControllerServlet" ,urlPatterns = "/UserLogin")

public class UserControllerServlet extends HttpServlet {

private UserServices services;

@Override

public void init() throws ServletException {

services = new UserServices();

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

String username = request.getParameter("username");

String password = request.getParameter("password");

System.out.println(username);

System.out.println(password);

try {

UserBean bean = services.checkLogin(username, password);

if(bean!=null){

System.out.println("用戶查詢成功!跳轉主頁中.....");

request.getSession().setAttribute("username",bean);

// request.getRequestDispatcher("index.jsp");

response.sendRedirect("index.jsp");

}else {

request.setAttribute("err","用戶名或密碼不正確");

request.getRequestDispatcher("login.jsp").forward(request,response);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

這個部分可以看到我們僅僅做了邏輯判斷,和數據庫交互的工作和業務邏輯我們交給services對象。

Services

package com.kkb.services;

import com.kkb.dao.UserDao;

import com.kkb.models.UserBean;

import java.sql.*;

//用于處理用戶相關的業務邏輯

public class UserService {

private UserDao dao;

public UserService() {

dao = new UserDao();

}

//處理的登錄邏輯 沒有使用DAO之前

public UserBean checkLogin(String username,String pwd) throws Exception{

//連接數據庫

String JDBCDRVIER="com.mysql.jdbc.Driver";

String URL="jdbc:mysql://localhost:3306/ProjectServlet";

String USER="root";

String PASSWORD="3692512";

Class.forName(JDBCDRVIER);

Connection connection = DriverManager.getConnection(URL,USER,PASSWORD)

System.out.println("數據庫連接成功,正在查詢....");

//查詢數據庫

PreparedStatement statement = connection.prepareStatement("select *from user where username = ? and password = ?");

statement.setObject(1,username);

statement.setObject(2,password);

ResultSet resultSet = statement.executeQuery();

if (resultSet.next()){

//將數據打包成一個UserBean

UserBean bean = new UserBean();

//從結果集中取出數據

bean.setId(resultSet.getInt(1));

bean.setName(resultSet.getString(2));

bean.setPwd(resultSet.getString(3));

//返回bean 表示登錄成功了

return bean;

}else{

//表示用戶名和密碼不正確

return null;

}

}

但是,這里我們發現service里面既有業務邏輯的處理,也有和數據庫的交互,這樣代碼的耦合程度高,不方便日后維護,所以我們考慮在原MVC的基礎上添加DAO層,專門用來和數據庫交互,這樣能夠進一步降低代碼的耦合度。

DAO

這里的DAO就是我們專門和數據庫打交道的地方,引入DAO后的邏輯可用下圖表示。

070d78f014693b165a65c02279cad5e6.png

這里我們dao層有兩個java文件,一個是DBTool,是封裝的數據庫工具類,一個是UserDao,輸入username返回bean對象(注意,這里僅僅是輸入username,不執行是否密碼一致的邏輯業務判斷,判斷是上一層service的范疇)

package dao;

import models.UserBean;

import java.sql.SQLException;

import java.util.List;

import java.util.Map;

public class UserDAO {

private DBTool dbTool;

public UserDAO() {

try {

this.dbTool = new DBTool();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

// 根據用戶名獲取一條數據

public UserBean selectUserByName(String username){

//編寫sql

String sql = "select *from user where username = ?";

//調用連接類來執行sql

try {

List> maps = dbTool.executeQuery(sql, username);

if (maps.size() > 0){

return mapToUserBaen(maps.get(0));

}

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

//將map 轉換為對象

public UserBean mapToUserBaen(Map map){

//把map轉為UserBean

UserBean bean = new UserBean();

bean.setUsername((String) map.get("username"));

bean.setPassword((String) map.get("password"));

bean.setNickname((String) map.get("nickname"));

return bean;

}

public void insertUser(String name, String pwd) throws SQLException {

String sql = "insert into user values(null,?,?)";

dbTool.executeUpdate(sql,name,pwd);

}

}

package dao;

import java.sql.*;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class DBTool {

public String ip = "127.0.0.1";

public int port = 3306;

public String

user="root",

password="3692512",

charset ="utf8",

dbName="ProjectServlet";

private static boolean DriverLoaded=false;

//使用默認參數鏈接數據庫

public DBTool() throws ClassNotFoundException {

if(DriverLoaded)return;

try {

Class.forName("com.mysql.jdbc.Driver");

System.out.println("DBTools message:數據庫驅動加載成功!");

} catch (ClassNotFoundException e) {

System.out.println("DBTools Error:驅動程序加載失敗!");

throw e;

}

DriverLoaded=true;

}

//自定義參數初始化

public DBTool(String ip, int port, String user, String password, String dbName) throws ClassNotFoundException {

this();

this.ip = ip;

this.port = port;

this.user = user;

this.password = password;

this.dbName = dbName;

}

//自定義參數初始化

public DBTool(String user, String password, String dbName) throws ClassNotFoundException {

this();

this.user = user;

this.password = password;

this.dbName = dbName;

}

//獲取一個鏈接

public Connection getConnection() throws SQLException {

String url = String.format("jdbc:mysql://%s:%s/%s?characterEncoding=%s&user=%s&password=%s&useSSL=false",ip,port,dbName,charset,user,password);

try {

return DriverManager.getConnection(url);

} catch (SQLException e) {

System.out.println("DBTools Error 數據庫連接失敗!");

throw e;

}

}

//執行查詢語句

public List> executeQuery(String sql, Object...args) throws SQLException {

ArrayList> res = new ArrayList<>();

ResultSet resultSet = null;

PreparedStatement preparedStatement = null;

Connection connection = null;

try {

connection = getConnection();

preparedStatement = getPreparedStatement(connection, sql, args);

resultSet = preparedStatement.executeQuery();

while (resultSet.next()) {

resultSet.getMetaData().getColumnCount();

HashMap map = new HashMap<>();

for (int i = 1; i <= resultSet.getMetaData().getColumnCount() ; i++) {

map.put(resultSet.getMetaData().getColumnName(i),resultSet.getObject(i));

}

res.add(map);

}

} catch (SQLException e) {

e.printStackTrace();

throw e;

} finally {

if(resultSet != null)

resultSet.close();

if(preparedStatement != null)

preparedStatement.close();

if(connection != null)

connection.close();

}

return res;

}

//sql參數預處理

private PreparedStatement getPreparedStatement(Connection connection, String sql, Object[] args) throws SQLException {

PreparedStatement preparedStatement = connection.prepareStatement(sql);

int count = sql.length() - sql.replace("?", "").length();

if(count != args.length){

throw new SQLException("DBTool Error: 參數個數不匹配");

}

for (int i = 0; i < args.length; i++) {

preparedStatement.setObject(i+1,args[i]);

}

return preparedStatement;

}

//執行更新語句 包括delete update insert

public boolean executeUpdate(String sql,Object...args) throws SQLException {

try {

Connection connection = getConnection();

PreparedStatement preparedStatement = getPreparedStatement(connection, sql, args);

int i = preparedStatement.executeUpdate();

if (i>0){return true;}

} catch (SQLException e) {

e.printStackTrace();

throw e;

}

return false;

}

}

最后當我們寫好dao層后,我們修改service如下:

package services;

import dao.DBTool;

import dao.UserDAO;

import models.UserBean;

import java.sql.*;

public class UserServices {

private UserDAO dao;

public UserServices() {

dao = new UserDAO();

}

public UserBean checkLogin(String username, String password) throws Exception{

UserBean userBean = dao.selectUserByName(username);

if(userBean != null){

if(userBean.getPassword().equals(password)){

return userBean;

}

}

return null;

// //連接數據庫

// String JDBCDRVIER="com.mysql.jdbc.Driver";

// String URL="jdbc:mysql://localhost:3306/ProjectServlet";

// String USER="root";

// String PASSWORD="3692512";

// Class.forName(JDBCDRVIER);

// Connection connection = DriverManager.getConnection(URL,USER,PASSWORD);

// System.out.println("數據庫連接成功,正在查詢....");

//

// //查詢數據庫

// PreparedStatement statement = connection.prepareStatement("select *from user where username = ? and password = ?");

// statement.setObject(1,username);

// statement.setObject(2,password);

// ResultSet resultSet = statement.executeQuery();

// if (resultSet.next()){

// //將數據打包成一個UserBean

// UserBean bean = new UserBean();

// //從結果集中取出數據

// bean.setUsername(resultSet.getString(1));

// bean.setPassword(resultSet.getString(2));

// bean.setNickname(resultSet.getString(3));

// //返回bean 表示登錄成功了

// return bean;

// }else{

// //表示用戶名和密碼不正確

// return null;

// }

}

}

可以看到,我們通過MVC+Dao的形式,實現了程序的解耦,這樣修改需求的時候,我們可以方便后序的維護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271208.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python selenium 獲取同一元素的多個屬性_python+selenium如何獲取元素中并列的屬性值?...

獲取標簽內容使用element.attribute()方法獲取dom元素的內容&#xff0c;如&#xff1a;dr driver.find_element_by_id(tooltip)dr.get_attribute(data-original-title) #獲取tooltip的內容dr.text #獲取該鏈接的text獲取標簽屬性linkdr.find_element_by_id(tooltip)link.valu…

ndk學習6: 使用gdb調試ndk程序一

生成debug版程序 方法一: 使用ndk-build編譯時&#xff0c;加上如下參數NDK_DEBUG1&#xff0c;之后生成so文件之外&#xff0c;還會生成gdbobserver,gdb.setup調式文件 方法二: 修改AndroidManifest.xml文件,增加debuggable屬性為true <application android:debuggable&quo…

后端:C#操作Mongodb用法筆記

MongoDB 是一個基于分布式文件存儲的數據庫。由 C 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。今天主要給大家介紹一下C#編程語言下Mongodb的用法。開發環境為VS2015示例主要包括數據的增刪改查、分頁查詢、文件存儲等功能。有需要的朋友可以一起學習一下。…

計算機語言分為三種:機器語言、匯編語言和高級語言

計算機語言有哪幾種&#xff1f; 計算機語言分為三種&#xff1a;機器語言、匯編語言和高級語言 1.機器語言 機器語言是用二進制代碼表示計算機能直接識別和執行的一種機器指令的集合&#xff0c;它是計算機的設計者通過計算機的硬件結構賦予計算機的操作功能。 優點&#…

asp php java_ASP\JSP\PHP相比各有什么優缺點?

展開全部ASP、JSP、和PHP的優點e5a48de588b662616964757a686964616f31333366306538和缺點&#xff1a;一、ASP優點:1、無需編譯2、易于生成3、獨立于瀏覽器4、面向對象5、與任何ActiveX scripting 語言兼容6、源程序碼不會外漏缺點:1、Windows本身的所有問題都會一成不變的也累…

js變量提升_學習筆記:JS中的作用域和預解析

知識總結&#xff1a;謝靜賢、湯昊在javascript中作用域是非常重要的&#xff0c;本文將會說明作用域以及我們在工作&#xff0c;以及面試中的一些面試題&#xff0c;如果有不足的地方希望大家可以評論指出來&#xff0c;自己一定會及時的改正錯誤&#xff0c;避免大家走入一些…

ArcGIS Engine開發之旅09--幾何對象和空間參考

1.Geometry Geometry 是 GIS 中使用最為廣泛的對象集之一&#xff0c;用戶在創建、刪除、編輯和進行地理分析的時候&#xff0c;就是處理一個包含幾何形體的矢量對象&#xff1b;除了顯示要素意外&#xff0c;控件對象選擇&#xff0c;要素符號化&#xff0c;標注要素&#xf…

項目管理:軟件工程相關知識筆記

1、軟件工程概念介紹軟件工程是指應用計算機科學、數學、管理科學等原理&#xff0c;以工程化的原則和方法來解決軟件問題的工程&#xff0c;其主要目的是提高軟件生產率、提高軟件質量、降低軟件成本。2、軟件工程學的組成軟件開發技術&#xff1a;軟件開發方法學、軟件工具、…

android開發java環境_搭建Android開發環境 - Android - mobile - JavaEye論壇

Android的開發現在是如火如荼&#xff0c;逞現在不是很忙了&#xff0c;學習了下&#xff0c;這里記錄下了在windows在如何搭建Android開發環境&#xff0c;對自己是個記錄&#xff0c;對新入門的兄弟姐妹們可以參考一下&#xff01;(1)安裝JDK&#xff0c;省略。(2)下載Androi…

updatebyprimarykeyselective的where條件是全部字段_ArcGIS 字段計算器

使用鍵盤輸入值并不是編輯表中值的唯一方式。在某些情況下&#xff0c;為了設置字段值&#xff0c;可能要對單條記錄甚至是所有記錄執行數學計算。您可以對所有記錄或選中記錄執行簡單計算和高級計算。此外&#xff0c;還可以在屬性表中的字段上計算面積、長度、周長和其他幾何…

jQuery自定義選擇器

jQuery 1.8版本后&#xff0c; 可以通過$ 的createPseudo()方法自定義選擇器&#xff0c;滿足不同的需求&#xff0c;本文來自<jquery in action> <ul class"levels"><li data-level"1" data-points"1" data-technologies"j…

項目管理基礎:軟件生命周期概念介紹

1、軟件生命周期定義軟件產品或軟件系統要經歷孕育、誕生、成長、成熟、衰亡等階段稱為軟件的生命周期。2、軟件生命周期階段組成軟件的生命周期由可行性分析與項目開發計劃、需求分析、總體設計、詳細設計、編碼、單元測試、綜合測試、維護階段。2.1 可行性分析與項目開發計劃…

jvm棧和寄存器

jvm棧和寄存器 總結

python模型_python 模型的釋義

CharField#字符串字段, 用于較短的字符串.#CharField 要求必須有一個參數 maxlength, 用于從數據庫層和Django校驗層限制該字段所允許的最大字符數.IntegerField用于保存一個整數.FloatField# 一個浮點數. 必須 提供兩個參數:## 參數 描述# max_digits 總位數(不包括小數點和符…

java 布爾表達式_java - 布爾值,條件運算符和自動裝箱

java - 布爾值&#xff0c;條件運算符和自動裝箱為什么拋出falsepublic static void main(String[] args) throws Exception {Boolean b true ? returnsNull() : false; // NPE on this line.System.out.println(b);}public static Boolean returnsNull() {return null;}雖然…

安裝你自己的perl modules

來源&#xff1a; http://www.cnblogs.com/itech/archive/2012/12/17/2822044.html 安裝你自己的perl modules。當沒有root權限的時候&#xff0c;需要安裝perl modules到自己的home目錄下。 來自&#xff1a;http://servers.digitaldaze.com/extensions/perl/modules.html Ins…

項目管理基礎:項目的生存周期模型

1、概念介紹軟件生命周期模型是一個包含軟件產品開發、運行和維護中有關過程、活動和任務的框架&#xff0c;它覆蓋了系統從需求定義到系統使用的結束階段。特點&#xff1a;描述了開發的主要階段定義了每個階段需要完成的任務和過程規范了每個階段的輸入輸出提供了一個標準框架…

jps顯示當前所有java進程pid

很多Java命令都在jdk的JAVA_HOME/bin/目錄下面&#xff0c;jps也不例外&#xff0c;他就在bin目錄下&#xff0c;所以&#xff0c;他是java自帶的一個命令。 jps(Java Virtual Machine Process Status Tool) 是java提供的一個顯示當前所有java進程pid的命令&#xff0c;適合在…

jvm內存結構_淺談JVM內存結構

JVM 可以分為 5 個部分&#xff0c;分別是&#xff1a;類加載器&#xff08;Class Loader&#xff09;&#xff1a;加載字節碼文件到內存。運行時數據區&#xff08;Runtime Data Area&#xff09;&#xff1a;JVM 核心內存空間結構模型。執行引擎&#xff08;Execution Engine…