目标:为报表服务开发一个REST风格的xml的数据源。当以http GET方式访问url时,根据url解析出要执行的oracle存储过程和要传递给它的参数,从过程的out参数中取出xml结果作为响应。url格式如:/xml/pkgname.procname/param1,param2,param3,这里xml为url前缀。pkgname.procname为要调用的oracle存储过程的名称,这个过程的第一个参数固定为out clob类型,param1,param2等参数为存储过程的第二个参数以后的参数,全部为varchar2类型。上面的url实际调用的存储过程为pkgname.procname(p_xml out clob,param1 varchar2,param2 varchar2,param3 varchar2)。
工具:clojure 1.3.0、Leiningen 1.7.1、emacs
使用lein创建新工程,工程定义如下:
(defproject cljxxbixml "1.0.0-SNAPSHOT"
:description "调用pl/sql过程,以text/xml形式将结果输出"
:dependencies [[org.clojure/clojure "1.3.0"]
[compojure "1.1.0"]
[org.clojure/java.jdbc "0.1.3"]
[com.oracle/ojdbc14 "10.2.0.3.0"]
[com.h2database/h2 "1.3.167"]
[c3p0/c3p0 "0.9.1.2"]]
:dev-dependencies [[lein-ring "0.7.1"]
[ring-server "0.2.3"]]
:plugins [[lein-ring "0.7.1"] [lein-swank "1.4.4"]]
:ring {:handler cljxxbixml.core/app})
lein-ring
插件是用于开发基于ring的web应用程序的,同时也提供了将应用程序打包成war的功能。
web层主要使用了compojure来处理rest风格的请求并产生响应。
;; # -*- coding: utf-8 -*-
(ns cljxxbixml.core
(:use compojure.core cljxxbixml.db)
(:require [compojure.route :as route]
[compojure.handler :as handler]))
(defn xml-response [data & [status]]
"用于生成utf-8 xml响应"
{:status (or status 200)
:headers {"Content-Type" "text/xml; charset=utf-8"}
:body data})
(defn main-page []
"首页"
(xml-response "<data>Hello World1! 汉字</data>"))
(defn xml-page [proc param]
"生成xml数据"
(xml-response
(gen-xml proc
(drop-last
(clojure.string/split
;; 防止,,,,之类的字符串split之后数组长度为0
(str param ",EOF") #",")))))
(defn parse-uri [uri]
"获取uri中第二个/开始的以/分割的Seq"
(nnext (clojure.string/split uri #"\/")))
(defroutes main-routes
"请求地址映射"
(GET "/" []
(main-page))
(GET "/xml/*" {:keys [uri]}
(apply xml-page (parse-uri uri)))
(GET "*" {:keys [scheme server-name server-port uri]}
(str (name scheme) "://" server-name ":" server-port uri)))
(def app
"主handler"
(handler/site main-routes))
为了便于在lein swank下进行增量开发。可以将下面的代码直接放到repl中执行。
;; # -*- coding: utf-8 -*-
;; slime里用于交互式调试
(require '[ring.server.standalone :as rserver])
(require '[cljxxbixml.core :as bi])
;; 仅定义一次,route修改时不会发生作用
;;(defonce server (rserver/serve bi/app))
;;(.stop server)
;;(.start server)
(def server (rserver/serve bi/app))
这里的通过(.stop server)和(.start server)可以停止或启动嵌入的web服务器。
相关推荐
tools.analyzer, 用于Clojure代码的分析器,用Clojure编写,并在EDN中生成 AST tools.analyzer主机无关Clojure代码的分析器,用Clojure编写,并在EDN中生成 AST 。我在 2015年12月的ClojureX上讨论了 tools.analyzer...
工具分析器用于主机不可知的Clojure代码的分析器,用Clojure编写,并在EDN中产生AST。 我介绍了tools.analyzer [.jvm]在ClojureX谈话在2015年12月视频蒂莫西·鲍德里奇了在Clojure中/西tools.analyzer [.jvm]谈话三...
css 是用 Clojure 编写的。 前端是用 ClojureScript 编写的,它编译成 JS。下一步实现 Friend 或 Sandbar 并进行用户身份验证。启动并运行安装。 最简单的方法是在 Mac 上使用 Homebrew。 祝你在 Windows 上好运......
是一个用 Clojure 编写的 IRC 机器人。 在,它使用与 IRC 交谈。 该机器人可以通过插件高度扩展。 插件使用 Clojure 编写,使用轻量级 DSL。 已经有很多插件了,包括 Haskell 和 Clojure 代码评估、谷歌搜索以及使用...
粉色的 用Clojure编写的音乐系统开发库。介绍该库为开发音乐系统提供了基础。 它的设计还可以根据用户需求扩展,无论他们是在探索和设计低级信号处理算法,开发预先编写的合成文件还是创建交互式实时系统。 它提供了...
一个用Clojure编写的非常简单的匹配引擎 用法 您可以克隆项目并运行: lein run 这是一个非常简单的例子: ( ns rinok.core ( :require [rinok.engine :as eng])) ( defn -main [] ( let [engine ( eng/->...
粗鲁的沙盒CRUD项目,使用clojure,ring,compojure,hiccup,rest,mysql,bootstrap,jQuery 想法是创建一个web.project,您可以在其中更改代码后在浏览器中按f5键。 无需手动编译或构建。先决条件您将需要安装 ...
宁静的Clojure 一个用 Clojure 编写的 RESTful 购物清单应用程序后端示例,伴随着 kendru.github.io 上的教程系列
Clojure-REST-API Clojure REST Api基于(本文)[ ] 路线: GET / api / v1 / todos 开机自检/ api / v1 / todos GET / api / v1 / todos /:id 放置/ api / v1 / todos /:id 删除/ api / v1 / todos /:id ...
它是用Clojure编写的,Clojure是在Java虚拟机(JVM)上运行的Lisp。 语法和词汇形式主义基于如书中所述[波拉德和1994凹陷。 入门 WARNING: these instructions are out of date. eugenekontzspro:italianquiz ...
dpgurl:用clojure编写的expirale url缩短器
用clojure编写。 先决条件 您需要安装 1.7.0 或更高版本。 用于本地测试的 postgresql 用于部署的 当地的 创建 postgresql 数据库 创建本地 postgresql 数据库 $ cd path/to/todo.clj $ initdb pg $ postgres -D ...
ablog:用Clojure编写的简单静态站点生成器
clojure-scripting:使用JVM Clojure编写脚本的第一步
一个 Clojure 库,旨在充当简单的 DNS 服务器。 它究竟是为了什么? 教我有关 DNS 的知识,并通过构建实际项目开始深入研究 Clojure。 我希望您会发现它对测试您可能遇到的 DNS 问题或发现恶意软件很有用。 用法 ...
Clojure is an opinionated language—it doesn’t try to cover all paradigms or provide every checklist bullet-point feature. Instead it provides the features needed to solve all kinds of real-world ...
penkala:用Clojure编写的PostgreSQL可组合查询生成器
冷冻剂:用Clojure编写的简单静态站点生成器
概述 我最喜欢的用 Clojure 编写的元启发式优化算法,用于试验该语言的并发特性。
用Clojure编写的功能性Chip8仿真器。 使用Quil图形库进行渲染。 用法 lein运行PATH_TO_ROM 输入 1 => 0x01 2 => 0x02 3 => 0x03 4 => 0x0C Q => 0x04 W => 0x05 E => 0x06 R => 0x0D A => 0x07 S => 0x08 ...