[Java]JavaWeb开发中的MVC设计模式

一、有关Java Web与MVC设计模式

     学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里。

     Java是一门应用设计模式比较广泛的语言。目前主流提出的23种设计模式均可在Java语言编写的程序中所应用。目前主流在Java Web应用中应用的最广泛的设计模式便是MVC模式,目前的主流Web框架大多也是基于MVC设计模式所编写的。

二、MVC在Java Web应用中的具体应用

所谓MVC,即Model-View-Controller。

(1)Model层:Model指模型部分,一般在应用中Model层包括业务处理层和数据访问层。数据访问层主要是对数据库的一些操作的封装。业务处理层应用JavaBean构建,  JavaBean主要是用作将从View层获取的数据和数据库的数据进行桥接。除却JavaBean以外,若想构建分布式应用系统,可以应用EJB组件进行业务逻辑层的构建。

(2)Controller层:Controller指控制部分,一般是对View层提交的请求为其设置对应的Servlet进行特定功能的处理,这里的进行特定功能的处理一般是编写在Model中的业务处理层中的。Controller一般只是在Web应用中充当一个中介者的作用。

(3)View层:View指视图部分,这一部分的内容是展示给用户实际进行交互的,通常使用JSP和HTML进行构建(个人比较喜欢以HTML嵌入JSP的方式来构建网页)。

综上来说,一个小型完整的基于MVC设计模式的Web应用程序的处理流程应该如下:

      由上面的图中我们可以看出,用户在客户端(Web应用的客户端即为浏览器)中发出请求的时候,请求首先由View层的JSP/HTML将HTTP请求传给控制器中对应的Servlet,然后由Servlet负责调用Model层中的业务逻辑处理部分进行要求的处理,处理期间如果设计数据库的操作,则与数据库进行操作,最后全部操作结束之后,由业务逻辑层将结果发给控制层,控制层以HTTP响应的形式将结果发送回客户端。

三、一个MVC设计模式的小例子

我们的这个例子是运用MVC技术和基本的Java Web技术进行一个用户注册和信息查询的Web应用的制作。项目工程文件夹目录如下:

1.View层的编写

在这里我们模仿制作一个用户进行的注册界面,并在表单中指定接受请求并处理该页面的Servlet。View层主要是由jsp、HTML编写而成。

其中的一个jsp示例文件如下:

<%@ page language="java" import="java.util.*" contentType="text/html"; charset="utf-8" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>用户注册界面</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  <body style="text-align=:center">
      <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
        <table width="60%" border="1">
                <tr>
                    <td>用户名</td>
                    <td>

                        <input type="text" name="userName">
                    </td>
                </tr>
                <tr>
                    <td>密码</td>
                    <td>
                        <input type="password" name="passWord">
                    </td>
                </tr>

                <tr>
                    <td>你出生的城市是哪里</td>
                    <td>
                        <input type="text" name="answer">
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="reset" value="清空">
                    </td>
                    <td>
                        <input type="submit" value="注册">
                    </td>
                </tr>
            </table>
        </form>
  </body>
</html>

在jsp文件中我们指定了接受该页面并进行处理的表单。表单在Web应用中是十分重要的,目前Web应用的前后端传输数据的时候多数都要用到表单。

2.Controller层的编写

Controller层主要编写接受View层请求的Servlet。示例Servlet如下:

import java.io.IOException;

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 com.gaodongyan.bean.UserBean;
import com.gaodongyan.service.ResigerInfo;


