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.mzph.cn/news/271208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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;还可以在属性表中的字段上计算面积、长度、周长和其他几何…

项目管理基础:软件生命周期概念介绍

1、软件生命周期定义软件产品或软件系统要经历孕育、诞生、成长、成熟、衰亡等阶段称为软件的生命周期。2、软件生命周期阶段组成软件的生命周期由可行性分析与项目开发计划、需求分析、总体设计、详细设计、编码、单元测试、综合测试、维护阶段。2.1 可行性分析与项目开发计划…

jvm栈和寄存器

jvm栈和寄存器 总结

项目管理基础:项目的生存周期模型

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…

鸿蒙和安卓,到底有什么区别?

对于开发者来说两个最关键的点值得关注&#xff1a;一个是 Beta 版的开发工具&#xff0c;一个是开源网站。开源网站在开发者大会上宣布将 HarmonyOS源代码捐赠给中国开放原子开源基金会&#xff0c;并在大会上公布了鸿蒙系统的开源路线。OpenHarmony 官方源码地址&#xff1a;…

错题集03

(选择一项) 3A: B: C: D: 正确答案是 B解析:LinkedList是实现List,Collection接口,是链表方式进行构建的,根据开发要求不同,可以使用LinkedList实现栈(先进先出)和堆(先进后出)这样的数据结构。(选择一项) 4A: B: C: D: 正确答案是 C解析&#xff1a;由于Hashtable是线程…

项目管理基础:软件开发的方法介绍

软件开发方法主要有结构化方法、原型化方法、面向对象开发方法、敏捷方法。1、结构化方法结构化方法由结构化分析、结构化设计、结构化程序设计组成&#xff0c;它是一种面向数据流的开发方法。结构化分析&#xff1a;依据分解与抽象的原则&#xff0c;按照系统中数据处理的流程…

类加载器子系统的作用

类加载器子系统的作用

Magento Block设计分析(深入分析)

Magento中Block是一个很重要的组件&#xff0c;它在Block中充当非常重要的角色&#xff0c;下面我们来分析一下Magento中Block是怎样设计的&#xff0c;我们应该怎样使用这个重要的角色。1、Magento Block类图: 图1: 继承Varien_Object的对象都有一个_data类变量&#xff0c;用…