首页logo
  •  

jonllen

金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。

个人档案

jonllen
心情闪存 | 给他留言
妮称:jonllen
来自:中国. 湖南. 湘潭
简述:金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。
博客日历

Java和.Net三层架构和MVC

分类:Java

这几天好象发生了很多事情,好象有些憋气,感觉很多事都不顺心,竟然连跑路的想法都有了,也许这就是生活,大大小小总会有那么些的磨砺吧。不管怎么样,都归结自己不够强大。通过最近一段时间的学习,深刻的认识到以前所学知识的局限性。在使用Java的Spring框架的时候,认知到了一些新的编程思想,同时也对它强大的功能为之折服。对比之前编程方式,总结如下:

深入的了解面向对象编程

所谓面向对象变成,相信大家都知道,但我们在写代码是否有这样做呢?比如在实际项目中,我们会对数据库进行一些操作,如果我们对面向对象了解的不够深,就很有可能会局限于以数据库为中心的思路进行编程。拿数据库和实体类来说,它们分别对应物理模型和类图模型,而且之间应该是可以互相转换的,之前我一般会先设计好物理模型生成SQL语句创建数据库,然后在转换生成实体类。而使用Hibernate这个ORM框架,建好实体类后可反向创建数据库表,更精彩的是Java里可以使用注解来标识实体类或属性对应的数据库表或列,通过Spring接管代理后,通过XML配置可在初始化时把实体类同步到数据库表结构,甚至可根据实体对象的关系(如一对多、多对多)自动生成主外建关系,自动创建数据库。

Hibernate实体类(包含ManyToOne和ManyToMany关系,使用@代码注解代替繁杂的XML配置)

@NamedQueries( {
@NamedQuery(name
= "Account.AccountByUuid[load]", query = "from Account as account where account.uuid=?", cacheable = false)})
@Entity
@Table(name
= "FA_Account")
public class Account implements java.io.Serializable{

private static final long serialVersionUID = -6002028996236248727L;

private String uuid;

public void setUuid(String uuid) {
this.uuid = uuid;
}

@Id
@GeneratedValue(generator
= "system-uuid")
@GenericGenerator(name
= "system-uuid", strategy = "uuid")
@Column(name
= "uuid", length = 32, updatable = false, columnDefinition = "VARCHAR(32)")
public String getUuid() {
return this.uuid;
}

@Length(max
= 50,chinese = false)
private String name;

@Length(max
= 50)
@Email
private String email;

//所属部门
private Department department;

//爱好
private Set<Loving> lovings;

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@ManyToOne(fetch
= FetchType.LAZY)
@JoinColumn(name
= "department_uuid")
public Department getDepartment() {
return department;
}

public void setDepartment(Department department) {
this.department = department;
}

@ManyToMany(targetEntity
= Loving.class,fetch = FetchType.LAZY)
@JoinTable(name
= "fa_account_loving", joinColumns = @JoinColumn(name = "account_uuid", referencedColumnName = "uuid"), inverseJoinColumns = @JoinColumn(name = "loving_uuid", referencedColumnName = "uuid"))
@Editor(value
= CollectionEditor.class, params = {
@Param(name
= "collectionClass", value = "java.util.HashSet"),
@Param(name
= "elementClass", value = "com.fortuneage.entity.member.Loving") })
public Set<Loving> getLovings() {
return lovings;
}

public void setLovings(Set<Loving> lovings) {
this.lovings = lovings;
}


}

面向接口编程,依赖注入接口的实例

所谓接口,旨在提供一种约束规范,它要求实现类必须实现接口内所有方法或属性。我们常说的提供一个接口,但其实是提供一个接口的实例,只不过应该是以接口形式返回的,接口类里只有方法或属性的申明,所以我们不必要关注里面的实现,这样可促进各模块的松耦合。Spring里有一种称作控制反转(IOC)的技术,其中很多的地方就是使用接口,先通过容器配置管理一个bean实例(一般为singleton模式),然后再使用set方法或构造函数进行注入实例。

三层架构表现层(MVC)、业务逻辑层、持久层

传统的三层应该是表现层、业务逻辑层、持久层,根据项目需求的不同可能层次会更细分,但一般应该保证有这三层的明确分工,如下图:

三层结构图

但这里应该跟MVC三层区分开来,因为MVC应该是表现层一层,拿Struts来说,M(Model)应该是Action Form,V(View)应该是jsp页面,C(Control)应该是Struts Action。而如果使用Spring框架的话,当然也可以把Struts整合在一起,但Spring本身有提供DispatcherServlet控制分发器,可以直接把请求交给指定类处理,并可以根据不同URL参数响应不同方法,加上可以使用@代码注解,所以很方便实用。Spring同时还能整合Hibernate,构成目前JavaWeb开发领域最流行的框架SSH,Spring在其中冲当着控制管理的核心作用,详细流程如下图所示:

SSH结构图

相比Java,.Net则是本身提供了一个强大的平台,在表现层,aspx页面则是属于View,aspx.cs相当于每个页面的控制层Control,依赖于.Net里强大的服务器控件,很容易在cs里控制aspx页面输出的内容,一般直接可以很方便通过控件ID获取值,因此View在到Control层前很少对Model进行填充转换,不过到持久化写入数据库还是依赖Model实体,因此Model层转换还是必须的,但目前我还没有用过.Net自动转换Model层的框架。

使用观察着模式、面向切面(AOP)编程

标签:Java MVC
  • posted@ 2010-01-30 16:55
  • update@ 2010-02-05 00:44:41
  • 阅读(13670)
  • 评论(4)

相关文章

评论
1楼 文夕 2010-02-05 19:24:04
在我看来,会编程的人都是天才~
2楼 su389847531 2011-03-04 13:33:15
麻烦问下这篇文章的最后一幅图中的实体代表什么?为什么有那么多箭头是指向实体的?而且为什么数据不是双向的读写呢?箭头都是单向的?谢谢:)
回复:谢谢提醒。这里的实体应该代表填充表现层页面视图的Model对象,每一层之间传递的参数Bean对象,因此每一层几乎都依赖于实体。(2011-03-04 13:42:14)
3楼 su389847531 2011-03-04 21:19:48
那图中的箭头代表什么意思呢?是说模块间的依赖关系还是操作关系?还是单纯的数据流向?
回复:算是依赖关系吧,表现层、业务层、持久层这三层应为自上而下的弱依赖关系。(2011-03-06 21:49:51)
4楼 su389847531 2011-03-06 19:34:23
为什么我的内容一直在审核中呢?我想问问题,还是那幅图中的箭头代表什么呢?操作流程?依赖关系?还是数据流程?谢谢
回复:因为我设置了评论要审核回复后才显示。(2011-03-06 21:50:49)
发表评论
*必填
回复通知我
*必填

博文推荐