@WebServlet("/ResigerServlet")
public class ResigerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
        public ResigerServlet() {
             super();
        
    }

    /*UserBean:userName,passWord,answer
     * 在doGet()方法中,我们利用HttpServletRequest类中封装的方法进行对页面元素的调用
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserBean user = new UserBean();
        user.set_userName(request.getParameter("userName"));
        user.set_passWord(request.getParameter("passWord"));
        user.set_answer(request.getParameter("answer"));
        String sql = "INSERT INTO USERINFO ([username],[password],[answer]) values (" + user.get_userName() + "," + user.get_passWord() + "," +user.get_answer() + ")";
        ResigerInfo resigerInfo = new ResigerInfo();
        resigerInfo.interToDb(sql);
        
    }

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

}

3.Model层的编写

Model层在具体的编写中包括dao层和bean层还有service层。

(1)bean层:bean层中编写数据模型类。

示例Bean如下:

public class UserBean {
    private String userName;
    private String passWord;
    private String answer;
    public void set_userName(String userName) {
        this.userName = userName;
    }
    public void set_passWord(String passWord) {
        this.passWord = passWord;
    }
    public void set_answer(String answer) {
        this.answer = answer;
    }
    public String get_userName() {
        return userName;
    }
    public String get_passWord() {
        return passWord;
    }
    public String get_answer() {
        return answer;
    }
}

(2)dao层负责与数据库进行交互。

示例dao层如下:其中GetConnection类返回一个数据库连接,UpdateDb类负责通过调用GetConnection来获得一个连接对象,再进行具体的数据库操作。

class GetConnection {

    private String url;
    private String userName;
    private String password;
    Connection conn ;
    public Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e) {

        }
        try {
            conn = DriverManager.getConnection(url, userName, password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;

    }
}

注:在此处略去了数据库连接所需要的url、username、password。在具体操作的时候则需要指定这三项。 

public class UpdateDb {
    Connection conn;
    Statement stmt;
    ResultSet result;
    public void doUpdate(String sql) {
        GetConnection getedConnection = new GetConnection();
        conn = getedConnection.getConnection();
        try {
            stmt = conn.createStatement();
            stmt.executeQuery(sql);

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

(3)service层:service层负责编写具体的业务逻辑,由于我们的示例中的业务逻辑比较简单,故此处编写的代码较少。对于大型项目来说,业务逻辑层一般需要进行很多的业务处理。

示例如下:

public class ResigerInfo {
    //We can set a unique sql in this place.
    public void interToDb(String sql) {
        UpdateDb updateDb = new UpdateDb();
        updateDb.doUpdate(sql);
    }
}

4.Demo总结

      博文中贴出的代码是用户注册时需要的步骤。由于多个类和层间存在调用关系,所以大家在看贴出的源码时可能会有理解的问题。所有类都已经在最开始的项目结构图中体现了,相信对比着项目结构图大家都会很容易明白MVC设计模式的基本调用历程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ETL工具-pentaho企业实战部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

TinyOS 配置教程

系列文章目录 TinyOS 系列文章【一】&#xff1a;TinyOS 配置教程 TinyOS 系列文章【二】&#xff1a;Tossim 教程 文章目录 系列文章目录前言1. 安装1.1. 实验环境1.2. TinyOS基础工作1.3. TinyOS 的配置1.4. 安装 java1.5. 安装编译器 2. 测试仿真程序总结 前言 本文主要用…

kafka集群搭建

1.本次搭建涉及3台centos7主机&#xff0c;防火墙与selinux服务均关闭 2.主机参数如下表所示 nameIPportserviceA10.1.60.1122128、2888、3888、9092kafka、zookeeperB10.1.60.1142128、2888、3888、9092kafka、zookeeperC10.1.60.1152128、2888、3888、9092kafka、zookeeper…

让人悲观的国内ChatGPT的未来

最近关于ChatGPT的火爆已经不是简单的AI圈的事了&#xff0c;它已经席卷了所有的IT、媒体圈子&#xff0c;甚至是不同领域不同行业的人&#xff0c;只要你还对于变化与AI有一定的了解&#xff0c;那我相信你一定能知道ChatGPT是什么了。ChatGPT在某种程度上已经是相当于AGI通用…

图论-匈牙利算法学习

本文讲述的是匈牙利算法&#xff0c;即图论中寻找最大匹配的算法。解决的问题是从二分图中找到尽量多的匹配。 原题-华为-HJ28 素数伴侣 描述 题目描述 若两个正整数的和为素数&#xff0c;则这两个正整数称之为“素数伴侣”&#xff0c;如2和5、6和13&#xff0c;它们能应用…

【已解决】SpringBoot 工程 war包服务部署与调用测试

1.开发环境&#xff1a;IDEA&#xff0c;JDK1.8 2.服务打包类型&#xff1a; war包 3.war包部署环境&#xff1a;Linux系统&#xff0c;tomcat服务器&#xff0c;端口号&#xff1a;8081 4.war包部署位置&#xff1a;tomcat-8081/webapps/temp.war 5.服务名为&#xff1a;t…

瑞吉外卖项目——瑞吉外卖

软件开发整体介绍 软件开发流程 需求分析&#xff1a;产品原型、需求规格说明书 设计&#xff1a;产品文档、UI界面设计、概要设计、详细设计、数据库设计 编码&#xff1a;项目代码、单元测试 测试&#xff1a;测试用例、测试报告 上线运维&#xff1a;软件环境安装、配置…

python-day6(补充四:私有属性与函数)

私有属性与函数 私有属性与函数的用途如何定义私有属性与函数如何访问私有属性与函数 私有属性与函数的用途 在面向对象的封装中&#xff0c;私有的属性与函数其根本目的是防止它们在类的外部被使用&#xff0c;python中主要通过命名来进行区分。 把可能使用到的东西封装起来…

从零基础到条码高手:傻瓜式操作,告别excel、AI和PS的烦恼

条形码是一种用于商品识别、库存管理等方面的编码标识系统&#xff0c;它是通过将数字和字符以特定的图案排列组合起来&#xff0c;从而形成一组能被机器扫描和识别的条纹图案。 通常情况下&#xff0c;条形码的生成可以分为如下几个步骤&#xff1a; 1、编号&#xff1a;首先…

数据可视化工具汇总:数字孪生产品的得力助手

数字孪生技术是一项快速发展的新兴技术&#xff0c;已经在许多领域得到广泛应用。数字孪生技术不仅可以提供完整的虚拟模型&#xff0c;还可以模拟物理系统的行为。在数字孪生技术的推动下&#xff0c;越来越多的数字孪生产品开始涌现出来&#xff0c;为不同的领域提供支持和解…

如何通过FAQ页面减轻客户支持压力,提高工作效率?

作为现代企业不可或缺的一部分&#xff0c;客户支持服务是为客户提供解决方案、回答问题和解决技术难题的关键部分。无论是产品管理还是销售环节&#xff0c;客户支持都是重要的一环。然而&#xff0c;有效地处理技术支持问题和客户请求并不容易。卓越的客户支持需要组织结构&a…

excle表格打印相关问题

ps&#xff1a;无论是打印word,还是打印excel, 最后最好都保存成pdf&#xff0c;再打印。 ps&#xff1a;无论是打印word,还是打印excel, 最后最好都保存成pdf&#xff0c;再打印。 ps&#xff1a;无论是打印word,还是打印excel, 最后最好都保存成pdf&#xff0c;再打印。 …

ThreadLocal InheritableThreadLocal TransmittableThreadLocal的使用以及原理

ThreadLocal 每个线程向ThreadLocal设置值&#xff0c;再取值&#xff0c;实现线程之间的隔离 public class ThreadLocalCase1 {private static ThreadLocal<Integer> threadLocal new ThreadLocal<>();public static void main(String[] args) {Random random …

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术 倾斜摄影超大场景的三维模型轻量化的质量关键技术主要包括&#xff1a; 1、保持数据精度。在进行轻量化处理时&#xff0c;必须确保数据的精度不受损失&#xff0c;否则会影响后续分析和应用方案。因此&#xff0…

【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】

Leetcode Leetcode -剑指Offer 22.链表中倒数第k个结点Leetcode -203.移除链表元素 Leetcode -剑指Offer 22.链表中倒数第k个结点 题目&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表…

DAY829

学习目标&#xff1a;成就上瘾&#xff0c;学到欲罢不能 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;背单词150个&#xff0c;背《死亡诗社》经典语段&#xff0c;抄写…

【Spring Cloud】Spring Cloud 是什么?

文章目录 前言一、子项目二、常用组件三、把 Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格&#xff1a; 前言 Spring 以 Bean&#xff08;对象&#xff09; 为中心&#xff0c;提供 IOC、AOP 等功能。Spring Boot 以 Application&#xff08;应用&#xff09; 为中…

LightGBM面试题

1.偏差 vs 方差? 偏差是指由有所采样得到的大小为m的训练数据集&#xff0c;训练出的所有模型的输出的平均值和真实模型输出之间的偏差。 通常是由对学习算法做了错误的假设导致的描述模型输出结果的期望与样本真实结果的差距。分类器表达能力有限导致的系统性错误&#xff0c…

linux学习记录 和文件系统相关的命令

记录过程&#xff0c;会有错误,硬链接与软链接哪里可能没有说清楚 文件,目录操作命令 pwd 获取当前处于哪个目录当中&#xff0c;返回的是绝对路径 [rootlocalhost home]# pwd /homecd cd 相对/绝对路径 切换目录的&#xff0c;change directory .代表当前目录 …代表上一级…

基于opencv-python的深度学习模块案例

目录 图像分类 目标检测 人脸检测 姿态估计 车辆检测 一、图像分类 图像分类是基于深度学习的计算机视觉任务中最简单、也是最基础的一类&#xff0c;它其中用到的CNN特征提取技术也是目标检测、目标分割等视觉任务的基础。 具体到图像分类任务而言&#xff0c;其具体流…