play framework2 教程框架刷屏如何实现

Play Framework系列之一如何搭建一个play 框架的spring体系
日期: 14:05:23
来源:ITeye
Play Framework系列之一如何搭建一个play 框架的spring体系
四年前,从spring mvc框架转移到play framework框架完全是为了更快,更好的去创业,那时候由于spring mvc配置的臃肿,以及不堪忍受tomcat研发时的加载,一度想去转向php开发,但很难舍弃对java的热爱,无意中发现了play framework,让我眼前一亮,随即花了一两天时间对它进行深入的研究,发现它就是我理想中想要的java框架,即满足我的灵活配置,同时可以抛弃tomcat以及又可以部署发布在多平台与tomcat里。一直这样坚持下来用了四年,也一直在用1.2.x版本,也觉得这个版本最稳定,2.0之上的版本完全已经不是java风格了。
2 框架搭建
我喜欢把MVC体系架构分成三个系统来设计,M我会用数据系统来代替,V我会用业务系统来代替,而C我喜欢我接口系统来替代,虽然这样开发会加大工作量,其实对于熟练的人来说,这工作量可以忽略不计,但是这有一个很大的好处在于未来平台的扩展以及业务的清晰与了解,开发的纯粹与质量。
3 数据系统配置
首先搭建一个play框架项目,结合mybatis与spring,手动加载spring1.0.3在本地的moduels里。
在dependencies.yml文件里配置
- org.mybatis -& mybatis 3.1.1
- org.mybatis -& mybatis-spring 1.1.1
- com.jolbox -& bonecp 0.7.1.RELEASE
- play -& spring 1.0.3
在application.conf文件末尾加载spring配置
# The spring module
module.spring=${play.path}/modules/spring-1.0.3
ponent-scan=true
ponent-scan.base-packages=models
play.spring.add-play-properties=false
数据库连接设置
public class BoneCPDataSourceFactoryBean implements FactoryBean&BoneCPDataSource&, InitializingBean{
private BoneCPDataSource boneCPDataS
public final static int DEFAULT_POOL_MAX_SIZE = 30;
public final static int DEFAULT_POOL_MIN_SIZE = 10;
public BoneCPDataSource getObject() throws Exception {
return boneCPDataS
public Class&?& getObjectType() {
return BoneCPDataSource.
public boolean isSingleton() {
public void afterPropertiesSet() throws Exception {
boneCPDataSource = new BoneCPDataSource();
boneCPDataSource.setJdbcUrl(Play.configuration.getProperty("db.url"));
boneCPDataSource.setUsername(Play.configuration.getProperty("db.user"));
boneCPDataSource.setPassword(Play.configuration.getProperty("db.pass"));
boneCPDataSource.setDriverClass(Play.configuration.getProperty("db.driver"));
boneCPDataSource.setMaxConnectionsPerPartition(getIntValue("db.pool.maxSize", DEFAULT_POOL_MAX_SIZE));
boneCPDataSource.setMinConnectionsPerPartition(getIntValue("db.pool.minSize", DEFAULT_POOL_MIN_SIZE));
public int getIntValue(String config, int defalutValue){
String value = Play.configuration.getProperty(config );
if(!StringUtils.isEmpty(value)){
defalutValue = Integer.parseInt(value);
}catch (Exception e) {
return defalutV
内部数据系统与业务系统之间通信采用rmi,所以在application.conf配置
#rmi服务的端口号设置。
bsd.rmi.server.host=localhost
bsd.rmi.server.port=1100
创建rmi服务类
public class BsdRmiServiceExporter extends RmiServiceExporter {
public void afterPropertiesSet() throws RemoteException {
System.setProperty("java.rmi.server.hostname ", Play.configuration.getProperty("bsd.rmi.server.host"));
super.afterPropertiesSet();
创建application-context.xml文件配置rmi与mybatis
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&
&property name="locations"&
&value&classpath:application.conf&/value&
&/property&
&bean id="dataSource" class="common.jdbc.datasource.BoneCPDataSourceFactoryBean" /&
&tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" /&
&!-- Transaction manager for a single JDBC DataSource --&
&bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="dataSource" /&
&!-- SqlSessionFactory --&
&bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&
&property name="dataSource" ref="dataSource" /&
&property name="configLocation" value="classpath:mybatis/configuration.xml"&&/property&
&property name="mapperLocations" value="classpath:models/model/mapper/*.xml" /&
&bean id="bsdRmiServiceExporter" class="common.rmi.BsdRmiServiceExporter"&
&property name="serviceName" value="bsdRmiService" /&
&property name="service" ref="bsdRmiService" /&
&property name="serviceInterface" value="models.rmi.BsdRmiService" /&
&property name="registryPort" value="${bsd.rmi.server.port}" /&
4 业务系统配置
创建业务工厂类
public class RmiService {
public static BsdRmiService getBsdRmiService()
return (BsdRmiService)play.modules.spring.Spring.getBean("bsdRmiService");
在application.conf里配置rmi接收端口
rmi.base.url=rmi://localhost:1100
配置rmi文件application-context.xm
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&
&property name="locations"&
&value&classpath:application.conf&/value&
&/property&
&bean id="bsdRmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"&
&property name="serviceUrl" value="${.rmi.base.url}/bsdRmiService" /&
&property name="serviceInterface" value="models.rmi.BsdRmiService" /&
&property name="lookupStubOnStartup" value="false" /&
&property name="refreshStubOnConnectFailure" value="true" /&
5 接口系统配置
play framework是一个非常好做接口的框架,特别是restful以及http等,仅仅只需要renderJSON 就可以发布一个http接口出去。
发布GET或者POST接口,只需要在routes文件里配置即可,这里不再详细描述
后面我会抽时间写一些工作阶段遇到的问题及解决办法,写这些也是记录这么多年的工作经验,让笔记留住它。
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
本节课视频: 『阿男的Java泛型讲座』*15*将类型转化成Reifiable Type 本节课代码: import java.util.*;/** * Created by weli on 5/27/16. */public class NonReifiableToReifiable { interface FooT { T bar(); } static class StringTypedFoo implements FooString { public String bar() { return nu
* 通过反射获取类属性的类型
* @author test
*/ public class OtherTest {
private static int i = 1; private static String name = "wang";
public static void main(String[] args) throws Exception {
System.out.println(OtherTest.class.getDeclar
说明: Java oo的相关知识实在是太多了,这里介绍一些基础的和对应知识点提示。
概述: 1、类和对象
Java万物皆是对象,旨在将世界中的概念模拟到计算机程序中,它将现实世界中的所有事物视为对象。 对象的描述是通过特征和行为来描述的,特征是对事物的静态描述,行为是对事务的动态描述。 对应到程序中就是特征就是属性(成员变量)和行为就是方法。 多个对象具有的相同特征和行为,我们将这样的特征和行为抽象出来,形成一个新的单元,这个单元称作是类。 类是具有相同属性和共同行为的一组对象的抽象集合。 类是
导入dom4j.jar包 该包需要你去下载。 创建xml文件 XMLWriter writer =// 声明写XML的对象 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8");// 设置XML文件的编码格式 String filePath = "F://student.xml";//保存xml文件路径 File file = new File(filePath); Documen
#pid /var/run/nginx.
worker_processes 8;
worker_rlimit_nofile 100000;
worker_connections 2048;
# log_format
'$remote_addr - $remote_user [$time_local] "$request" '
1.windows: 修改tomcat/bin/catalina.bat 在 set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% 这行下面前面加上 JAVA_OPTS='-Xms512m -Xmx1024m'JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=256m" 其中 -Xms512m -Xmx1024m 是设置Tomcat使用的内存的大小. -XX:PermSize=64M -XX:Ma
判断字符串“学习”是否包含在字符串“好好学习,天天向上”中。 public class Test {public static void main(String[] args) {String a = "好好学习,天天向上";String b="学习";if(a.contains(b)){ System.out.println("包含其中");;}else{System.out.println("不包含");}}}
lamda 是Java8中增加的一个新特性。lamda表达式语法很简单,使用- 将参数列表和表达式体分割开来。
(Type1 param1, Type2 param2, ..., TypeN paramN) - { //do somthing}
(int x,int y)- x+y
等价于 (int x,int y)-{x+y;}
如果有一个列表[1,2,3,4,5,6] 需要遍历并打印出来,如果不是用lamda表达式实现方式如下:
需求:混淆一个jar包的所有的私有属性和方法。 -keep class * {pubpubl} //最关键的一行-optimizations !code/allocation/variable//如果不加会报错,因为这是官方的一个BUG.搞了我好长时间.md/* java.lang.ClassFormatError: LVTT entry for 'a' in class file ×× does not match any
Problem D Accepts: 2042 Submissions: 5880 度熊所居住的 D 国,是一个完全尊重人权的国度。以至于这个国家的所有人命名自己的名字都非常奇怪。一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字。例如,如果一个人名字是 ACM,那么 AMC, CAM, MAC, MCA, 等也都是这个人的名字。在这个国家中,没有两个名字相同的人。 度熊想统计这个国家的人口数量,请帮助度熊设计一个程序,用来统计每一个人在之前被统计过多少次。 I
Copyright (C)
ITfish.net评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
第一章 J2EE (基础)
第二章 J2EE(高级)Play 2.0之上 框架 - Web前端当前位置:& &&&Play 2.0之上 框架Play 2.0之上 框架&&网友分享于:&&浏览:0次Play 2.0以上 框架
数据库是整个站点的数据储藏室。用户提交的数据可以存储在数据库中,以便未来使用。Play可以通过JDBC和数据库通信。我讲介绍Play和mysql数据库的连接。
Play 2.*版本的默认操作数据库的方式是通过Ebean。Play提供Finder这一帮助类型,可以实现一些简单的数据库查询。
数据库准备
在mysql中增加数据库testing。增加用户"player",密码为"player"。为用户player增加适当的权限。
CREATE DATABASE testing DEFAULT CHARACTER SET utf8;
CREATE USER 'player'@'localhost' IDENTIFIED BY 'player';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON testing.* TO 'player'@'localhost';
为了在Play中使用mysql数据库,需要在conf/application.conf中增加设置:
# Database configuration
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://127.0.0.1:3306/testing"
db.default.user="player"
db.default.password="player"
# Ebean configuration
ebean.default="models.*"
还需要修改build.sbt为:
name := "test"
version := "1.0-SNAPSHOT"
libraryDependencies ++= Seq(
javaEbean,
"mysql" % "mysql-connector-java" % "5.1.18"
play.Project.playJavaSettings
上面的改动完成后,使用play run来运行服务器。
下面,我在模型中增加一个实体(entity),即一个Person类。放入models/Person.java
import java.util.L
import javax.persistence.E
import javax.persistence.Id;
import play.db.ebean.M
import play.db.ebean.Model.F
public class Person extends Model {
public static Finder&Integer,Person& find =
new Finder&Integer,Person&(Integer.class, Person.class);
public static List&Person& findAll() {
return find.all();
public static Person findByName (String name) {
return find.where().eq("name", name).findUnique();
Person类继承自Model类,,从而说明它是模型中的一个实体。实体有两个场,整数的id和字符串的name,用来保存数据。
@id注解下,id将不为空,不重复,并自动增加。
Person还有一个静态的场find。find是Play提供的Finder类型,用于数据库查询。而Person类中得findAll()和findByName()的静态方法中,就调用了find,从而在数据库中查询条目。
Play有evolution模块,管理数据库的表。写好Person.java后,访问项目。Play这时会生成在mysql中建立表格的脚本。运行该脚本即可。
增加数据库条目
增加一个动作。这个动作向数据库增加条目:
public static Result addPerson() {
Person p1 = new Person();
Person p2 = new Person();
p1.name = "vamei";
p2.name = "play";
p1.save();
p2.save();
return ok("Saved");
*** 上面的代码要import models.Person。
将/addPerson这一URL对应该动作。访问后,数据库将增加条目:
练习 根据表单一讲的内容,增加一个向数据库添加条目的表单。
数据库查询
我可以在动作中调用刚才定义的查询方法findAll()和findByName(),比如增加allPerson()动作:
public static Result allPerson() {
List&Person& persons = Person.findAll();
return ok(views.html.personList.render(persons));
上面查询得到的Person类型的表,传递给模板views/personList.scala.html:
@(personList: List[models.Person])
&!DOCTYPE html&
@for(person &- personList) {
&li&@person.name&/li&
修改routes,增加对应的URL为/allPerson,页面如下:
事实上,我也可以在动作中直接调用Person.find,来组成查询语句。这将让动作内部有更大的查询自由度。比如上面的动作可以改写成:
public static Result allPerson() {
List&Person& persons = Person.find.all();
return ok(views.html.personList.render(persons));
我首先创建一个模板,纯粹起视图功能。在app/views文件夹中,新建文件index.scala.html (如果已有,则删除并重新创建)。
&!DOCTYPE html&
&title&Play&/title&
&p&Hello World! Start using the Template.&/p&
这个模板是个纯粹的html文件,是最简单的模板形式。
修改app/controllers/Application.java:
import play.*;
import play.mvc.*;
public class Application extends Controller {
public static Result index() {
return ok(views.html.index.render());
ok()中接收的是views.html.index.render(),实际上就是app/views/index.scala.html这一模板的render()方法。Play会根据模板,自动生成相应的类。
*** 也可以用import引入views.html.index,而不是使用完整的类路径。
访问页面:
这一部分,我把对象作为参数传给模板,然后在模板中显示对象中包含的数据。修改index.scala.html:
@(title: String, content: String)
&!DOCTYPE html&
&title&@title&/title&
&p&@(content) Start using the template.&/p&
上面的第一行,,说明了该模板所接收的两个参数,即String类型的title和content。在模板中,,来调用参数。参数名周围可以用括号"()",以区分正文。
修改动作:
public static Result index() {
return ok(views.html.index.render("Play", "Hello World! Parameters passed. "));
这里传递两个字符串给模板。最终显示的结果中,两个字符串将填充在模板中的适当位置。
上面把一个对象传递给模板。我们还可以在模板中调用对象的属性或方法:
@object.method()
@object.field
我还可以用Scala的语法,在模板中实现更复杂的逻辑。比如下面的模板中使用循环:
@(title: String, content: String, lines: List[String])
&!DOCTYPE html&
&title&@title&/title&
&p&@(content) Start using the template.&/p&
@for(line &- lines) {
&li&@line&/li&
@后面不仅可以是一个对象,还可以是一个完整的Scala语法。
修改动作,把一个字符串类型的表作为参数传递给模板:
import play.*;
import play.mvc.*;
import java.util.L
import java.util.ArrayL
public class Application extends Controller {
public static Result index() {
List&String& lines = new ArrayList&String&();
lines.add("a");
lines.add("b");
lines.add("c");
return ok(views.html.index.render("Play", "Hello World!", lines));
得到下面的页面:
模板中还可以有if选择结构,比如
@if(item) {
&p&True&/p&
&p&False&/p&
根据参数item的真假,if结构显示不同的内容。
在@* *@中加入注释
,为了在模板中显示"@"字符,需要使用@@。
表 3. 模板中可用的动态元素
用来对一个表达式进行求值。如 ${note.title} 的值是领域对象 note 的属性 title 的值。
@{...} 和@@{...}
用来生成调用控制器中动作方法的 URL,可以用在页面的链接中。@{...} 和 @@{...} 生成的分别是相对 URL 和绝对 URL。如 &a href="@{Application.index()}"& 首页 &/& 生成一个指向首页的链接。
用来显示经过国际化之后的消息内容。
用来添加注释。如 *{ 这是注释 }*。
用来添加复杂的 Groovy 脚本,可以声明变量和添加语句。
用来调用 Play 框架的或是开发人员自定义的标签。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Play Framework 框架教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Play Framework 框架教程
上传于||暂无简介
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩48页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 play framework2 教程 的文章

 

随机推荐