java-web的另外选择

程序员小尤是个单身狗,除了时间穷的一无所有。他有一天萌生了要写点有意思的代码的想法,可是常年累月的被spring mvc这么沉重的框架“压迫”,让他产生了要换个环境的冲动。对于天生爱折腾的他,这都不叫事儿,他看了一个叫play-framework的框架,起初被这个牛逼的框架下了一跳。开发起来好爽,他这么想着。可是用了一段时间下来发现,虽然她支持java可是毕竟是使用scala开发的,而且完全不符合他想要的简单的需求。于是他又开始了寻找之旅,后来在不经意间,他瞥了一眼spark-java。起初他以为她是用来处理大数据的,后来发现原来只是名字有关系,远不是那个只能远观不能近触的“高大上”的平台,而是一个平易近人十足的林家小妹。这样,小尤开始了和spark-java的不解之缘。

当然要新建一个项目,代码如下:

mvn archetype:create -DgroupId=com.demo -DartifactId=todoList  

然后就会产生一个这样结构的代码: Alt text

然后在pom文件中加入sparkjava的依赖以及将jdk变成1.8(因为sparkjava要用到lambda表达式):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.demo</groupId>
  <artifactId>todoList</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>todoList</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
      <dependency>
          <groupId>com.sparkjava</groupId>
          <artifactId>spark-core</artifactId>
          <version>2.1</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
      </dependency>
  </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>  

以上sparkjava的依赖就搞定了是不是很随意啊,下面我们就开始写代码吧(准照惯例我们会写一个hello world):

package com.demo;

import static spark.Spark.get;

/**
 * Created by youpengfei on 15/3/11.
 */
public class HelloWorld {  
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

如你看到的sparkjava的helloworld写完了就是这么简单,现在运行这个main函数就会启动一个web监听了。如下图所示:

现实启动的端口是4567——当然这个端口是可以修改的。然后我们在页面上输入:localhost:4567/hello就能够看效果了: 当然现在离java-web还有一段距离呢,我们不能天天手写html代码啊,那不就有回到servlet的解放前了吗,那样sprakjava不就太low了吗?sparkjava支持扩展,可以使用很多模板语言,就官方文档提供的就有velocity 、Freemaker和Mustache三种,其他的也可以根据自己的喜好来添加,需要提醒的是默认的velocity模板没有加入utf8编码中文会有乱码,当然你也可以自己重写一个velocity模板渲染逻辑。我们的例子使用的Mustache,原因吗当然是小尤爱折腾的天性,前两种都用过了没有什么意思☺。加入maven依赖:

 <dependency>
          <groupId>com.sparkjava</groupId>
          <artifactId>spark-template-mustache</artifactId>
          <version>1.0.0</version>
      </dependency>
</code>  

然后在编译目录下新建一个templates文件夹,文件夹下新建文件list.mustache,加入如下内容:

<html>  
<head>  
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>  
<body>  
<table  border="1px" cellspacing="0px" style="border-collapse:collapse">  
    <thead>
    <td>id</td>
    <td>姓名</td>
    <td>年龄</td>
    </thead>
    {{#userlist}}
        <tr>
            <td>{{id}}</td>
            <td>{{name}}</td>
            <td>{{age}}</td>
        </tr>
    {{/userlist}}
</table>  
</body>  
</html>  

在刚才的main函数中加入如下代码:

 get("/list", (req, res) -> {
            Map<String, Object> model = new HashMap<>();
            List<User> userList = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                User user = new User();
                user.setName("name" + i);
                user.setId(i + 0l);
                user.setAge(i + 10);
                userList.add(user);
            }
            model.put("userlist", userList);
            return new ModelAndView(model, "list.mustache");
        },new MustacheTemplateEngine());

重新启动main函数,输入localhost:4567/list就能看到这样的效果了:

至此sparkjava的一些简单的功能就介绍完了,当然这只是个入门。sprakjava还提供了很多方法比如post、delete、put等方法,还提供了一些获取参数和cookie的简单的方法,即做到了简化代码又不会让项目变得臃肿不堪。 sprakjava优势很明显,由于采用了微内核的结构,让整个框架显得特别的小巧。当然框架本身设计优良,提供了很多扩展点,比如说可以使用任何一个模板引擎进行扩展。在比如加入了前置拦截器和后置拦截器可以对请求或者异常进行处理。
它虽然不是拥有web框架的所有功能,但是还是给你开放了很多的扩展点,让你能够根据自己不同的需求进行扩展。这绝对是一个设计精良的框架不仅可以做web展示还能够做服务框架提供rest服务,因为框架的设计是符合rest规范的。 当然一个传统的web项目怎么能离开数据库。下一篇文章将会针对这个项目加入mybatis支持,敬请关注。

尤鹏飞

继续阅读此作者的更多文章