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示例文件如下:
<%@ 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设计模式的基本调用历程。
四、总结
由于时间仓促,导致示例Demo没有全部完成,待这几天完成后会上传到github并共享。相信有了这篇博文,大家应该对MVC设计模式在Java Web中的基本应用有了简单的了解。后期博主还会对目前主流的Java Web框架进行介绍。本博客纯属个人学习总结,如有不足请各位批评指正。
Java Web开发中MVC设计模式简介的更多相关文章
- 依赖注入及AOP简述(十)——Web开发中常用Scope简介 .
1.2. Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l 第一个比较常用的就是Application级Scope,通常我们会将一 ...
- Java Web开发中路径问题小结
Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...
- Java Web 开发中路径相关问题小结
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...
- java web开发中常用的协议的使用和java-web 常见的缓冲技术
一.DNS协议 作用将域名解析为IP 类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...
- Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)
看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...
- Java Web开发中的名词解释
1.JVM Java虚拟机,class文件的运行时环境,就好比软件运行在操作系统一样,java要运行在JVM中才行,这也是Java之所以支持扩平台的基础. 2.Servlet/JSP 是满足一定接口需 ...
- JAVA WEB开发中的资源国际化
为什么要国际化? 不同国家与地区语言,文化,生活习惯等差异.在数字,时间,语言,货币,日期,百分数等的不同. 两个名词: I18N:即资源国际化,全称为Internationalization,因为首 ...
- 学习Java Web篇:MVC设计模式
一.MVC设计模式 1.什么是MVC模式 1.1.MVC -- Model View Controller模型视图控制器 1.2.Model:模型 一个功能 一般用JavaBean 1.3.View: ...
- java web开发中的奇葩事web.xml中context-param中的注释
同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步 ...
随机推荐
- Xcode的清除缓存
1.在“前往文件夹”中输入“ /Users/用户名/Library/Developer/Xcode/DerivedData ”,然后删除里面的东西
- Predicate<T>与Func<T, bool>泛型委托
引用别人的: static void Main(string[] args) { List<string> l = new List<string>(); l.Add(&quo ...
- iOS CoreAnimation 核心动画
一 介绍 一组非常强大的动画处理API 直接作用在CALAyer上,并非UIView(UIView动画) CoreAnimation是所有动画的父类,但是不能直接使用,应该使用其子类 属性: dura ...
- Unity学习疑问记录之查找
unity中提供了获取对象的五种方法: 通过对象名称(Find方法) 通过标签获取单个游戏对象(FindWithTag方法) 通过标签获取多个游戏对象(FindGameObjectsWithTags方 ...
- Powershell获取磁盘信息
使用Powershell完成系统管理实在是太方便了,磁盘信息获取只需几行代码即可. 1: $DiskCount = ((Get-WmiObject -Class Win32_DiskDrive).Ca ...
- poj1131-Octal Fractions(进制转换)
一,题意: 求一个八进制小数的十进制.二,思路: 暴力数组模拟计算,注意千万不带小数做除法运算 1,对于八进制小数,转换成十进制,书写形式分析: 2,对其除法过程进行模拟: 3,输出. 三,步骤: 1 ...
- 《Linux内核设计与实现》读书笔记 第五章 系统调用
第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...
- 关于(object sender, EventArgs e)
sender是事件源 就是指发起这个事件的对象(控件)//表示触发事件的那个控件比如说你按下按钮,那么sender就是按钮 又如:textboxchange,sender就是该textbox,在事 ...
- 在strust2 框架下,前端APP传过来的中文数据乱码问题
public String addMessage() throws UnsupportedEncodingException{ Patient patient=new Patient(); patie ...
- Python之路【第十八章】:Web框架
Web框架本质 1.众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 #!/usr/bin/env python # -*- codin ...