Java Web开发中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示例文件如下:

 1 <%@ page language="java" import="java.util.*" contentType="text/html"; charset="utf-8" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11
12     <title>用户注册界面</title>
13
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22
23   </head>
24   <body style="text-align=:center">
25       <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
26         <table width="60%" border="1">
27                 <tr>
28                     <td>用户名</td>
29                     <td>
30
31                         <input type="text" name="userName">
32                     </td>
33                 </tr>
34                 <tr>
35                     <td>密码</td>
36                     <td>
37                         <input type="password" name="passWord">
38                     </td>
39                 </tr>
40
41                 <tr>
42                     <td>你出生的城市是哪里</td>
43                     <td>
44                         <input type="text" name="answer">
45                     </td>
46                 </tr>
47                 <tr>
48                     <td>
49                         <input type="reset" value="清空">
50                     </td>
51                     <td>
52                         <input type="submit" value="注册">
53                     </td>
54                 </tr>
55             </table>
56         </form>
57   </body>
58 </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如下:

 1 public class UserBean {
 2     private String userName;
 3     private String passWord;
 4     private String answer;
 5     public void set_userName(String userName) {
 6         this.userName = userName;
 7     }
 8     public void set_passWord(String passWord) {
 9         this.passWord = passWord;
10     }
11     public void set_answer(String answer) {
12         this.answer = answer;
13     }
14     public String get_userName() {
15         return userName;
16     }
17     public String get_passWord() {
18         return passWord;
19     }
20     public String get_answer() {
21         return answer;
22     }
23 }

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

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

 1 class GetConnection {
 2
 3     private String url;
 4     private String userName;
 5     private String password;
 6     Connection conn ;
 7     public Connection getConnection() {
 8         try {
 9             Class.forName("com.mysql.jdbc.Driver");
10         }catch(ClassNotFoundException e) {
11
12         }
13         try {
14             conn = DriverManager.getConnection(url, userName, password);
15         } catch (SQLException e) {
16             // TODO Auto-generated catch block
17             e.printStackTrace();
18         }
19         return conn;
20
21     }
22 }

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

 1 public class UpdateDb {
 2     Connection conn;
 3     Statement stmt;
 4     ResultSet result;
 5     public void doUpdate(String sql) {
 6         GetConnection getedConnection = new GetConnection();
 7         conn = getedConnection.getConnection();
 8         try {
 9             stmt = conn.createStatement();
10             stmt.executeQuery(sql);
11
12         } catch (SQLException e) {
13             e.printStackTrace();
14         }
15
16     }
17 }

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

示例如下:

1 public class ResigerInfo {
2     //We can set a unique sql in this place.
3     public void interToDb(String sql) {
4         UpdateDb updateDb = new UpdateDb();
5         updateDb.doUpdate(sql);
6     }
7 }

4.Demo总结

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

四、总结

由于时间仓促,导致示例Demo没有全部完成,待这几天完成后会上传到github并共享。相信有了这篇博文,大家应该对MVC设计模式在Java Web中的基本应用有了简单的了解。后期博主还会对目前主流的Java Web框架进行介绍。本博客纯属个人学习总结,如有不足请各位批评指正。

时间: 2024-10-13 20:44:41

Java Web开发中MVC设计模式简介的相关文章

Java Web 开发中路径相关问题小结

Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同级目录:http://localhost:8080/test/articles/article1.jsp和http://

日常 java web 开发中遇到的常见问题

view 层: 问题:jsp 页面double 值过大,会变成科学计数法 第一步:引入标签 <%@ taglib prefix= "fmt" uri ="/WEB-INF/tld/fmt.tld" %> 第二步: <fmt:formatNumber value= "${变量名} " pattern="#.00"/> 2.jsp和java后台交互,通过js 转码问题 js代码:       var tes

java web开发中的奇葩事web.xml中context-param中的注释

同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步删除同事提交的代码,进行还原. 奇葩事情出现了! <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/context_entry.xml

依赖注入及AOP简述(十)——Web开发中常用Scope简介 .

1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一些贯穿整个EAR都会用到的常量定义.通用的服务组件.类似DBConnection连接创建等比较消耗资源的组件等等放到这个Scope中去.Application级Scope是与应用程序的ServletContext共存亡的,因此可以理解为所部署应用程序的ServletContext中的“单例Scope

java web开发中,如何查看JSP和Servlet版本 (转)

原文出处:http://blog.163.com/qiu_yin_good/blog/static/16732934920123277481492/ 在看<struts2权威指南>的时候,书上很多处都提到环境要支持的JSP,Servlet版本.如果版本低,会出现异常.或者需要修改web.xml等. 现在记录下如何看自己java  web工程的JSP和servlet版本. 我的tomcat版本是7.0.26 方法:打开tomcat/lib,找到jsp-api.jar和servlet-api.ja

Java Web开发中路径问题小结

看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同

Java web开发中主要用到的jar包

1.Java开发中主要用到的jar包介绍:(1)java JDK基础开发包:java包和javax包.书写方式:import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; 1.java.util包:集合类list/set/map等接口和实现类.calendar,date日期操作类.properties读取配置文件类.random随机数类.Timer计时器类.

Java web开发中页面跳转小技巧——跳转后新页面在新窗口打开

最近学习Java web,在学习过程中想实现一个需求,就是在jsp页面跳转的时候,希望跳转后的新页面在新窗口中打开, 而不是覆盖原来的页面,这个需求使我困惑了好长时间,后来通过大海捞针似的在网上寻找方法,最后终于得以解决, 现将此方法跟大家分享,如果有不足的地方,请多包涵,我的初衷是能帮助到有这方面需要的人. 之前我在网上也曾搜到过相对靠谱的方法,就是在jsp页面相应位置加入代码:target="_black",如 <a href="articleView?id=${a

Java Web开发中Spring+MyBatis框架的简单搭建

这里使用的eclipse,首先创建一个动态web项目. 1.导入Spring IOC.AOP.DAO.dbcp.dbdrive.mybatis.jar . mybatis-spring.jar  本人使用的jar包和版本如下: aopalliance.jaraspectjweaver.jarcommons-dbcp-1.4.jarcommons-logging.jarcommons-pool-1.5.6.jarmybatis-3.2.5.jarmybatis-spring-1.2.2.jarmy