JAVA学习篇--JAVA两种编程模式控制
在Drp项目中,解说了两种编程模式Model 1和Model2。以下是对这两种模式的简单理解。以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下。
Model1
所谓Model1就是JSP大行其道的时代,在Model1模式下,整个Web应用差点儿所有由JSP页面组成,JSP页面接收处理client请求,对请求处理后直接做出响应。用少量的JavaBean来处理数据库连接、数据库訪问等操作。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
代码演示样例:改动用户信息
主页面的js跳转:
function modifyUser() { var selectFlags=document.getElementsByName("selectFlag");
var count=0;
var j=0;
for(var i=0;i<selectFlags.length;i++){
if(selectFlags[i].checked){
j=i;
count++;
}
}
if(count==0){
alert("请选择须要改动的用户");
return;
}
if(count>1){
alert("一次仅仅能改动一个用户");
return;
}
//alert(selectFlags[j].value);
window.self.location = "user_modify.jsp?userId="+selectFlags[j].value;;
}
jsp页面的java代码:负责的任务为获取http协议传递的參数,然后调用业务逻辑方法
<%
request.setCharacterEncoding("GB18030");
String command = request.getParameter("command");
//当点击改动button后。运行到此
if("modify".equals(command)){
User user=new User();
user.setUserId(request.getParameter("userId"));
user.setUserName(request.getParameter("userName"));
user.setPassword(request.getParameter("password"));
user.setContactTel(request.getParameter("contactTel"));
user.setEmail(request.getParameter("email")); UserManager.getInstance().modifyUser(user);
out.println("改动用户成功! ");
}
//显示要改动的用户信息
String userId=request.getParameter("userId");
User user=UserManager.getInstance().findUserById(userId); %>
/**
* 改动用户
* @param user
*/
public void modifyUser(User user){
StringBuilder sbSql=new StringBuilder(); sbSql.append("update t_user ")
.append("set user_name = ? , ")
.append("password = ? , ")
.append("contact_tel = ?, ")
.append("email = ? ")
.append("where user_id = ? ");
Connection conn=null;
PreparedStatement pstmt=null; try{
conn=DbUtil.getConnection();
pstmt=conn.prepareStatement(sbSql.toString()); pstmt.setString(1, user.getUserName());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getContactTel());
pstmt.setString(4, user.getEmail());
pstmt.setString(5, user.getUserId());
pstmt.executeUpdate(); }catch(SQLException e){
e.printStackTrace();
}finally{
DbUtil.close(pstmt);
DbUtil.close(conn);
} }
Model1模式的实现比較简单,适用于高速开发小规模项目。但从project化的角度看,它的局限性很明显:JSP页面身兼View和Controller两种角色。将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性很低,添加了应用的扩展性和维护的难度。
由此而出现Model 2模型
Model2已经是基于MVC架构的设计模式。在Model2架构中。Servlet作为前端控制器。负责接收client发送的请求,在Servlet中仅仅包括控制逻辑和简单的前端处理;然后,调用后端JavaBean来完毕实际的逻辑处理;最后,转发到对应的JSP页面处理显示逻辑。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
代码演示样例:
主页面的js跳转
function modifyItem() { var selectFlags = document.getElementsByName("selectFlag");
var count = 0;
var j = 0;
for (var i=0; i<selectFlags.length; i++) {
if (selectFlags[i].checked) {
j = i;
count++;
}
}
if (count == 0) {
alert("请选择须要改动的物料!");
return;
}
if (count > 1) {
alert("一次仅仅能改动一个物料! ");
return;
}
alert(j);
alert(selectFlags[j].value);
//window.self.location = "<%=basePath%>servlet/item/ShowModifyItemServlet? itemNo=" + selectFlags[j].value;
window.self.location = "<%=basePath%>servlet/item/ShowModifyItemServlet?itemNo=" + selectFlags[j].value;
}
ShowModifyItemServlet:当中从servlet调用业务逻辑的代码省略
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//取得物料代码
String itemNo=request.getParameter("itemNo"); //依据物料代码查询
Item item=itemManager.findItemById(itemNo); //将物料信息设置到request中
request.setAttribute("item", item); //取得物料类别列表
List itemCategoryList=DataDictManager.getInstance().findItemCategoryList(); //取得物料单位列表
List itemUnitList=DataDictManager.getInstance().findItemUnitList(); request.setAttribute("itemCategoryList", itemCategoryList);
request.setAttribute("itemUnitList", itemUnitList); request.getRequestDispatcher("/basedata/item_modify.jsp").forward(request, response);
} item_modify.jsp:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; Item item = (Item)request.getAttribute("item");
List itemCategoryList = (List)request.getAttribute("itemCategoryList");
List itemUnitList = (List)request.getAttribute("itemUnitList");
%>
Model 2下JSP不再承担控制器的责任,依据代码我们也能够看出,jsp中的处理降低很多,此时它不过表现层角色,只用于将结果呈现给用户。JSP页面的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。在Model2模式下。模型(Model)由JavaBean
充当,视图(View)由JSP页面充当,而控制器(Controller)则由Servlet充当。
因为引入了MVC模式,使Model2具有组件化的特点,更适用于大规模应用的开发,使程序猿各司其职,互不干涉。有利于开发中的分工,有利于组件的重用。
当中缺点就是添加了应用开发的复杂程度。原本须要一个简单的JSP页面就能实现的应用。在Model2中被分解成多个协同工作的部分,需花很多其它时间才干真正掌握其设计和实现过程。
三层与MVC
对于Model2模型中引入的MVC模式。相信很多人都层都曾为三层与MVC关系搞得一头雾水,以下我就来简介一下它们二者的关系
首先三层架构绝不是MVC。!它们二者并没有关系
三层架构:界面层(UI)业务逻辑层(BLL)和数据訪问层(DAL)构成的
MVC:模型层(M)界面层(View)和控制层(Controller)构成的,并且他们之间也不正确应。
假设硬要给他们相应的话,那么三层架构中的UI相应MVC中的view(jsp),都是用于显示以及获取界面的数据;三层架构中的BLL层和DAL层相应MVC中的Model(javabean)层都是用于处理上层传递来的数据以及从数据库获取的数据的。MVC中的Controller(Servlet)最多算是三层架构中的UI的一部分,也就我们常说的是Servlet。
例如以下图所看到的:
三层架构的目的着重点是“高内聚。低耦合”,即解耦。它是系统级的架构设计,側重于整个应用程序分层解耦
MVC的目的则是实现Web系统的职能分工。即职责划分。它仅仅是一种设计模式,更加側重web页面显示的解耦。
事实上职责划分也是解耦,可是三层側重的是总体的一个解耦,而MVC側重的是web系统的解耦,即側重jsp和Servlet的一个解耦,它把展示数据的HTML 页面尽可能的和业务代码分离。
它将纯净的界面展示逻辑(用户界面)独立到一些文件里(JSP--Views),把一些和用户交互的程序逻辑(Servlet--Controller)单独放在一些文件里。方便进行指责划分。
比方一般美工仅仅做jsp的页面部分,而对于页面与后台代码的处理则放在servlet中。让专门一部分人来做servlet。但从三层来讲。jsp和servlet都属于界面层,所以在这里使用MVC就实现了指责的划分
三层能够应用于不论什么语言、不论什么技术的应用程序。而MVC仅仅是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,能够同一时候存在,也可依据情况使用当中一种。
事实上三层架构和MVC还是一个东西。!
。
事实上三层架构和MVC是一样的。!!
我们所示不一样仅仅是表面上的不一样。
核心的东西是一致的,那么什么是核心?
答曰:分层。解耦!
假设从解耦的角度来看三层架构和MVC事实上他们是一致的,只不过划分的方法不一样罢了,就像上面的图所看到的(将UI层再次细分)。从这一点说他们能够说是一个东西。这就相当于我们看到馒头和面条一样,表面上看他们不一样(注意不过表面)可是他们核心是一致的,都是面……
我们的架构--三层结合MVC模式
总结:
对于Model 1和Model 2模型来说,两种模型各有优缺点,各自有各自的用武之地,仅仅要我们理解各自的优缺点(Model1模式的实现比較简单。适用于高速开发小规模项目。Model
2具有组件化的特点,耦合性小,更适用于大规模应用的开发)。在实际应用中依据需求,合理选择就可以。
对于三层与MVC来说。刚開始接触的时候相信大家都搞不清楚。可能一直以为它们是一样的。这都没有错,由于学习本就是一个过程,对于知识的理解须要不断的加深认识。每一步的加深或许会推翻曾经的自己,可是每次推翻都代表着进步,代表着理解的更深一层!
版权声明:本文博主原创文章,博客,未经同意不得转载。
JAVA学习篇--JAVA两种编程模式控制的更多相关文章
- JAVA学习篇--Java类加载
由来: 与普通程序不同的是,Java程序(class文件)并非本地的可执行程序(解释性语言). 当执行Java程序时.首先执行JVM(Java虚拟机),然后再把Javaclass载入到JVM里头执行, ...
- java web学习总结(二十九) -------------------JavaBean的两种开发模式
SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...
- javaweb学习总结(二十一)——JavaWeb的两种开发模式
SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...
- Java中BigDecimal的8种舍入模式是怎样的
Java中BigDecimal的8种舍入模式是怎样的?下面长沙欧柏泰克软件学院和大家一起来学习下吧: java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecima ...
- JavaWeb学习 (二十)————JavaWeb的两种开发模式
一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- Java线程创建的两种方式
java多线程总结一:线程的两种创建方式及优劣比较 (一)---之创建线程的两种方式 java实现多线程的两种方法的比较
- Java新建线程的两种方式
Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...
随机推荐
- hive字符串函数
1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例: hive> select length('abcedfg') f ...
- Tutorial: 结合使用AngularJS和Django
好吧,我承认自己很懒,时间又不够用. 翻译的几个文章都是虎头蛇尾,但我保证这次肯定不太监. 关键的单词不翻译,实在觉得翻译成汉语很别扭,括号里是参考翻译. 有问题和建议尽管提出来,我会改进完善. Tu ...
- POJ 2365 Rope(水题)
[题意简述]:给出我们钉子个数与半径,让我们求出缠绕在钉子上的绳子有多长. [分析]:从题目中我们能够看出,绳子长度的和等于每两个钉子的距离的和加上接触在钉子上的绳子的长度,不难发现这部分长度事实上就 ...
- Do you master on array in C ?
Do you master on array in C ? 因为新标准C99的支持变长数组, 差点儿C的标准特性就是看着gcc来的(Linux 内核严重依赖GCC) int mani() { cons ...
- GOJ1150(矩阵快速幂)
sum Time Limit: 1000ms Problem Description: 给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和. Input: 测试数据有多组, ...
- HDU 4916 树分治
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu1011(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs& ...
- Linux下将UTF8编码批量转换成GB2312编码的方法
Linux下将UTF8编码批量转换成GB2312编码的方法 在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换成GB2312编码,下面为大家介绍下在Linux ...
- KSImageNamed-Xcode
KSImageNamed-Xcode 非常的给力的XCODE图片浏览插件; What is this? Can't remember whether that image you just add ...
- CSS之box-sizing的用处简介
前几天才发现有 box-sizing 这么个样式属性.研究了一番感觉非常有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 比如:当一个容器宽度定义为 width:100%; 之后.假设再添加 ...