精华内容
下载资源
问答
  • Play框架入门使用

    2021-02-12 14:35:29
    Play框架入门使用Play是一个开源高性能Web框架,能够基于Java或Scala编写可扩展可伸缩的应用系统,它能自动刷新源码的变动从而具有快速开发产品的能力,它还是一个无态非堵塞的框架,易于横向扩展。Play!框架有如下...

    Play框架入门使用

    Play 是一个开源高性能Web框架,能够基于Java或Scala编写可扩展可伸缩的应用系统,它能自动刷新源码的变动从而具有快速开发产品的能力,它还是一个无态非堵塞的框架,易于横向扩展。

    Play!框架有如下特点:

    高开发效率:Java EE和Spring框架并不适合快速原型开发,Play框架参考动态语言的快速开发能力,它支持热重载所有的Java代码和模板等,让你更快地迭代。基于Netty构建非堵塞异步机制。

    REST JSON 支持:非常容易编写RESTful应用,非常适合支持HTTP路由。

    本教程将向您展示这两个特点。

    安装

    首先确认安装了Java环境,下载最新版本Play binary package,注意不是Typesafe Activator。

    将解压后的Play目录加入环境,windows是在环境设置中,如同Java一样加入path,Linux是:

    export PATH=$PATH:/relativePath/to/play

    检查是否正常安装:

    play help

    出现如下界面表示正常:

    850201f2f2630247f38d42ce50cd6859.png

    创建一个新的应用

    在命令行输入,将提示你应用名称,然后选择创建Scala还是Java应用程序。

    $ play new myFirstApp

    通过下面命令启动自己的应用:

    $ cd myFirstApp

    $ play

    当出现[myFirstApp] $ 表示已经进入play控制台。

    标准PLAY项目结构

    app                      → 应用源码

    └ assets                → 编译后的 asset资源源码

    └ stylesheets        →CSS sources

    └ javascripts        → CoffeeScript sources

    └ controllers           → 应用控制器

    └ models                → 应用业务层

    └ views                 → Templates模板

    conf                     → 配置其他非编译资源(on classpath)

    └ application.conf      → 主配置文件

    └ routes                → 路由定义

    public                   → 公共资源assets

    └ stylesheets           → CSS files

    └ javascripts           → Javascript files

    └ images                → Image files

    project                  → sbt 配置文件

    └ build.properties      → Marker for sbt project

    └ Build.scala           → Application build script

    └ plugins.sbt           → sbt plugins

    lib                      → 未管理的库包依赖

    logs                     → Standard logs folder日志

    └ application.log       → Default log file

    target                   → Generated 编译产生的文件

    └ scala-2.10.0

    └ cache

    └ classes            → Compiled class files

    └ classes_managed    → Managed class files (templates, ...)

    └ resource_managed   → Managed resources (less, ...)

    └ src_managed        → Generated sources (templates, ...)

    test                     → source folder for unit or functional tests

    play控制台

    前面已经进入我的第一个应用控制台,键入

    $ help play

    获得帮助,运行命令如下:

    $ run

    在这种模式下,服务器将被启用自动重载功能启动,Play将检查您的项目,需要重新编译源代码。如果需要该应用程序会自动重新启动。

    当出现:

    [info] play - Listening for HTTP on /0.0.0.0:9000

    (Server started, use Ctrl+D to stop and go back to the console...)

    表示启动服务器在9000端口,在浏览器键入http://localhost:9000/ 看到:

    Your new application is ready

    这是在项目app/controller目录下有一个Application.scala:

    package controllers

    import play.api._

    import play.api.mvc._

    object Application extends Controller {

    def index = Action {

    Ok(views.html.index("Your new application is ready."))//改为中文

    }

    }

    我们将输出改为中文:“这是我的项目.”

    编译

    Crtl-D回到控制台中断运行,输入:compile,出现如下错误:

    [info] Compiling 1 Scala source to E:\temp\myFirstApp\target\scala-2.10\classes.

    ..

    [error] IO error while decoding E:\temp\myFirstApp\app\controllers\Application.s

    cala with UTF-8

    [error] Please try specifying another one using the -encoding option

    [error] one error found

    [error] (compile:compile) Compilation failed

    [error] Total time: 1 s, completed 2013-12-8 14:49:44

    这个错误是Play将我们的模板文件翻译转换为Scala文件在目录myFirstApp\target\scala-2.10\src_managed\main\views\html下面,这些文件将被sbt 编译成.class文件,然后被play运行。SBT以默认的编码方式创建这些中间文件。

    解决办法:设置环境JAVA_TOOL_OPTIONS为-Dfile.encoding=UTF8

    然后重新再进入Play控制台,会看到picked up输出:

    E:\temp>cd myFirstApp

    E:\temp\myFirstApp>play

    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

    使用Eclipse

    输入$eclipse,将我们的项目生成Eclipse项目,打开Eclipse导入即可。注意,eclipse的windows->preference-->General -->Workspace要设置为Utf-8,如下:

    a969da00b4d0ae9fa1c45db141eddb0d.png

    编译正常后,再次运行,浏览器出现:

    ee1e0830df81ed33362ea697f92c1733.png

    Eclipse Scala插件

    在http://scala-ide.org下载Eclipse的Scala插件。在eclipse -->install new software输入升级地址,会有很多,选择Scala IDE for scala.

    应用案例

    下面我们使用Play的WebServices library实现非堵塞的URL调用:

    import play.api.mvc.{Controller, Action, Result}

    import play.api.libs.ws.WS

    import play.api.libs.json.Json

    import play.api.libs.concurrent.Execution.Implicits._

    import scala.concurrent.Future

    object Race extends Controller {

    def index() = Action {

    Async {

    val start = System.currentTimeMillis()

    def getLatency(r: Any): Long = System.currentTimeMillis() - start

    val googleTime = WS.url("http://www.google.com").get().map(getLatency)

    val yahooTime = WS.url("http://www.yahoo.com").get().map(getLatency)

    val bingTime = WS.url("http://www.bing.com").get().map(getLatency)

    Future.sequence(Seq(googleTime, yahooTime, bingTime)).map { case times =>

    Ok(Json.toJson(Map("google" -> times(0), "yahoo" -> times(1), "bing" -> times(2))))

    }

    }

    }

    }

    这是统计调用三个网址的时间,通过异步获得统计结果。将这个Race加入Route:

    GET /race controllers.Race.index()

    cf8b6656a7b3b4431509411400222fa3.png

    这是因为我们没有导入import play.api.libs.json.Json

    重新运行,正常结果如下:

    race.png

    调试

    输入$ play debug ,进入调试JPDA 模式。输出:

    Listening for transport dt_socket at address: 9999

    在Eclipse的debug configuration中,新增:

    playd1.png

    然后我们在Race的 val start = System.currentTimeMillis() 设置断点,运行run,在浏览器调用,Eclipse将自动在断点暂停,如下:我们可以跟踪当前的变量等。

    1b1f851f4bf91718898d550706f4acf0.png

    展开全文
  • 最近,在基于Play框架的项目中需要连接Mysql数据库。在这个过程中遇到了一些问题。在此,把它记录下来。首先,Play框架和Mysql连接有两种方式,这两种方式都是在application.conf文件中践行配置。第一种,简单的方式...

    最近,在基于Play框架的项目中需要连接Mysql数据库。在这个过程中遇到了一些问题。在此,把它记录下来。

    首先,Play框架和Mysql连接有两种方式,这两种方式都是在application.conf文件中践行配置。

    第一种,简单的方式是增加如下配置:

    db=mysql://username:password@host/databasename

    第二种方式,配置比较全面,如下:

    db = mysql

    db.url=jdbc:mysql://host:3306/test

    db.driver=com.mysql.jdbc.Driver

    db.user = username

    db.pass = passwrod

    我在连接的过程中,使用的是第一种方式,接下来就是建立实体类,进行操作。

    但是,我在操作的过程中,每次保存以后在查询,可以查询到保存的记录,但是项目重启以后,发现数据库表并没有被新建,查找时,也没有上次插入的数据。

    查找资料发现,play框架默认使用了Hibernate的实现,因此,需要在application.conf中配置:

    hibernate.hbm2ddl.auto = update

    其中,其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。其值可以设置为create,create-drop,update,validate,其具体含义如下:

    create:

    每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

    create-drop :

    每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

    update:

    最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但

    表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。

    validate :

    每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

    在这个过程中,遇到的另外一个问题就是,在建了实体类,访问已有的数据库表,读取数据时,遇到了如下错误:

    fb15e7d73ebb9c1a4e1e4f5f8ce954e1.png

    原来是已有的数据中timestamp类型的原因,参考网上的建议,新增mysql配置,得到如下连接方式:

    db=mysql://username:password@host/databasename?zeroDateTimeBehavior=convertToNull

    但是,在访问时依然遇到错误:

    Database error

    A database error occured : Cannot connected to the database, The connection property 'zeroDateTimeBehavior' only accepts values of the form: 'exception',

    'round' or 'convertToNull'. The value 'convertToNull?useUnicode=yes' is not in this set.

    查阅资料,参考spring的配置的方式,将play连接mysql的方式再修改为如下所示,成功的解决了问题:

    db=mysql://username:password@127.0.0.1/test2?zeroDateTimeBehavior=convertToNull&

    最大感悟就是,作为新人,肯定会遇到很多问题,但是遇到问题不要怕,要多查阅资料,多问,总会有解决问题的办法。

    展开全文
  • play 框架返回 json 类型的数据,和 java 的区别较大。之前碰到了 model 转 json 结果为空的情况,这里做下简单的记录,供后来查询使用。 项目中,使用 slick 作为 FRM 框架集成方式。 问题 slick 查询返回的 model ...

    前言

    play 框架返回 json 类型的数据,和 java 的区别较大。之前碰到了 model 转 json 结果为空的情况,这里做下简单的记录,供后来查询使用。
    项目中,使用 slick 作为 FRM 框架集成方式。

    问题

    slick 查询返回的 model 实体类,需要转换为 json。

    解决办法

    方式一:通过 fastjson 转换。

    通过 Alibaba 的 fastjson 来进行转换的话,需要额外使用 @BeanProperty 来注解所有字段,自动生成 get 和 set 方法,并且多个实体类不能放在同一个 class 中。这是由于 fastjson 是使用 java 的 get set 方法来获取字段的, scala 的 get 和 set 方法不同于 java 。
    个人觉得使用 @BeanProperty 注解所有字段太麻烦了,寻找是否有一种更加优雅的方式,将 model 转为 json。

    方式二:通过 play 自带的 Json 来转换。 推荐方式

    首先,需要在返回类的伴生对象中,定义隐式转换。

    
     导包:import play.api.libs.json._
     
     定义隐式转换:
    implicit val format: Format[Company] = Json.format[Company]
    
    

    然后就可以在 controller 中,使用 Ok(Json.toJson(slickService.getCompany(id).get))进行转换了。

    代码详见:
    定义 Company model:

    import play.api.libs.json._
    
    case class Company(id: Long, businessCode: String, location: String, name: String, significance: String)
    
    object Company {
      implicit val format: Format[Company] = Json.format[Company]
    }
    

    controller 调用转换:

    class SlickController @Inject()(cc: ControllerComponents, slickService: ISlickService) extends AbstractController(cc) {
    
      def getCompany(id: Long) = Action {
        /**
         * 返回 json 类型的数据。
         * 两种方式:
         * 方式一: 手动实现 隐式转换 writes[Company]
         * 方式二: 在伴生对象中,添加 对应的 format ,然后调用 Json.toJson 转换    推荐方式
         */
        Ok(Json.toJson(slickService.getCompany(id).get))
      }
    
      /**
       * json data format
       * {
          "id": 5,
          "businessCode": "123456-03",
          "location": "北京",
          "significance": "IMPORTANT",
          "name": "百度公司"
         }
       */
      
      // 手动实现 writes[Company],要写出类型,不然 idea 不识别
      // model to a JsValue
      // 使用 Json.obj 和 Json.arr 来实例化
    /**
      implicit val companyWrites: Writes[Company] = (company: Company) => {
        Json.obj(
          "id" -> company.id,
          "businessCode" -> company.businessCode,
          "location" -> company.location,
          "significance" -> company.significance,
          "name" -> company.name,
        )
      }
    */
      // 另一种写法 原生写法
      /**
    
      implicit val companyWrites_v2: Writes[Company] = (
        (JsPath \ "id").write[Long]
          .and((JsPath \ "businessCode").write[String])
          .and((JsPath \ "businessCode").write[String])
          .and((JsPath \ "businessCode").write[String])
          .and((JsPath \ "name").write[String])
        ) (unlift(Company.unapply))
    
      */
    
      // implicit JsValue to a model
      implicit val companyReads: Reads[Company] = (
        (JsPath \ "id").read[Long] and
          (JsPath \ "businessCode").read[String] and
          (JsPath \ "location").read[String] and
          (JsPath \ "significance").read[String] and
          (JsPath \ "name").read[String]
        ) (Company.apply _)
    }
    

    这里,在 slick 中,有一个小坑,由于在 case class 的伴生对象中,手动定义了隐式转换,就不能直接使用 case class 的 tupled 方法了,需要使用 (Company.apply _).tupled这种语法。

      class CompanyTable(tag: Tag) extends Table[Company](tag, "company") {
    
        val id: Rep[Long] = column[Long]("id", O.PrimaryKey, O.AutoInc, O.Unique)
    
        val business_code = column[String]("business_code")
        val location = column[String]("location")
        val name = column[String]("name")
        val significance = column[String]("significance")
    
      // https://scala-slick.org/doc/3.3.3/schemas.html 存在伴生对象时,需要这么限定
        override def * : ProvenShape[Company] = (id, business_code, location, name, significance) <> ((Company.apply _).tupled, Company.unapply)
      }
    
    展开全文
  • 1.创建一个websocket服务端 package Utils.websocket; import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer;...

    1.创建一个websocket服务端
    package Utils.websocket;
    import org.java_websocket.WebSocket;
    import org.java_websocket.handshake.ClientHandshake;
    import org.java_websocket.server.WebSocketServer;
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.net.UnknownHostException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    /***
    *
    * Websocket服务类
    *
    * @author user
    *
    */
    public class WebsocketServersg extends WebSocketServer {

    		public static final Map<WebSocket, String> usercon = new HashMap<WebSocket, String>();
    	
    		
    		public static Map<WebSocket, String> getUsercon() {
    			return usercon;
    		}
    	
    		public WebsocketServersg() throws UnknownHostException {
    			
    		}
    	
    		public WebsocketServersg(int port) throws UnknownHostException {
    			super(new InetSocketAddress(port));
    			System.out.println("websocket Server start at port:" + port);
    		}
    	
    		/**
    		 * 触发连接事件
    		 */
    		@Override
    		public void onOpen(WebSocket conn, ClientHandshake clientHandshake) {
    			System.out.println("新的客户端正在链接(onOpen)...:"
    					+ conn.getRemoteSocketAddress().getAddress().getHostAddress());
    		}
    	
    		/**
    		 * 
    		 * 连接断开时触发关闭事件
    		 */
    		@Override
    		public void onClose(WebSocket conn, int code, String reason, boolean remote) {
    	
    			System.out.println("客户端关闭链接(onClose):" + usercon.get(conn));
    			
    			// 客户端断开连接就删除预存的WebSocket链接
    			WebsocketServersgPool.removeUser(conn);
    		}
    	
    		/**
    		 * 
    		 * 客户端发送消息到服务器时触发事件
    		 * 
    		 * @param conn
    		 *            :客户端链接的信息
    		 * @param message
    		 *            :链接的用户账号
    		 */
    		@Override
    		public void onMessage(WebSocket conn, String message) {
    			System.out.println("新的客户端消息请注意(onMessage): " + message);
    	
    			// 将客户端链接服务端的信息暂时保存在usercon这个Map中,便于用java后台调用给客户端发送消息
    			if(!WebsocketServersgPool.getCilentUser().containsKey(conn)){
    				WebsocketServersgPool.addUser(message, conn);//添加客户端链接
    			}
    	
    			// 向客户端发送消息
    			//conn.send(message);
    		}
    	
    		/**
    		 * 触发异常事件
    		 */
    		@Override
    		public void onError(WebSocket conn, Exception e) {
    			if (conn != null) {
    				System.out.println("发生异常");
    			}
    		}
    	
    		/**
    		 * Main启动服务端
    		 * 
    		 * @param args
    		 * @throws UnknownHostException
    		 */
    		public static void main(String[] args) throws UnknownHostException {
    			
    			new WebsocketServersg(9009).start();
    		}
    	
    		/**
    		 * 
    		 * 启动服务端
    		 * 
    		 */
    		public static void openingWebsocket() {
    			System.out.println("websocket服务开启:" + 9009);
    			try {
    				new WebsocketServersg(9009).start();
    			} catch (UnknownHostException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	
    		/**
    		 * 
    		 * 关闭服务端
    		 * 
    		 */
    		public static void closeWebsocket() {
    			System.out.println("websocket服务关闭:" + 9009);
    			try {
    				new WebsocketServersg(9009).stop();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    

    2.创建一个websocket连接池
    package Utils.websocket;

    	import java.util.ArrayList;
    	import java.util.Collection;
    	import java.util.HashMap;
    	import java.util.List;
    	import java.util.Map;
    	import java.util.Set;
    	
    	import org.java_websocket.WebSocket;
    	/**
    	 * 
    	 * Websocket连接池
    	 * 
    	 * @author user
    	 *
    	 */
    	public class WebsocketServersgPool {
    	
    		/**
    		 * 连接池
    		 */
    		private static final Map<WebSocket,String> usercon = new HashMap<WebSocket,String>();
    	
    		/**
    		 * 
    		 * 获取所有的websocket客户端链接
    		 * 
    		 * @return
    		 */
    		public static Map<WebSocket,String> getCilentUser(){
    			return usercon;	//添加连接
    		}
    		
    		/**
    		 * 向连接池中添加连接
    		 * @param inbound
    		 */
    		public static void addUser(String user, WebSocket conn){
    			usercon.put(conn,user);	//添加连接
    		}
    		
    		/**
    		 * 获取所有客户端
    		 * @return
    		 */
    		public static Collection<String> getOnlineUser(){
    			List<String> setUsers = new ArrayList<String>();
    			Collection<String> setUser = usercon.values();
    			for(String u:setUser){
    				setUsers.add(u);
    			}
    			return setUsers;
    		}
    		
    		/**
    		 * 根据登陆者账号移除连接池中的连接
    		 * @param inbound
    		 */
    		public static String userByRemoveUser(String userID){
    			
    			for (WebSocket wsds : usercon.keySet()) {
    				if(usercon.get(wsds) == userID){
    					removeUser(wsds);
    				}
    			}
    			return "";
    		}
    		
    		/**
    		 * 移除连接池中的连接
    		 * @param inbound
    		 */
    		public static boolean removeUser(WebSocket conn){
    			if(usercon.containsKey(conn)){
    				usercon.remove(conn);	//移除连接
    				return true;
    			}else{
    				return false;
    			}
    		}
    		
    		/**
    		 * 向指定的客户端发送数据
    		 * @param user
    		 * @param message
    		 */
    		public static void sendMessageToUser(WebSocket conn, String message){
    			if(null != conn){
    				conn.send(message);
    			}
    		}
    		
    		/**
    		 * 向所有的客户端发送消息
    		 * @param message
    		 */
    		public static void sendMessage(String message){
    			Set<WebSocket> keySet = usercon.keySet();
    			synchronized (keySet) {
    				for (WebSocket conn : keySet) {
    					String user = usercon.get(conn);
    					if(user != null){
    						conn.send(message);
    					}
    				}
    			}
    		}
    	}
    

    3.JS部分,在进行到页面,执行下边js
    /**
    *
    * 启动websocket
    *
    */
    var ws;
    function WebSocketOpening(){
    if (“WebSocket” in window){
    //alert(“您的浏览器支持 WebSocket!”);
    // 创建一个 websocket
    ws = new WebSocket(“ws://localhost:9009”);
    ws.onopen = function(){
    // Web Socket 已连接上,使用 send() 方法发送数据
    //ws.send(“websocket已连接11111”);
    console.log(“websocket已连接”);
    //添加这个需要每隔账号对应单独的websocket客户端链接信息
    ws.send(’${session.get(“zhanghao”)}’);
    // alert(“数据发送中…”);
    };

    				ws.onmessage = function (evt){ 
    					//后台有消息,前台进行接收
    					var received_msg = evt.data;
    					console.log("websocket接收:"+received_msg);
    					
    					//接收消息后执行的js
    					websocketMessage(received_msg);
    

    // alert(“数据已接收…” + received_msg);
    };
    ws.onclose = function(){
    // 关闭 websocket
    // alert(“连接已关闭…”);
    console.log(“websocket连接已关闭…”);
    };
    }else{
    // 浏览器不支持 WebSocket
    alert(“您的浏览器不支持 WebSocket!”);
    }
    }
    /**
    *
    * websocket消息
    *
    /
    function websocketMessage(messageInfo){
    alert(“接收到消息了:”+messageInfo);
    }
    4.java后台给客户端发送消息
    /
    *
    * 根据userID给这个用户发送消息
    *
    * @param userID: 用户账号
    * @param type: one:单个人;all:所有人
    * @param message:要发送的消息
    *
    */
    public static void sendWebsocketMess(String userID, String type, String message){
    Map<WebSocket, String> wsobj = WebsocketServersgPool.getCilentUser();
    System.out.println(“客户端链接数:” + wsobj.keySet().size());
    // usercon:所有客户端链接上都会存储这个Map中
    for (WebSocket wsg : wsobj.keySet()) {
    //wsg.send(messageInfo);
    //判断账号是否一样,给特定的用户发送提示消息
    if(“one”.equals(type) && wsobj.get(wsg) != null && wsobj.get(wsg).equals(userID)){
    WebsocketServersgPool.sendMessageToUser(wsg, message);
    }else if(“all”.equals(type)){
    WebsocketServersgPool.sendMessage(message);
    break;
    }
    }
    }

    展开全文
  • 用户验证(User Authentification)复合的使用Play框架的数个功能,包括前面已经了解的表单和数据库,以及这篇文章里要提到的加密和会话。根据应用或站点的复杂程度,用户验证也可以随之变化。这里将介绍用户验证的一...
  • 这是我的解决方案: 在路由中:我做了如下配置....GET /public/stylesheets/bootstrap.css controllers.Assets.at(path="/public/stylesheets", ...所以现在,Play只负责后端.前端开发人员只需要操作此公共文件来进行开发.
  • Play框架数据库学习

    2021-01-19 12:24:58
    原标题:Play框架数据库学习数据库是整个站点的数据储藏室。用户提交的数据可以存储在数据库中,以便未来使用。Play可以通过JDBC和数据库通信。我讲介绍Play和mysql数据库的连接。Play 2.*版本的默认操作数据库的...
  • Play框架的主要功能是提供动态响应的内容。但一个网络项目中必然有大量的静态内容,比如图片、Javascript文件、CSS文件等。我下面介绍如何在Play项目中加入静态文件。默认路径Play项目的静态文件一般存储在根目录下...
  • 来玩Play框架05 数据库

    2021-02-08 23:53:39
    谢谢!数据库是整个站点的数据储藏室。用户提交的数据可以存储在数据库中,以便未来使用。Play可以通过JDBC和数据库通信。我讲介绍Play和mysql数据库的...Play提供Finder这一帮助类型,可以实现一些简单的数据库查询...
  • 我注意到你正在使用Java.以下是我如何使用它来注入控制器....import play.mvc.*;import javax.inject.Inject;public class MyController extends Controller {@Injectprivate MyInterface myInt...
  • 也就是说,如果您选择在Scala中编写任何代码,请记住,用于Java自动化的框架通常不适用于Scala端. ORM是一个非常好的例子,因为Scala方法并不总是精确的Java方法,因此元数据最终会出现在不正确的位置,...
  • Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。Play 框架在设计的时候借鉴了流行的Ruby on Rails 和 Grails 等框架,又有自己独有的优势。使用 Play 框架可以方便和高效的开发出 Java ...
  • 来玩Play框架01 简介

    2021-03-04 08:45:48
    说到网络框架,Ruby的Ruby on Rail和Python的Django都相当轻巧好用,但Java下的框架,则要沉重很多。有人因此质疑Java语言本身是否符合网络时代的需求。Java大神们对这一问题嗤之以鼻。想要轻巧好用的框架?写一个给...
  • 现在就干脆放上来给大家分享分享开始项目介绍在这个教程中,你将通过从头到尾开发一个真正的Web应用来学习Play框架,在这个应用中,我们将尝试用上你将在真实项目中需要的每样技术,同时介绍Play应用开发的最佳实践...
  • 我的环境概述:Mac OS Yosemite,Play framework 2.3.7,sbt 0.13.7,Intellij Idea 14,java 1.8.0_25我试图在Play框架中运行一个简单的Spark程序,所以我只是在Intellij中创建一个Play 2项目,并按如下方式更改...
  • Play框架和Grails对比

    2021-03-09 08:28:48
    Play框架和Grails对比Play它是目前市面上的最好的框架之一。开发人员喜欢它,因为它是很容易编程,可扩展性和强大的。使用是Scala语言编程。开发人员经常进行少量修改和测试以便找出最佳的解决方案。一般情况下,...
  • java – 泛型和Play框架

    2021-03-04 08:45:21
    我在其当前版本中使用Play Framework,我的模型类扩展了play.db.jpa.JPABase.今天我尝试将常用的查询类型设为泛型,并定义一个静态辅助方法来构造它.我写了以下内容:import play.db.jpa.Model;import play.libs.F;...
  • Play是一个全栈框架

    2021-02-12 09:53:34
    背景没有了Spring MVC,你就什么都不会了吗? no no no !...介绍Play是一个全栈框架,它包含了Web应用和Rest服务所需要的所有组件,如:http服务器、表单处理、跨域请求保护、强大的路由机制、国际化等等...
  • 我上一章总结了Play框架的基本使用。这一章里,我将修改和增加响应。HTTP协议是按照“请求-响应”的方式工作。Play框架的核心是用动作(Action)来完成“请求-响应”。一个动作负责处理一种请求。一个项目可能要定义...
  • play 提供了一些非常有用的帮助类来简单管理 jpa 实体。注意:如果需要,你仍旧可以继续使用原始的 JPA API。7.1. 启动 JPA 实体管理器当 play 找到至少一个注释了@javax.persistence.Entity 标识的类时,play 将 ...
  • 【IT168 技术】概述Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。Play 框架在设计的时候借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势。使用 Play 框架可以方便和...
  • Play框架--初学笔记

    2021-03-04 08:45:23
    目录结构 web_app 根目录 | sbt SBT Unix 批处理脚本用于启动sbt-launch.jar | sbt.bat SBT Windows 批处理脚本用于启动sbt-launch.jar | sbt-launch.jar SBT 启动的Java可执行类库 | +---app Play Web 应用全部代码...
  • 我这样做的方法是使用自定义 QueryStringBindable . 这样我在路线中表达参数:GET /birthdays/ controllers.Birthdays.getBirthdays(period: util.Period)Period的代码如下所示 .public class Period implements ...
  • I am new to Play Framework. I have started learning it and so far I am enjoying it.I have started to learn Play Java.I have my controller and model set up as follow:Controller:package controllers;impo...
  • 我是新玩框架工作,我发现它有点困难.我正在从数据库中检索客户端名称列表并将其填充到下拉列表中,这是我的client.java代码package models;import java.sql.Connection;import java.sql.DriverManager;import java....
  • google play服务框架下载安装

    千次阅读 2021-06-04 14:37:56
    谷歌play服务框架2021最新版本是一款为谷歌软件及游戏提供呼出服务的软件,如果手机中缺少这个软件,可能会导致一些软件或游戏无法正常运行,出现秒退或打不开等情况,遇到这种情况可以下载这款软件安装google play...
  • 出现改问题的主要原因在于项目结构不对,我的test包放到了app里面,而正常的play架构的test包是和app同级的,只要将项目结构调整成正常的结构就可使用。 此外,如果不介意,可以将依赖导入中的作用域去掉,换成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,907
精华内容 19,562
关键字:

play框架