`
lookdd1
  • 浏览: 47942 次
  • 性别: Icon_minigender_1
  • 来自: 日照
文章分类
社区版块
存档分类
最新评论
阅读更多
这篇帖子的内容我本来想发到 http://www.iteye.com/topic/806660这里的主贴里去的,想挽回被隐藏的命运,但我写完本贴的内容,却发现为时已晚。好吧,我承认,上一个贴的标题容易引发口水,这次我们实事求是,从代码出发,通过一个小例子较完整的介绍play!framework的开发过程:

就拿play!framwork自带的房间预订(booking)的例子吧:

1、 下载play  解压,配置环境变量
2、 打开命令行:转到合适的目录,输入Play new booking   这样,项目即生成完毕。
3、     进入项目目录中,执行play eclipsify  或者play netbeansify  这样即可将生成的项目导入到eclipse或者netbeans中。

打开项目目录我们可以看到:


解释下各个目录:
  •   app 包含所有的model,controller以及view(模板)。
  •   conf下是一个application.conf 配置文件。 
  •   lib是Play依赖的第三方jar。
  •   logs是日志 
  •   public下包含你引用的js,css以及,images等。
  •   test下所有的测试文件在此。


  这样的一个目录显然与传统的JEE目录完全不一样,事实上,它已经摒弃了servlet,jsp那些东西,而完全自己实现了HTTP,您会问,那它是不是无法正常运行于标准的servlet容器中,请不要担心,我们在开发完成后可以使用命令play war –odir  这个命令生成可以正常运行于servlet容器中的项目目录。
  Play分为开发模式和生产模式两种,而切换的配置在application.conf中:
  Application.mode=dev 生产模式请改为:prod
  主要区别在于开发模式中您无需重启server,每次请求都会查看是否有文件发生改变,改变即编译,这对于传统Java EE开发人员无疑是相当敏捷的。而这种方式同样会导致性能下降,所以生产模式中就不会这样了,而是采用预编译机制。
 
  下面开始coding:
  按照OO的开发模式 首先编写模型层:
  在app包下新建类Hotel.java 继承Model ,如下:
 
@Entity
  public class Hotel extends Model {
    
    @Required
    public String name;
    public String address;
    public String city;
    
    …..省略部分字段

    @Column(precision=6, scale=2)
    public BigDecimal price;

    public String toString() {
        return "Hotel(" + name + "," + address + "," + city + "," + zip + ")";
    }
    
   }

   其中继承Model基类实现了一个富血的Domain Model(这不是比传统的PO更加OO ?),完全基于JPA,上手非常简单

   同样Booking类:
  
   @Entity
   public class Booking extends Model {
    
    @Required
    @ManyToOne
    public User user;
    
    @Required
    @ManyToOne
    public Hotel hotel;
    
    @Required
    @Temporal(TemporalType.DATE) 
    public Date checkinDate;
    
    @Required
    @Temporal(TemporalType.DATE)
    public Date checkoutDate;
    
    @Required(message="Credit card number is required")
    @Match(value="^\\d{16}$", message="Credit card number must be numeric and 16 digits long")
    public String creditCard;
    
    @Required(message="Credit card name is required")
    public String creditCardName;
    public int creditCardExpiryMonth;
    public int creditCardExpiryYear;
    public boolean smoking;
    public int beds;

    public Booking(Hotel hotel, User user) {
        this.hotel = hotel;
        this.user = user;
    }
   
    public BigDecimal getTotal() {
        return hotel.price.multiply( new BigDecimal( getNights() ) );
    }

    public int getNights() {
        return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / 1000 / 60 / 60 / 24;
    }

    public String getDescription() {
        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
        return hotel==null ? null : hotel.name + 
            ", " + df.format( checkinDate ) + 
            " to " + df.format( checkoutDate );
    }

    public String toString() {
        return "Booking(" + user + ","+ hotel + ")";
    }

    }


   User类 类似,不再给出。

   编写Controller  在controller包中编写类:Hotels  继承Controller(这儿Application继承Controller)
   
   public class Hotels extends Application {
    @Before//拦截器
    static void checkUser() {
        if(connected() == null) {
            flash.error("Please log in first");
            Application.index();
        }
    }
    public static void index() {
        List<Booking> bookings = Booking.find("byUser", connected()).fetch();//这句是不是更加面向对象?
        render(bookings);
    }

    public static void list(String search, Integer size, Integer page) {
        List<Hotel> hotels = null;
        page = page != null ? page : 1;
        if(search.trim().length() == 0) {
            //分页的代码是不是很简单?链式调用更加方便
            hotels = Hotel.all().fetch(page, size);
        } else {
            search = search.toLowerCase();
            hotels = Hotel.find("lower(name) like ? OR lower(city) like ?", "%"+search+"%", "%"+search+"%").fetch(page, size);
        }
        
        render(hotels, search, size, page);
    }
    
    public static void book(Long id) {
        Hotel hotel = Hotel.findById(id);
        render(hotel);
    }
    
    public static void confirmBooking(Long id, Booking booking) {
        Hotel hotel = Hotel.findById(id);
        booking.hotel = hotel;
        booking.user = connected();
        validation.valid(booking);
        
        // Errors or revise
        if(validation.hasErrors() || params.get("revise") != null) {
            render("@book", hotel, booking);
        }
        
        // Confirm
        if(params.get("confirm") != null) {
            booking.save();
            flash.success("Thank you, %s, your confimation number for %s is %s", connected().name, hotel.name, booking.id);
            index();
        }
        
        // Display booking
        render(hotel, booking);
    }
        
    public static void saveSettings(String password, String verifyPassword) {
        User connected = connected();
        connected.password = password;
        validation.valid(connected);
        validation.required(verifyPassword);
        validation.equals(verifyPassword, password).message("Your password doesn't match");
        if(validation.hasErrors()) {
            render("@settings", connected, verifyPassword);
        }
        connected.save();
        flash.success("Password updated");
        index();
    }
    
}


   上面的代码中展示了
1.@before 这个注解基本就是个拦截器的意思,所有访问这个Controler方法的请求都会先执行@before方法。
2、controller中的几个作用域:
  • 1、session这儿的session只支持您放里面放String类型,而不是和传统JEE中任何对象都可以放到session中。这儿的session和rails的类似。
  • 2、flash 跨请求的存储对象 
  • 3、params  基本相当于request.getParameters();
  • 4、renderArgs  渲染到模板的数据,上面代码中您看到的render里面的就是放到了这个renderArgs里面了。还有个validation存放验证数据。

  基类Controller里定义了很多好用的方法:如果您想使用ajax返回JSON,则使用renderJSON()  play使用的json序列化工具是gson.jar,您想返回一个文件流,使用renderBinary(File f,String name)方法。
  上面没有展示文件上传的代码:我再贴一个文件上传的代码:
  
  public static void save(Picture picture,File pic){
	
        File uploadFile=new    File(Play.applicationPath.getAbsoluteFile()+”/public/uploads”); 
	play.libs.Files.copy(pic,uploadFile);
	picture.url =path;
	picture.save();
	QZ_Admin.pictures();
}


  其它的Controller不再给出

  这儿会有同学问,我没有配置和URL映射规则啊。事实上,play借鉴rails默认大于配置的思想,默认的映射规则是/Controller/method?params  这种。当然您也可以在配置文件routes中重新设定您所需要的映射规则。同时模板的位置默认也和Controller的名字有很大关系,比如这人我们Controller的名字叫Hotels  方法名是Index  那如果您不指定渲染模板的话默认play会去views 下面的Hotels文件夹下找index.html模板。这种约定是不是限制了很多东西?会不会对开发造成一些影响,我个人认为是有的,由于和Controller,method的名字关系密切,这需要你良好的规划,以保证你的项目目录的合理,以及URL的优雅。

   最后是编写模板:
   在views  下面建立文件夹 Hotels  新建文件index.html

  
   #{extends 'main.html' /}///在views文件夹下面编写main.html一般为网站所有页面的公共部分,比如header和footer
   #{set title:'Search' /}//为每一个页面设置title  在Main.html有变量title
    <table>
       <thead>
           <tr>
               <th>Name</th>
               <th>Address</th>
               <th>City, State</th>
               <th>Check in</th>
               <th>Check out</th>
               <th>Confirmation number</th>
               <th>Action</th>
           </tr>
       </thead>
       <tbody>
           #{list bookings, as:'booking'}  //遍历
               <tr>
                   <td>${booking.hotel.name}</td>
                   <td>${booking.hotel.address}</td>
                   <td>${booking.hotel.city},${booking.hotel.state}, ${booking.hotel.country}</td>
                   <td>${booking.checkinDate.format('yyyy-MM-dd')}</td>
                   <td>${booking.checkoutDate.format('yyyy-MM-dd')}</td>
                   <td>${booking.id}</td>
                   <td>
                        #{a @cancelBooking(booking.id)}Cancel#{/a}
                   </td>
               </tr>
           #{/list}
       </tbody>
   </table>


  这样,一个简单的模板页面就编写完成了。Play的模板相较于jsp或者JSTL以及struts2标签啥的都更加简单,也没有freemarker 空指针异常(可能有童鞋喜欢这个)这些问题。具体其它的用法可以参看play的帮助文档。


以上基本上就把play的大体用法说完了,现在我再写下play其它让人心动的地方:
1、 缓存支持:
2、	public static void showProduct(String id) {
3、	    Product product = Cache.get("product_" + id, Product.class);
4、	    if(product == null) {
5、	        product = Product.findById(id);
6、	        Cache.set("product_" + id, product, "30mn");
7、	    }
8、	    render(product);
9、	}


而您可以使用EhCache或者Memcached作为缓存的实现。使用起来非常方便

2、 JOB支持:
3、	@Every("1h")
4、	public class Bootstrap extends Job {
5、	    
6、	    public void doJob() {
7、	        List<User> newUsers = User.find("newAccount = true").fetch();
8、	        for(User user : newUsers) {
9、	            Notifier.sayWelcome(user);
10、	        }
11、	    }
12、	    
13、	}

这段代码即会每1小时运行一次。

3、 Email支持:
4、	Template t =TemplateLoader.load("UserCenter/mailTemplate.html");//邮件模板  
5、	Scope.RenderArgs templateBinding = Scope.RenderArgs.current();  
6、	templateBinding.put("url","http;//url"));  
7、	String result =t.render(templateBinding.data);        
8、	Mail.send("from@163.com", "to@163.com", "",result,"text/html")  

以上即是使用模板发送邮件的例子。当然您需要在application.conf指定发邮件的一些参数

4、非常多的好用的module:比如支持lucene的search-module ,MongoDB module,GAE module,Excel Module,GWT Module,PDF Module等等。


以上大体介绍了play!framework的开发示例以及一些基本特点。大家可以讨论下你对Play!framework看法,但请勿鄙视一把走人,或者发表带有人身攻击的言论,谢谢!






  • 大小: 23 KB
分享到:
评论
39 楼 yuan 2010-11-10  
downpour 写道
你在让别人睁大眼睛看世界之前,先要证明你所谓的充血模型的正确性。不要一个外国人放个屁就当成圣旨了。

我觉得很简单,贫血模型把数据和行为分离的做法跟OO是相违背的。如果要说OO是放屁……我还没到讨论这个话题的水平,溜。
38 楼 mathgl 2010-11-10  
logicgate 写道
yangguo 写道
易卡螺丝君 写道
没有mixin 不支持元编程的单根继承 就是在自寻死路


盲目mixin就是盲目迷信,才是真的自寻死路。
C++er,请你们到csdn去自我感觉良好。


人家是rubyer.
metaprogramming用起来极爽,可以开发出非常强大的框架。


那mixin 和 c++里面的multiple inheritance 类似的东西。。不过这玩意在c++里面也不是都用。。

也就在qt里面用得比较多....其他的时候 更多是作为interface来处理的。
37 楼 kyfxbl 2010-11-10  
downpour 写道

随意随意,你们这群人,除了会忽悠人以外,什么都不会。决不再参与类似的讨论。无聊之极。


这人水平普普通通,自我感觉倒是非常良好。最后还要做出“哥不陪你们玩了”的高姿态,其实一个人也没说服。真不知道他在得瑟个啥?
36 楼 kyfxbl 2010-11-10  
downpour 写道

1. 我对play的static的理解是没有问题的,对于Controller或者是数据Model中是否应使用static方法,从来就有公论,不需要我在这里多做解释了。充血模型是Robbin提出为了加深大家对不同数据模型的理解,并不是一种正确的编程模式。一个面向对象的语言中,对象所拥有的操作范畴应始终保持在维护对象自身的状态而不是参杂任何的业务模式。多写几个应用程序的同学都会理解这才是Java的最佳实践。

2. 对象的生命周期的管理在rails里面也是有的。在Java世界,没有容器管理对象的生命周期几乎不现实,这是Java语言的特征决定的。你硬要说什么新时代,该消亡,我只能说你写的程序还太少,连这点基本的最佳实践都不明白。


这位大哥挺能忽悠啊,至少得是个项目经理吧。要不就是领导,不推理不解释,句句是结论。

那您能给我们扫扫盲,说说为啥“没有容器管理对象的生命周期几乎不现实”吗?请正面回答,相信以您的表达能力,应该是毫无压力
35 楼 store88 2010-11-10  
zdmcjm 写道
lookdd1 写道
zdmcjm 写道
lookdd1 写道
zdmcjm 写道
# @Before//拦截器 
#  static void checkUser() { 
#      if(connected() == null) { 
#          flash.error("Please log in first"); 
#          Application.index(); 
#      } 
#  } 

那是不是每一个controller都要写一个这方法?假设我需要每一个controller都需检查用户是否登录,和用户的当前角色是否有权限操作controller中的某个方法。
我知道servlet过滤器可以实现,但在play这种基于静态方法的controller模型中,怎么实现?



您可以写一个公共的controller然后其它所有controller继承它


这种承继是有问题的,诸如在子controller中,有些方法需要检查权限,有些方法不需要检查就很别扭了。


恩。 所以还有个module叫secure  可以用这个搞定。


用注解的方式,问题更大。权限直接写死,并且注解四处分散,每个方法都得加上注解,比继承更严重,还不如用继承。
但是,静态方法,能继承吗?
就算你自己写个注解做到灵活处理,也得费九牛二虎之力。


权限用判断请求的url路径来实现的话,其实工作量跟用其它框架差不多的,可以做到对绝大多数controller适用。
只要是方法,不管的静态还是动态,当然能继承
再说controller一般不会再去继承其它类吧
既然是controller老老实实做controller就好了
play比其它java mvc框架,更多滴采用了rest,rails的coc思想
我看着很好呀
34 楼 抛出异常的爱 2010-11-10  
downpour 写道
liusong1111 写道
to downpour: 老兄真得如yuxie所说“睁眼看看广大的世界吧。。”,rails里没有对象生命周期的概念,充血模型也如yuxie所说。而且,很多东西,本质上跟面向对象和静态语言扯不上任何关系,那只是java语言的限制。


你在让别人睁大眼睛看世界之前,先要证明你所谓的充血模型的正确性。不要一个外国人放个屁就当成圣旨了。

不用说充血模型,就光是普通的往对象中加方法的模式,就在大型生产实践中无法适应,更加别说加上了你们所谓的充血。

一群只懂得理论,完全不顾实践的人,真是对牛弹琴。

你是在说DAO么
如果你把数据库看作dao的属性池.
dao是个非常好用的面向对象的例子.

service 如果把dao看作含有数据结构的属性.
也是非常好的面向对象的例子.

角度不同而已.

如果你不想把数据扔到库里的话
在pojo里多写几个方法.没事的.
33 楼 downpour 2010-11-10  
liusong1111 写道
to downpour: 老兄真得如yuxie所说“睁眼看看广大的世界吧。。”,rails里没有对象生命周期的概念,充血模型也如yuxie所说。而且,很多东西,本质上跟面向对象和静态语言扯不上任何关系,那只是java语言的限制。


你在让别人睁大眼睛看世界之前,先要证明你所谓的充血模型的正确性。不要一个外国人放个屁就当成圣旨了。

不用说充血模型,就光是普通的往对象中加方法的模式,就在大型生产实践中无法适应,更加别说加上了你们所谓的充血。

一群只懂得理论,完全不顾实践的人,真是对牛弹琴。
32 楼 downpour 2010-11-10  
yuxie 写道
downpour 写道


1. 我对play的static的理解是没有问题的,对于Controller或者是数据Model中是否应使用static方法,从来就有公论,不需要我在这里多做解释了。充血模型是Robbin提出为了加深大家对不同数据模型的理解,并不是一种正确的编程模式。一个面向对象的语言中,对象所拥有的操作范畴应始终保持在维护对象自身的状态而不是参杂任何的业务模式。多写几个应用程序的同学都会理解这才是Java的最佳实践。

2. 对象的生命周期的管理在rails里面也是有的。在Java世界,没有容器管理对象的生命周期几乎不现实,这是Java语言的特征决定的。你硬要说什么新时代,该消亡,我只能说你写的程序还太少,连这点基本的最佳实践都不明白。


1、大师,你连面向对象的基本概念都没搞清,别搞什么公论不公论了。充血模型是Robin提出的?老马听这话该吐血了。。。。去翻翻真正的公论《企业应用架构模式》吧,看看充血模型是谁提的,什么才是正确的编程模式。。

PS:八卦一下,即使在JE,先引出充血模型的也是T1老大,不是肉饼。

2、rails哪来的微容器管理声明周期?愿闻其详。。俺怎么看的rails程序都不用呢。恁老才没写过几天程序吧,看到个几年前的概念就当最佳实践了。。睁眼看看广大的世界吧。。其他的语言不管是类不类Java的,微容器管理生命周期的做法压根就没有。很简单的对象非要从容器里拿出来,闲着没事。。


随意随意,你们这群人,除了会忽悠人以外,什么都不会。决不再参与类似的讨论。无聊之极。
31 楼 night_stalker 2010-11-10  
C/C++ 程序静态数据区大小有限制,所以有 static 内容太多会把栈空间压小的说法。
但是 java 程序里写多少 static 关系不大的,static 内容往往不存在静态数据区而是驻留在 perm gen 里 …… 另外 C/C++ 程序也是可以调栈大小的 ……

java 可以做元编程但是繁琐得要命,所以,就和不能元编程没什么区别。
30 楼 liusong1111 2010-11-10  
to downpour: 老兄真得如yuxie所说“睁眼看看广大的世界吧。。”,rails里没有对象生命周期的概念,充血模型也如yuxie所说。而且,很多东西,本质上跟面向对象和静态语言扯不上任何关系,那只是java语言的限制。
29 楼 logicgate 2010-11-10  
yangguo 写道
易卡螺丝君 写道
没有mixin 不支持元编程的单根继承 就是在自寻死路


盲目mixin就是盲目迷信,才是真的自寻死路。
C++er,请你们到csdn去自我感觉良好。


人家是rubyer.
metaprogramming用起来极爽,可以开发出非常强大的框架。
28 楼 yuxie 2010-11-10  
downpour 写道


1. 我对play的static的理解是没有问题的,对于Controller或者是数据Model中是否应使用static方法,从来就有公论,不需要我在这里多做解释了。充血模型是Robbin提出为了加深大家对不同数据模型的理解,并不是一种正确的编程模式。一个面向对象的语言中,对象所拥有的操作范畴应始终保持在维护对象自身的状态而不是参杂任何的业务模式。多写几个应用程序的同学都会理解这才是Java的最佳实践。

2. 对象的生命周期的管理在rails里面也是有的。在Java世界,没有容器管理对象的生命周期几乎不现实,这是Java语言的特征决定的。你硬要说什么新时代,该消亡,我只能说你写的程序还太少,连这点基本的最佳实践都不明白。


1、大师,你连面向对象的基本概念都没搞清,别搞什么公论不公论了。充血模型是Robin提出的?老马听这话该吐血了。。。。去翻翻真正的公论《企业应用架构模式》吧,看看充血模型是谁提的,什么才是正确的编程模式。。

PS:八卦一下,即使在JE,先引出充血模型的也是T1老大,不是肉饼。

2、rails哪来的微容器管理声明周期?愿闻其详。。俺怎么看的rails程序都不用呢。恁老才没写过几天程序吧,看到个几年前的概念就当最佳实践了。。睁眼看看广大的世界吧。。其他的语言不管是类不类Java的,微容器管理生命周期的做法压根就没有。很简单的对象非要从容器里拿出来,闲着没事。。
27 楼 抛出异常的爱 2010-11-10  
易卡螺丝君 写道
结论就是与其邯郸学步rails 不如直接用rails

静态语言特性决定了 模仿rails的框架都是画虎类犬

rails的哪些东西模仿起来会比较 痛苦呢?

1.全栈式的MVC框架

2.约定优于配置


3.更少的代码

4.生成器

5.零周转时间

6.支架系统
26 楼 易卡螺丝君 2010-11-10  
结论就是与其邯郸学步rails 不如直接用rails

静态语言特性决定了 模仿rails的框架都是画虎类犬
25 楼 downpour 2010-11-10  
yuxie 写道
downpour 写道
linliangyi2007 写道
楼主不怕jvm的栈溢出啊~~~,如此疯狂的static

CURD是很爽了,MIS也不错,感觉很有凌乱美!!

看似牛叉,也充满风险。


基本上能够说getter和setter方法无用的人,是不在乎static满天飞的,也无需考虑任何设计模式。

其实JavaBean的规范的创立,给了我们一种公共的无入侵的方式实现很多编程模式。这也是Spring等开源框架存在的基础。Play之流直接全部静态化了,那我们也不需要什么容器来管理对象的生命周期了,因为这些概念都将不复存在。

因此,我一贯坚持静态语言就是静态语言,动态语言就是动态语言,把2者混着来就是吃饱了撑的没事干。


1、Play的Static你的理解有误,它并非全部静态化仅出现在需要的地方,即Controller里边和Model的公共方法里。这些地方完全不需要继承复写等特性。如果您有疑问可以去看它的例子。作为一种充血模型的实现,Play其实是非常推荐非Static方法的。

2、对象生命周期真的那么重要?rails为啥没对象生命周期的管理呢,.net为啥没有这个也活得好好地呢,c++为啥没这个照样活得风生水起?spring的容器在面向接口编程和贫血模型的时候非常有用,在新的时代,该消亡的就让它消亡吧。


1. 我对play的static的理解是没有问题的,对于Controller或者是数据Model中是否应使用static方法,从来就有公论,不需要我在这里多做解释了。充血模型是Robbin提出为了加深大家对不同数据模型的理解,并不是一种正确的编程模式。一个面向对象的语言中,对象所拥有的操作范畴应始终保持在维护对象自身的状态而不是参杂任何的业务模式。多写几个应用程序的同学都会理解这才是Java的最佳实践。

2. 对象的生命周期的管理在rails里面也是有的。在Java世界,没有容器管理对象的生命周期几乎不现实,这是Java语言的特征决定的。你硬要说什么新时代,该消亡,我只能说你写的程序还太少,连这点基本的最佳实践都不明白。
24 楼 lookdd1 2010-11-10  
易卡螺丝君 写道
yangguo 写道
易卡螺丝君 写道
没有mixin 不支持元编程的单根继承 就是在自寻死路


盲目mixin就是盲目迷信,才是真的自寻死路。
C++er,请你们到csdn去自我感觉良好。



我只是说有 到你嘴里就程盲目了 这语文水平 真实让人叹为观止



拜托各位童鞋,请表吵架.....说说你们结论是怎么得来的对我们小白更有好处 
23 楼 易卡螺丝君 2010-11-10  
yangguo 写道
易卡螺丝君 写道
没有mixin 不支持元编程的单根继承 就是在自寻死路


盲目mixin就是盲目迷信,才是真的自寻死路。
C++er,请你们到csdn去自我感觉良好。



我只是说有 到你嘴里就程盲目了 这语文水平 真实让人叹为观止
22 楼 yangguo 2010-11-10  
易卡螺丝君 写道
没有mixin 不支持元编程的单根继承 就是在自寻死路


盲目mixin就是盲目迷信,才是真的自寻死路。
C++er,请你们到csdn去自我感觉良好。
21 楼 lookdd1 2010-11-10  
fkpwolf 写道
心动地方比如cache,job, email,这个跟框架核心没有啥关系吧,用不用都可以。

框架得有亮点,得轻量级,不要那种功能堆砌的框架


这就和spring一样啊。spring的核心是IoC 和AOP 。而它作为粘合剂的作用也是让人津津乐道的。它让使用第三方库更加简单。Play 的这些功能也只是集成的第三方的库。
20 楼 fkpwolf 2010-11-10  
心动地方比如cache,job, email,这个跟框架核心没有啥关系吧,用不用都可以。

框架得有亮点,得轻量级,不要那种功能堆砌的框架

相关推荐

    Learning Play!Framework 2

    ### 学习Play! Framework 2 的核心知识点 #### 一、Play! Framework 2 概述 Play! Framework 2 是一个用于构建现代 web 应用程序的高性能、轻量级框架。它由 Java 和 Scala 支持,并且特别强调开发者的生产力。...

    play framework api,play! framework api,play api

    在描述中提到的"play framework api,play! framework api,play api"都是指Play Framework的API文档,它包含了框架的所有公共类、方法和接口,供开发者在编写代码时查阅和引用。API文档是理解框架工作原理、学习如何...

    play!framework框架——japid源码

    **Play! Framework框架与Japid源码解析** 在软件开发领域,使用高效的框架可以极大地提升开发效率和代码质量。Play! Framework是一个流行的Java Web应用程序框架,它采用模型-视图-控制器(MVC)架构模式,支持敏捷...

    play!framework_api

    一个优于RoR的快速开发框架playframework,完全面向对象,基于jvm的REST框架,文档非常少,上手很容易,从名字上可以看出play就是玩,可以当作游戏一样轻松的玩的框架,这是它的API文档,网页格式.

    让Play!Framework运行在OpenShift上

    NULL 博文链接:https://modun.iteye.com/blog/1595857

    Play Framework2本教程

    Play Framework2是一个强大的Java和Scala应用开发框架,它以其简洁的API、快速的开发周期以及对Web标准的紧密集成而闻名。本教程旨在为初学者和有经验的开发者提供全面的指导,帮助他们掌握Play Framework2的核心...

    play1-maven-test-projects:玩! Framework 1.x Maven插件-测试项目

    在本例中,"play1-maven-test-projects"是一个针对Play! Framework 1.x版本的Maven插件测试项目。 Play! Framework是一个开源的应用程序框架,用于快速开发基于Java和Scala的Web应用。它提供了模型-视图-控制器...

    LearningPlayFramework2.pdf 英文原版

    Learning Play Framework 2

    playframework中文教程.zip

    Play Framework 是一个开源的Web应用框架,主要针对Java和Scala开发者设计,它的核心理念是简化开发流程,提高开发效率,并且特别强调了RESTful架构风格。这个“playframework中文教程.zip”压缩包很可能是为了帮助...

    Play Framework Cookbook.pdf

    ### Play Framework Cookbook 知识点解析 #### 一、Play Framework 概览 - **框架简介**:Play Framework 是一个开源的 Web 开发框架,基于 Java 和 Scala 编程语言。它采用轻量级、非阻塞的服务端架构,特别适合...

    Play framework框架

    Play Framework框架 Play Framework框架是一种基于Java的软件框架,旨在提高开发效率和提供REST式的架构风格。该框架可以让开发者继续使用他们喜欢的开发环境或繻库,不需要切换到另一种语言、IDE或者其他繻库。 ...

    Play-Framework-ElasticSearch-Module

    对于使用Play! Framework 1.1.1或更早版本的开发者,安装过程分为两步: 1. **模块安装**:通过Play的模块仓库安装elasticsearch模块。 ``` play install elasticsearch ``` 2. **配置添加**:在`conf/...

    play,play framework资料大全

    其次,是《对play!的CRUD的一次改造MyCRUD.java》。CRUD(创建、读取、更新、删除)是任何数据库驱动的应用程序中最基本的操作。这个文件可能是展示如何在Play Framework中自定义和优化这些操作的一个示例。开发者...

    play1-maven-plugin:玩! Framework 1.x Maven插件

    Framework 1.x版本的构建工具,它使得在Maven环境下管理、构建和部署Play!应用变得更加便捷。Maven是一个广泛使用的Java项目管理工具,它通过XML配置来管理项目依赖、构建过程以及发布工件。将Play! Framework与...

    play framework2.01 part1

    play framework2.01上半部分。

    对play!的CRUD的一次改造

    对play!的CRUD 进行改造,改代码还会持续重构,并不完善。 1.将create,show,delete,list都改成@Util方法,可以类似 public static void show(String id){ MyCRUD.show(id); } 的方式调用。更通用。 2.增加@...

    Play Framework

    1. Play Framework 介绍 2. 创建和发布 Play 应用 2.1 创建 Play 的工程 2.2 Play 常用指令 2.3 Play 应用的 JVM 调优 3. 如何读取静态资源 4. Play框架的配置文件 5. 使用 Play 框架开发 Java 应用 5.1 HTTP...

Global site tag (gtag.js) - Google Analytics