标签:
MVC 是一种使用MVC Model View Controller模型-视图-控制器设计创建Web 应用程序的模式[1]
大一时的笔记:现在写成博客,有些知识点看到想笑哈哈,给刚学的看看吧!
MVC 模式同时提供了对HTMLCSS 和JavaScript 的完全控制
Model 模型是应用程序中用于处理应用程序数据逻辑的部分通常模型对象负责在数据库中存取数据
View 视图是应用程序中处理数据显示的部分 通常视图是依据模型数据创建的
Controller 控制器是应用程序中处理用户交互的部分 通常控制器负责从视图读取数据控制用户输入并向模型发送数据
MVC 分层有助于管理复杂的应用程序因为您可以在一个时间内专门关注一个方面例如您可以在不依赖业务逻辑的情况下专注于视图设计同时也让应用程序的测试更加容易
MVC 分层同时也简化了分组开发不同的开发人员可同时开发视图控制器逻辑和业务逻辑
视图是用户看到并与之交互的界面对老式的Web应用程序来说视图就是由HTML元素组成的界面在新式的Web应用程序中HTML依旧在视图中扮演着重要的角色但一些新的技术已层出不穷它们包括Adobe Flash和像XHTMLXML/XSL,WML等一些标识语言和Web services.
MVC好处是它能为应用程序处理很多不同的视图在视图中其实没有真正的处理发生不管这些数据是联机存储的还是一个雇员列表作为视图来讲它只是作为一种输出数据并允许用户操纵的方式
模型表示企业数据和业务规则在MVC的三个部件中模型拥有最多的处理任务例如它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库被模型返回的数据是中立的就是说模型与数据格式无关这样一个模型能为多个视图提供数据由于应用于模型的代码只需写一次就可以被多个视图重用所以减少了代码的重复性
控制器接受用户的输入并调用模型和视图去完成用户的需求所以当单击Web页面中的超链接和发送HTML表单时控制器本身不输出任何东西和做任何处理它只是接收请求并决定调用哪个模型构件去处理请求然后再确定用哪个视图来显示返回的数据
V:处理简单的jsp页面(视图)
M:后台的一些Model,处理客户端发送的请求
C:各种各样的action,由C来控制V和M之间的通讯,然后把Model和View的耦合度解开来!(“谁来控制我到哪个视图去”)
通常一般写jsp程序都是jsp请求 servlet 然后servlet返回数据给jsp,对吧?这样的话 servlet中要查询数据库和处理业务逻辑了...
但是呢,这样的话servlet就会乱七八糟的什么代码都有了,对吧?
这个时候,我又想起来MVC模式了 ...jsp 就是天生的展示数据和输入数据用的 ...可以看做MVC的 V。。。。。。。。。。。
servlet呢,这个时候我把在servlet中连接数据库的代码独立出来放到一个java类里面去,servlet只要要调用这个类就直接拿到结果显示给jsp。这样,servlet就变成MVC的 C了,而那个处理数据库的java类就变成MVC的 M了。。。。。。
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,。如果创建被调用者实例的工作不再由调用者来完成,而是由外部容器完成,因此称为控制反转; 创建被调用者 实例的工作通常由外部容器来完成,然后注入调用者,因此也称为依赖注入。下面一个小实例:
定义一个接口
public interface Person { void sayHello(); }
第一个实现类:
public class Chinese implements Person { public void sayHello() { System.out.println("您好 !"); } }
第二个实现类:
public class American implements Person { public void sayHello() { System.out.println("How do you do ."); } }
注意这个类与传统设计有什么区别:该类调用Person子类的方法,传统设计在本类中创造实例,而在此类里并没有创造实例
public class User {
Person p;
public Person getP() {
return p;
}
//使用setter注入
public void setP(Person p) {
this.p = p;
}
//调用person子类重写的sayHello方法,这里的p并没有实例化
public void function(){
p.sayHello();
}
}
外部‘容器’
public class Container{
public static User getBean(){
Person p=new Chinese();
User user = new User();
//由容器‘注入’实例
user.setP(p);
return user;
}
}
测试类:
public class Test{
public static void main(String[] args){
User user = Container.getBean();
user.function();
}
}
//后台输出‘您好’
通过这个例子应该看懂了控制反转,和依赖注入了吧,这个是不是与传统设计相‘反了’。
依赖和耦合(Dependency and Coupling)
如果模块A调用模块B提供的方法,或访问模块B中的某些数据成员(当然,在面向对象开发中一般不提倡这样做),我们就认为模块A依赖于模块B,模块A和模块B之间发生了耦合。那么,依赖对于我们来说究竟是好事还是坏事呢?由于人类的理解力有限,大多数人难以理解和把握过于复杂的系统。把软件系统划分成多个模块,可以有效控制模块的复杂度,使每个模块都易于理解和维护。但在这种情况下,模块之间就必须以某种方式交换信息,也就是必然要发生某种耦合关系。如果某个模块和其它模块没有任何关联(哪怕只是潜在的或隐含的依赖关系),我们就几乎可以断定,该模块不属于此软件系统,应该从系统中剔除。如果所有模块之间都没有任何耦合关系,其结果必然是:整个软件不过是多个互不相干的系统的简单堆积,对每个系统而言,所有功能还是要在一个模块中实现,这等于没有做任何模块的分解。
因此,模块之间必定会有这样或那样的依赖关系,永远不要幻想消除所有依赖。但是,过强的耦合关系(如一个模块的变化会造成一个或多个其他模块也同时发生变化的依赖关系)会对软件系统的质量造成很大的危害。特别是当需求发生变化时,代码的维护成本将非常高。所以,我们必须想尽办法来控制和消解不必要的耦合,特别是那种会导致其它模块发生不可控变化的依赖关系。依赖倒置、控制反转、依赖注入等原则就是人们在和依赖关系进行艰苦卓绝的斗争过程中不断产生和发展起来的。
默认action的作用:项目后面链接输入不正确会链接到指定的默认action里面。
全局标签的作用:把共同或者相同部分抽取出来共享,减少配置的繁杂。(图片实例为抽取出共同的返回结果页面)
extends标签的作用:继承公共的特性,减少配置的繁杂。(例如:权限模块、收银模块、管理员模块都需要一个404页面,用extends继承指定的package(包名)减少配置。)
redirect:action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。可以通过返回结果后面带参数,如下:
如下:
Jsp页面:
Java代码:
Struts.xml配置:
(下面给出的3个例子注意不同之处和区别在哪)
该属性设置Struts2 是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。以下设置参数值可以在struts2-core.jar中org.apache.struts下的default.properties文件中查到
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
Jsp页面:
Java代码:
Struts.xml配置
Jsp页面:
Java代码:
struts.xml配置:
(此种链接要注意大小写)
Jsp页面:
Java代码:
struts.xml配置:
a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法;
b.接收:通过对象的属性接收参数,如:user.getUserName();
c.发送:使用对象的属性传递参数,如:user2!add?user.userName=MGC;
Jsp页面:
发送:使用对象的属性传递参数,如:user2!add?user.userName=MGC;
Java代码:
接收:通过对象的属性接收参数,如:user.getUserName();不需要new)
struts.xm配置
例图:
这种方法是我们开发项目时最为常用的,对于一个属性相对比较对的时候,如果把属性都写到Action中,那会把Acton类弄的很乱,所以属性较多的时候最好选择第二种方式来接收用户输入参数。
在页面中,这个模型对象中的属性可以直接通过属性名来访问(如username),而不需要使用形如“user.username”这种格式的表达式。
这种方法是我们开发项目时最为常用的,对于一个属性相对比较对的时候,如果把属性都写到Action中,那会把Acton类弄的很乱,所以属性较多的时候最好选择此方式来接收用户输入参数。
在action中也不需要为这个模型对象提供JavaBean风格的getter和setter方法。但是必须要在action中进行new操作和实现getModel方法并返回给泛型对象,ModelDriven要使用泛型哦!
Jsp页面:
Java代码:
struts.xml配置
类:
首先UserLoginAction类获取客户端用户发过来的请求信息(name,password。在本类对与客户端交互的某些信息进行封装、setXxx和geXtxx方法),接着UserLoginAction类会调用UserDAO类的checkUser(name,password)方法进行数据库的查找(checkUser方法里会调用DBConn类的getConn()方法进行数据库的加载和连接操作,倘若连接成功,UserDAO.preparedStatement..executeQuery()方法进行语句查找)。把找到匹配的信息赋值给new User(而User里可以通过User.setName(rs.getString(“name”))方法把拿到的信息放到setName方法里。),最后,checkUser方法返回一个User,UserLoginAction类里的execute()方法定义一个User来获取checkUser(name,password)方法返回的User。
标签:
原文地址:http://www.cnblogs.com/sugaradmin/p/5564900.html