2017金砖会议之spark
前言
2017年金砖国家工商论坛组委会2日召开新闻发布会,介绍有关情况。论坛预期取得四方面成果:一是增强工商界加强互利合作的信心,二是增进工商界之间的交流合作,三是提出有价值的政策建议,四是拓展工商界参与全球经济治理的深度和广度。
spark简介
Spark(注意不要同Apache Spark混淆)的设计初衷是,可以简单容易地创建REST API或Web应用程序。它是一个灵活、简洁的框架,大小只有1MB。Spark允许用户自己选择设计应用程序的模板引擎以及选择最适合他们项目的库,比如,HTML解析功能就有Freemarker、Mustaches、Velocity、Jade、Handlebars、Pebble或Water等选项可供选择,而且很少需要配置或样板文件。不过,灵活简单的代价是,用户可选的功能减少。总之,Spark剔除了许多Java的臃肿之物,提供了一个最小化的、灵活的Web框架。但由于精简程度较高,它缺少了一些功能,不适合用于大型Web应用程序的开发。
使用示例
1.在pom.xml文件上加入依赖:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.2</version>
</dependency>
2. 编写代码
import static spark.Spark.*;
public class HelloWorld {
public static void main(String[] args) {
get("/hello", (req, res) -> "Hello World");
}
}
3.允许代码且查看结果
http://localhost:4567/hello
是不是很简单?spark是最容易建立一个java web应用的开发框架,但它提供了对大多数类型的项目来说足够的功能。
停止服务器
通过调用stop()方法,服务将关闭且会清理掉所有的路由信息。
路由
一个spark应用的主要模块就是一组路由。路由有三部分组成:
一个方法。(get,post,put,delete,head,trace,connect,options).
一个路径。(例如/hello, /users/:name)
一个回调。(request,response)->{}
路由的匹配是按照路由的定义顺序匹配的。请求会触发第一个匹配的路由。
get("/", (request, response) -> {// .. Show something ..});
post("/", (request, response) -> {// .. Create something ..});
put("/", (request, response) -> {// .. Update something ..});
delete("/", (request, response) -> {// .. annihilate something ..});
options("/", (request, response) -> {// .. appease something ..
});
路由匹配模式可以包含命名参数,根据请求对象的参数方法来访问:
// matches "GET /hello/foo" and "GET /hello/bar"// request.params(":name") is 'foo' or 'bar'
get("/hello/:name", (request, response) -> {
return "Hello: " + request.params(":name");
});
路由匹配模式也可以包含通配符参数。可以根据请求对象的通配符方法来访问:
// matches "GET /say/hello/to/world"// request.splat()[0] is 'hello' and request.splat()[1] 'world'
get("/say/*/to/*", (request, response) -> {
return "Number of splat parameters: " + request.splat().length;
});
请求
在处理方法中,请求参数提供了请求信息和功能:
request.body(); // request body sent by the client
request.cookies(); // request cookies sent by the client
request.contentLength(); // length of request body
request.contentType(); // content type of request.body
request.headers(); // the HTTP header list
request.headers("BAR"); // value of BAR header
request.attributes(); // the attributes list
request.attribute("foo"); // value of foo attribute
request.attribute("A", "V"); // sets value of attribute A to V
request.host(); // "example.com"
request.ip(); // client IP address
request.pathInfo(); // the path info
request.params("foo"); // value of foo path parameter
request.params(); // map with all parameters
request.port(); // the server port
request.queryMap(); // the query map
request.queryMap("foo"); // query map for a certain parameter
request.queryParams("FOO"); // value of FOO query param
request.queryParams(); // the query param list
request.raw(); // raw request handed in by Jetty
request.requestMethod(); // The HTTP method (GET, ..etc)
request.scheme(); // "http"
request.session(); // session management
request.splat(); // splat (*) parameters
request.url(); // "http://example.com/foo"
request.userAgent(); // user agent
响应
在处理方法中,响应参数提供了响应参数和功能:
response.body("Hello"); // sets content to Hello
response.header("FOO", "bar"); // sets header FOO with value bar
response.raw(); // raw response handed in by Jetty
response.redirect("/example"); // browser redirect to /example
response.status(401); // set status code to 401
response.type("text/xml"); // set content type to text/xml
查询参数Map
查询参数Map支持根据前缀将参数分组到map中。这可以对两组参数进行分组,如user[name]和user[age]一样。
request.queryMap().get("user", "name").value();
request.queryMap().get("user").get("name").value();
request.queryMap("user").get("age").integerValue();
request.queryMap("user").toMap()
Cookie
request.cookies(); // get map of all request cookies
request.cookie("foo"); // access request cookie by name
response.cookie("foo", "bar"); // set cookie with a value
response.cookie("foo", "bar", 3600); // set cookie with a max-age
response.cookie("foo", "bar", 3600, true); // secure cookie
response.removeCookie("foo"); // remove cookie
Session
每个请求可以访问在服务端创建的session,提供了下面的方法来访问:
request.session(true) // create and return session
request.session().attribute("user") // Get session attribute 'user'
request.session().attribute("user", "foo") // Set session attribute 'user'
request.session().removeAttribute("user", "foo") // Remove session attribute 'user'
request.session().attributes() // Get all session attributes
request.session().id() // Get session id
request.session().isNew() // Check is session is new
request.session().raw() // Return servlet objec
停止
一个过滤器或者路由中快速停止一个请求的方法是:
halt();
你也可以在停止时,指定一个状态。
halt(401);
或者:
halt("This is the body");
或者
halt(401, "Go away!");
过滤器
前置过滤器在请求处理前进行处理,可以读取请求,读取/修改响应。
停止执行,使用halt方法:
before((request, response) -> {
boolean authenticated;
// ... check if authenticated
if (!authenticated) {
halt(401, "You are not welcome here");
}
});
后置过滤器在请求处理后进行,可以读取请求,读取/修改响应:
after((request, response) -> {
response.header("foo", "set by after filter");
});
过滤器也可以匹配请求(可选的),此时只有当路径匹配时才进行处理:
before("/protected/*", (request, response) -> {
// ... check if authenticated
halt(401, "Go Away!");
});
直接跳转
你可以使用redirect帮助方法将浏览器页面进行跳转。
response.redirect("/bar");
你可以使用状态码3xx进行跳转:
response.redirect("/bar", 301); // moved permanentl
异常映射
处理配置的所有的过滤器和路由的异常:
get("/throwexception", (request, response) -> {
throw new NotFoundException();
});
exception(NotFoundException.class, (e, request, response) -> {
response.status(404);
response.body("Resource not found");
});
静态文件
使用staticFileLocation方法,你可以在classpath中指定一个文件夹为静态文件提供服务。
注意,公共目录不要包含在url中。一个文件/public/css/style.css访问路径为:http://{host}:{port}/css/style.css
staticFileLocation("/public"); // Static files
还可以使用externalStaticFileLocationMethod在设置一个外部目录(不在classpath)为静态文件提供服务:
externalStaticFileLocation("/var/www/public"); // Static files
响应转换
映射路由将处理方法转换成外部输出。可以通过扩展ResponseTransformer,传递它到映射方法来完成。下面是一个使用Gson将一个路由输出转换成json的示例:
import com.google.gson.Gson;
public class JsonTransformer implements ResponseTransformer {
private Gson gson = new Gson();
@Override
public String render(Object model) {
return gson.toJson(model);
}
}
使用上述类(MyMessage是一个有‘message’成员变量的bean):
get("/hello", "application/json", (request, response) -> {
return new MyMessage("Hello World");
}, new JsonTransformer());
你也可以使用java8的方法引用,因为ResponseTransformer是有一个方法的接口:
Gson gson = new Gson();
get("/hello", (request, response) -> new MyMessage("Hello World"), gson::toJson);
视图和模板
TemplateViewRoute由一个路径(url匹配的路径)和一个实现了render方法的模板引擎组成。
不用调用toString()方法返回的结果作为模板的实体,TemplateViewRoute返回调用render方法作为结果。
这种类型route的主要目的是提供一个创建通用和可复用的使用模板引擎渲染输出的组件。
Freemarker
使用Freemarkder模板引擎渲染对象到html。
maven依赖:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-freemarker</artifactId>
<version>2.0.0</version></dependency>
示例和源码在 GitHub上。
Mustache
使用Mustache模板引擎渲染对象到html。
Maven依赖如下:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-mustache</artifactId>
<version>1.0.0</version></dependency>
示例和源码在GitHub上。
Velocity
使用velocity模板引擎渲染对象到html。
Maven依赖如下:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-velocity</artifactId>
<version>2.0.0</version></dependency>
示例和源码在GitHub上。
Handlebars
使用Handlebar模板引擎渲染对象到html。
Maven依赖如下:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-handlebars</artifactId>
<version>1.0.0</version></dependency>
示例和源码在GitHub上
jada
使用jada模板引擎渲染对象到html。
Maven依赖如下:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-jade</artifactId>
<version>1.0.0</version></dependency>
示例和源码在 GitHub上
Pebble
使用pebble模板引擎渲染对象到html。
Maven依赖如下:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-pebble</artifactId>
<version>1.0.0</version></dependency>
示例和源码在 GitHub上
Water
使用water模板引擎渲染对象到html。
Maven依赖如下:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-water</artifactId>
<version>1.0.0</version></dependency>
示例和源码在GitHub上
内嵌的web服务器
独立的Spark运行在一个嵌入的Jetty web服务器。
端口
默认情况下,Spark运行在4567端口。如果你想使用别的端口,使用port方法。在使用过滤器和路由时已经完成:
port(9090); // Spark will run on port 9090
安全
你可以通过secure方法来设置connection为安全的。这必须在所有路由映射之前完成:
secure(keystoreFile, keystorePassword, truststoreFile, truststorePassword);
线程池
可以非常容易的设置最大的线程数:
int maxThreads = 8;
threadPool(maxThreads);
还可以配置最新线程数和空闲过期时间:
int maxThreads = 8;int minThreads = 2;int timeOutMillis = 30000;
threadPool(maxThreads, minThreads, timeOutMillis);
等待初始化
使用awaitInitialization() 方法来检查服务器是否准备好,可以处理请求了。
这通常在一个独立的线程中来做,例如在服务器启动后运行一个健康监测模块。
这个方法将使当前线程处于等待状态直至Jetty服务器初始化完成。初始化等于的路由、过滤器。因此,若使用一个线程,请不要将该方法放到你定义的路由、过滤器之前。
awaitInitialization(); // Wait for server to be initialized
其它的web服务器
为运行集群服务器(不是独立服务器),需要实现spark.servlet.SparkApplication。必须在init方法中初始化路由,下面的过滤器也必须在web.xml中配置:
<filter>
<filter-name>SparkFilter</filter-name>
<filter-class>spark.servlet.SparkFilter</filter-class>
<init-param>
<param-name>applicationClass</param-name>
<param-value>com.company.YourApplication</param-value>
</init-param></filter>
<filter-mapping>
<filter-name>SparkFilter</filter-name>
<url-pattern>/*</url-pattern></filter-mapping>
压缩
若请求/响应报文头中有此字段,压缩将会自动完成。
生成Javadoc
从GitHub 上获取到源码后,运行下面的命令生成javadoc:
mvn javadoc:javadoc
生成结果放入到/target/site/apidocs目录下。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
僵尸网络的最新消息与发展趋势
对于当前的形势我一直有一个疑问,为何世界经济持续低迷,但网络犯罪活动却欣欣向荣。难道互联网真的是犯罪分子的天堂么?是否是高昂的投资回报率,使得恶意软件制作者们不断改进如Storm这样的蠕虫?貌似如此。 Storm卷土重来 首先要提到的重大事件是由Storm 蠕虫创建的僵尸网络再度出现。2007年,Storm蠕虫曾经建立起了一个空前庞大的僵尸网络。不过在2008年初,由于微软发布了Malicious Software Removal Tool (MSRT),这个僵尸网络几乎绝迹了。当时,随着微软在一个月内发布了多个Storm 变种的签名标记,MSRT几乎从30万台电脑中删除了Storm。 与此同时,Secureworks 的主管Joe Stewart破解了这款恶意软件用来与命令和控制服务器通信的64-bit加密密钥。有了这个密钥,安全专家们将可以通过隔离和屏蔽点到点的内部节点通信的方式进一步降低Storm僵尸网络的有效性。 2008年8月,我曾经写了一篇名为《Storm蠕虫: 僵尸网络的巨无霸》的文章。文中,我指出了Storm开发者们的坚韧态度。那时候Storm好像正在筹划卷土重来,不过...
- 下一篇
开源框架Mahout配置
开源框架Mahout配置 机器学习这两年特别火,ATB使劲开百万到几百万年薪招美国牛校的机器学习方向博士,作为一个技术控,也得折腾下,就这样来初步折腾下Mahout这个机器学习的主流开源框架。 一、Mahout简介 Mahout的中文意思:驭象的人,再看看Mahout的logo,骑在象头上的那个Mahout。机器学习是人工智能的一个分支,它涉及通过一些技术来允许计算机根据之前的经验改善其输出。此领域与数据挖掘密切相关,并且经常需要使用各种技巧,包括统计学、概率论和模式识别等。虽然机器学习并不是一个新兴领域,但它的发展速度是毋庸置疑的。许多大型公司,包括 IBM、Google、Amazon、Yahoo! 和 Facebook,都在自己的应用程序中实现了机器学习算法。此外,还有许多公司在自己的应用程序中应用了机器学习,以便学习用户以及过去的经验,从而获得收益。 Mahout是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括被称为Taste的分布式协同过滤的实现、分类、聚类等。Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapRed...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果