




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Etmvc学习文档etmvc框架介绍如今的Java Web开发对于需求来说已经变得过于复杂。当今众多Java领域的Web开发框架不仅使用复杂,而且并没有很好的遵循Dont Repeat Yourself(DRY)原则。之前看过struts, spring mvc, ror, grails等框架,其中最欣赏ror了,struts的灵活性对于多数中小型项目而言显得对于多余。特别是在AJAX如此盛行的今天,现有的框架对AJAX的支持显得不足。于是,萌生了开发一套简易框架的念头,再后来就有了现在的etmvc。一、什么是etmvc?etmvc是一套轻量级简易高效的WEB开发框架,严格遵循MVC的思想。et一词源于1982年斯皮尔伯格执导的一部温馨科幻片E.T.(外星人),意思就是来自外星人的,不受束缚的MVC,开发者可以快乐地做WEB开发,而不受传统的烦杂折磨。二、etmvc框架定位我们给这个框架的定位如下: 简易:代码要简单,开发要容易。约定优于配置,再也没有XML的配置之苦。 性能:在满足功能的前提下尽量地提高性能。 实用:没有太多花哨的东西,一切从实用的角度考虑。三、授权协议etmvc框架采用LGPL授权。四、etmvc框架的组成etmvc框架包括mvc和一个可选的orm实现,可选的orm实现是一个ActiveRecord框架,独立于mvc,可以在非WEB的应用程序中使用。五、etmvc框架的安装1 获取最新的框架:从本站获取最新的etmvc框架。2 建立WEB项目,将下载的压缩文件解压至项目的/WEB-INF/lib目录中。3 配置数据库,在/WEB-INF/classes目录中建立数据库连接配置文件perties, 配置示例: 源码复制打印3 domain_base_class=com.et.ar.ActiveRecordBase 3 3 com.et.ar.ActiveRecordBase.driver_class=com.mysql.jdbc.Driver 3 com.et.ar.ActiveRecordBase.url=jdbc:mysql:/localhost/mydb 3 com.et.ar.ActiveRecordBase.username=root 3 com.et.ar.ActiveRecordBase.password=soft123456 3 com.et.ar.ActiveRecordBase.pool_size=2 4 配置/WEB-INF/web.xml,添加一个过滤器,配置示例: 源码复制打印4 4 etmvc 4 com.et.mvc.DispatcherFilter 4 4 controllerBasePackage 4 controllers 4 4 4 viewBasePath 4 /views 4 4 4 4 etmvc 4 /* 4 5 建立保存视图模板的目录/views。六、etmvc框架的基本概念6 controller:控制器是属于请求范围的,用于处理请求,创建或者准备响应。每次请求都会创建一个控制器实例,控制器的类名必须以Controller结尾,一般整个应用程序会创建一个控制器的基类ApplicationController,然后具体的其它控制器再继承之。7 action:每个URL操作将映射到一个action上,一个action是一个控制器的方法,一个控制器可以管理彼此相关的多个action。一个控制器中标准的action命名参考: o index: 默认的动作o show:显示动作o create:新建动作o save:保存动作o edit:修改动作o update:更新动作o destroy:删除动作8 model:模型,是一个数据实体,将对应到具体的数据表中,这种映射关系是通过ActiveRecord实现的。所以数据表中的字段名就是模型对象中的属性名,不再需要用XML配置描述了。9 view:视图,etmvc支持多种视图,甚至一个action多视图,最常用的视图是JspView,在AJAX应用中是JsonView,下载处理二进制数据时是BinaryView,等等。 七、Hello,World之旅OK,现在我们开始Hello,World之旅,请参阅Hello,World经典示例。关于etmvc的配置 etmvc遵循“约定优于配置”的原则,通过文件的命名及存放位置来代替显式的配置,避免编写烦杂的XML配置文件。etmvc的配置只有一处,即在web.xml中配置一个filter,如下所示:源码复制打印1 2 etmvc 3 com.et.mvc.DispatcherFilter 4 5 controllerBasePackage 6 controllers 7 8 9 viewBasePath 10 /views 11 12 13 plugin 14 plugin.OcrServer 15 16 17 18 etmvc 19 /* 20 其中,filter的初始参数有三个:controllerBasePackage, viewBasePath, plugin,说明如下:1、controllerBasePackage是控制器的基包名称,如controllers,所有的控制器类必须在controllers包中,或者在controllers的子包中。控制器类必须以Controller结尾,必须继承Controller,比如有如下的控制器类:源码复制打印21 package controllers; 22 23 public class ArticleController extends ApplicationController 24 public View showImage(int id) throws Exception 25 /. 26 27 28 public View download(int id) throws Exception 29 /. 30 31 32 public void create() 33 34 35 36 控制器包名是controllers,控制器类名是ArticleController,有showImage等Action方法。2、viewBasePath是存放视图模板的位置,如下所示: 视图模板的目录结构有一定的规则,在viewBasePath目录下是控制器名称(小写),再往下是对应每个Action方法的视图文件。如ArticleController控制器中的方法create对应到/article/create.jsp视图文件,即执行控制器的create方法后,etmvc根据执行的结果找到对应的视图进行渲染。3、plugin是插件的配置,一般情况下无须用到,所以不用配置该项,关于插件的使用留到后面的章节再作介绍。好了,etmvc需要作的配置就这些,是不是很简单。Hello,World经典示例 我们利用etmvc来建立一个Hello,World的WEB应用程序。一、首先,建立新的WEB项目,引入et-mvc.jar和paranamer-1.3.jar,配置web.xml,加入一个过滤器,如下所示:源码复制打印1 2 etmvc 3 com.et.mvc.DispatcherFilter 4 5 controllerBasePackage 6 controllers 7 8 9 viewBasePath 10 /views 11 12 13 14 etmvc 15 /* 16 我们看到,过滤器com.et.mvc.DispatcherFilter目前只有二个参数,controllerBasePackage指的是控制器的包名,viewBasePath指的是视图模板的存放目录。二、接下来,我们开始编写控制器HelloController,一般我们会编写控制器基类ApplicationController,我们的HelloController会继承它。注意到,控制器的包名是controllers,这就是前面配置中的controllerBasePackage配置值。源码复制打印17 package controllers; 18 19 import com.et.mvc.Controller; 20 21 public class ApplicationController extends Controller 22 23 源码复制打印24 package controllers; 25 26 import com.et.mvc.TextView; 27 28 public class HelloController extends ApplicationController 29 public TextView say() 30 return new TextView(hello,world); 31 32 3、 至些,我们的Hello,World程序编写完毕,部署后在浏览器地址栏输入http:/localhost:8080/helloworld/hello/say,将会输出hello,world字样。理解并使用控制器我们举个简单的例子说明一下从浏览器发送请求到服务器处理完请求返回信息给浏览器的过程。1、浏览器发出http:/localhost:8084/myweb/user/list这个请求,服务器将从这个URL分析出如下信息:myweb:上下文路径信息User:控制器信息list:动作信息2、服务器根据这个信息查找控制器UserController中的list方法,并执行之。3、服务器将查找名称是list.jsp的视图并将处理结果传递到视图,完成渲染过程。整个处理过程简单来说就是这样。每个请求都会创建新的控制器实例,控制器的类名必须以Controller结尾,必须继承Controller类,比如ApplicationController, HelloController等,控制器的Action方法允许继承,我们一般都会创建一个根控制器,然后让其他控制器统一继承这个根控制器。每个控制器允许有多个Action操作,这些操作将映射到相应的URL上。比如有如下的控制器:源码复制打印1 public class UserController extends ApplicationController 2 public void create() 3 4 5 public View save(User user) throws Exception 6 7 8 public void login(String name, String password) throws Exception 9 10 11 public void logout() throws Exception 12 13 将相应的URL 映射到控制器的Action方法上:URLAction方法/user/createcreate/user/savesave/user/loginlogin/user/logoutlogout至此,我们看到编写控制器处理WEB请求就是这样简单。控制器的Action方法接受不同的参数,这些参数将自动绑定到Request的参数,方法可以返回不同的类型,比如void, String, JsonView, BinaryView等,etmvc将据此确定处理后以何种视图返回。下面我们以一个用户登录的例子来说明控制器的一般用法:1、建立控制器,如下所示:源码复制打印14 package controllers; 15 16 public class UserController extends ApplicationController 17 public void login() 18 19 20 21 public String handleLogin(String username, String password) throws Exception 22 return 你输入的用户: + username + 密码: + password; 23 24 我们定义了二个Action方法,一个是login,该方法返回值是void,系统默认将寻找/views/user/login.jsp的视图进行显示,另一个是handleLogin,该方法将简单地将用户登录信息显示出来。2、我们来建立login.jsp视图:源码复制打印25 form action= method=POST 26 用户名: 27 密码: 28 29 我们看到FORM中的action的URL指向,这个URL将映射到我们控制器中的handleLogin方法,而该方法将返回String类型,etmvc将其解释了文本视图,所以将会在浏览器上显示登录的信息。启动浏览器,在地址栏上输入http:/localhost:8080/test1/user/login,将显示如下页面:输入用户名、密码然后点击提交按键,将显示: Action方法和控制器环境当请求到达时,etmvc将创建控制器对象,控制器对象会查找与“被请求的action”同名的public实例方法。如此看来,控制器的Action方法是允许被继承的。如果你希望某些方法不被作为action调用,可以将其声明为protected或者private。比如有如下的控制器:源码复制打印1 public class BlogController extends ApplicationController 2 public String show() 3 return show method; 4 5 6 protected String create() 7 return create method; 8 9 当访问/blog/show时将输入框“show method” ,而访问/blog/create时将有“The requested resource (/test1/blog/create) is not available”的信息。Action方法允许使用控制器环境提供的一些对象: request response session servletContext controllerPath controllerName actionPath flash exception他们的作用应该不言自明,其中flash对象有使用方法我们将分出一个主题专门作介绍。关于etmvc的视图 我们来探讨etmvc如何使用视图,前面关于“Action方法”的介绍中我们提到,每个请求将会映射到一个Action方法。etmvc将根据Action方法的返回类型来决定使用何种视图,大体有以下三种:1 返回void时将使用JSP视图。2 返回String时将字符串直接输出至浏览器。3 返回View或其子类时将使用对应的视图。下面我们来分别说明,如有如下的action方法:源码复制打印4 public class UserController extends ApplicationController 5 public void test1() 6 request.setAttribute(hello, hello,test1); 7 8 action方法“test1”的返回类型是void,这时etmvc将其解释为JSP视图,将会查找/views/user/test1.jsp的文件,文件内容:源码复制打印9 10 Hello World! 11 $hello 12 运行http:/localhost:8080/test2/user/test1将会输出“hello,test1”。我们来编写返回类型是String的action方法:源码复制打印13 public class UserController extends ApplicationController 14 public String test2() 15 return hello,test2; 16 17 这时会将返回字符串“hello,test2”直接输出至浏览器。如果返回类型是View或其子类型,则etmvc会使用其定义的视图,如下所示: 源码复制打印18 public class UserController extends ApplicationController 19 public JspView test3() 20 JspView view = new JspView(); 21 view.setAttribute(hello, hello,test3); 22 return view; 23 24 25 public JspView test4() 26 JspView view = new JspView(/common/other.jsp); 27 view.setAttribute(hello, hello,test4); 28 return view; 29 30 上面例子中test3使用默认的JSP视图位置和目录/user/test3.jsp,而test4使用指定的视图位置和目录/common/other.jsp。我们现来看个JsonView的例子,JsonView能够处理多种数据结构,能够将其正确地转换成客户端需要的JSON串,这在AJAX 的开发中非常有用,同EXTJS整合时也会很容易,如下所示:源码复制打印31 public class UserController extends ApplicationController 32 public JsonView test5() 33 Map result = new HashMap(); 34 result.put(success, true); 35 result.put(msg, hello,test5); 36 JsonView view = new JsonView(result); 37 view.setContentType(text/html;charset=utf-8);/允许指定ContentType 38 return view; 39 40 上面 例子运行结果将向浏览器输出msg:hello,test5,success:true。我们来总结一下,etmvc目前支持的视图包括:41 JspView42 TextView43 FreeMarkerView44 BinaryView45 JsonViewORM-ActiveRecord基础 etmvc中访问数据可以使用JDBC,HIBERNATE等,鉴于JDBC的烦琐和HIBERNATE的复杂,我们同时提供了一个ORM的简易实现版本ActiveRecord。在大多数中小型WEB系统中,使用ActiveRecord就足够了。1、使用前须将et-ar.jar, asm.jar, cglib.jar等包引入项目,然后进行配置perties:domain_base_class=com.et.ar.ActiveRecordBasecom.et.ar.ActiveRecordBase.driver_class=com.mysql.jdbc.Drivercom.et.ar.ActiveRecordBase.url=jdbc:mysql:/localhost/mydbcom.et.ar.ActiveRecordBase.username=rootcom.et.ar.ActiveRecordBase.password=soft123456com.et.ar.ActiveRecordBase.pool_size=2在上面配置中我们配置了MYSQL数据库连接,配置文件perties放在CLASSPATH能找到的地方就好。2、我们来建立一张数据表:源码复制打印1 create table users( 2 id int primary key auto_increment, 3 name varchar(10) default null, 4 addr varchar(50) default null, 5 email varchar(50) default null, 6 remark varchar(50) default null 7 ) 然后建立对应的域对象:源码复制打印8 Table(name=users) 9 public class User extends ActiveRecordBase 10 Id private Integer id; 11 Column private String name; 12 Column private String addr; 13 Column private String email; 14 Column private String remark; 15 /get,set. 16 我们的域模型对象继承自ActiveRecordBase,到些,ORM就建立完成了,我们看到,不需要复杂的配置文件,仅用几个简单的注解就完成了。3、基本的CRUD操作增加记录:源码复制打印17 User user = new User(); 18 user.setName(name1); 19 user.setAddr(addr1); 20 user.setEmail(); 21 user.save(); 修改记录:源码复制打印22 User user = User.find(User.class, 3); 23 user.setRemark(user remark); 24 user.save(); 删除记录:源码复制打印25 User user = User.find(User.class, 3); 26 user.destroy(); 查询记录:源码复制打印27 List users = User.findAll(User.class); 28 for(User user: users) 29 System.out.println(user.getName(); 30 条件查询:源码复制打印31 List users = User.findAll(User.class, addr like ?, new Object%百花路%); 32 for(User user: users) 33 System.out.println(user.getName(); 34 我们看到,借助ActiveRecord,操作数据是如此容易。ActiveRecord中同时访问多个数据库 我们先来看一下ActiveRecord(下简称AR)的基本配置:源码复制打印1 domain_base_class=com.et.ar.ActiveRecordBase 2 3 com.et.ar.ActiveRecordBase.driver_class=com.mysql.jdbc.Driver 4 com.et.ar.ActiveRecordBase.url=jdbc:mysql:/localhost/mydb 5 com.et.ar.ActiveRecordBase.username=root 6 com.et.ar.ActiveRecordBase.password=soft123456 7 com.et.ar.ActiveRecordBase.pool_size=2 其中的配置项domain_base_class是我们域模型对象的基类,我们在定义模型类时必须让其继承ActiveRecordBase,AR将根据此找到对应的数据库连接。如果我们想同时使用多个数据库,这时我们可以先定义二个基类:源码复制打印8 public class Base1 extends ActiveRecordBase 9 10 public class Base2 extends ActiveRecordBase 11 然后进行配置:源码复制打印12 domain_base_class=models.Base1 models.Base2 13 14 models.Base1.driver_class=com.mysql.jdbc.Driver 15 models.Base1.url=jdbc:mysql:/localhost/mydb1 16 models.Base1.username=root 17 models.Base1.password=soft123456 18 models.Base1.pool_size=2 19 20 models.Base2.driver_class=com.mysql.jdbc.Driver 21 models.Base2.url=jdbc:mysql:/localhost/mydb2 22 models.Base2.username=root 23 models.Base2.password=soft123456 24 models.Base2.pool_size=2 我们只要让我们的模型类继承Base1或Base2,就能正确使用对应的数据库连接。如果那一天又要改回去连接一个数据库了,只要改一下这个perties属性文件就OK了。AR中同时访问多个数据库时是不是很简单。ActiveRecord中的关联 我们在ActiveRecord(下简称AR)中提供一对一、一对多、多对一等关联,分述如下:1、一对多:一对多关联是指一个类(比如Author)拥有另一个类(比如Book)的多个实例,用HashMany注解描述:源码复制打印1 Table(name=authors) 2 public class Author extends ActiveRecordBase 3 Id private Integer id; 4 Column private String name; 5 6 HasMany(foreignKey=authorId, dependent=DependentType.DELETE, order=id) 7 private List books; 8 /get,set. 9 源码复制打印10 Table(name=books) 11 public class Book extends ActiveRecordBase 12 Id private Integer id; 13 Column private Integer authorId; 14 Column private String name; 15 16 BelongsTo(foreignKey=authorId) 17 private Author author; 18 /get,set.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出血时间与凝血时间课件
- 2025年标准合同范本
- 2025存量房买卖合同协议书范本(标准版)
- 出口业务培训课件
- 2025塑钢门窗销售代理合同
- 2025合同样本:加盟合作协议书典范
- 2025简易租房合同范本
- 货物运输合同规定细则
- 音乐制作合同
- 智慧能源互联网:推动全球能源转型升级的关键支撑
- 2022年成都隆科城乡发展集团有限公司招聘笔试试题及答案解析
- 物业公司水电费收费表
- 商场撤场申请书
- 教育评价学全套ppt课件完整版教学教程
- 基础有机化学:第2章 饱和烃
- 五年级英语阅读理解(20篇)
- 台州方言百余年来的语音变化阮咏梅
- 《中华人民共和国民法典》知识竞赛考试
- T∕CPSS 1007-2021 公用交流电网稳态电能质量综合指标评估方法
- 风电项目升压站土建工程安全文明二次策划施工技术措施
- 小学美术课件-第4课诱人的水果-广西版(26张PPT)ppt课件
评论
0/150
提交评论