加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 将常规Servlet编码转换为我的DSL的起点

发布时间:2020-12-14 19:34:57 所属栏目:Java 来源:网络整理
导读:Clojure提供了一个很好的 Java互操作.但是,我真的想拥有这个: (servlet IndexServlet (service[parmas] ....) (do-post[params] ....) (do-get [params] ....))(servlet-filter SecurityFilter (do-filter [params] ....)) 我猜这就是所谓的DSL,在Lisp世界
Clojure提供了一个很好的 Java互操作.但是,我真的想拥有这个:
(servlet IndexServlet
  (service[parmas] ....)
  (do-post[params] ....)
  (do-get [params] ....))

(servlet-filter SecurityFilter
  (do-filter [params] ....))

我猜这就是所谓的DSL,在Lisp世界中,它是通过宏完成的.

我不确定如何/从哪里开始. refiy和extends表单在这里肯定有重要作用,但我不知道它如何适合宏.

怎么开始做这个DSL?
一个片段,提示和技巧真的很感激.

解决方法

您可能需要查看Ring的Jetty适配器,以获取Clojure中servlet实现的示例.源可用 here(链接到1.1版本的源).特别是,在该命名空间中定义的第一个函数,proxy-handler根据Jetty提供的抽象类返回一个处理程序.

如果您选择实现类似的方法(将您的servlet基于Java类提供一些现成的方法impls),您将需要使用代理;如果你只需要实现接口(没有子类),那么你可能需要改进.宏是否有用取决于实现的哪些部分将被修复; Ring的Jetty适配器不会受益于宏的使用,但您可以(例如,如果您希望将类扩展/接口实现为参数,如问题似乎表明的那样).

在任何情况下,您选择实施的任何功能都需要成为接口或协议的一部分.因此,实现javax.servlet.Servlet以及其他操作foo可能如下所示:

(import (javax.servlet Servlet ServletRequest ServletResponse))

(defprotocol PFoo
  (foo [this x y z]))

(reify
  Servlet
  (service [this ^ServletRequest req ^ServletResponse res]
    ...)
  ;; other Servlet methods here...
  PFoo
  (foo [this x y z]
    ...))

然后,您可以将其包装在宏中以提供任何所需的语法糖.请注意,reify实际上并不关心在其体内交换接口/协议名称和方法定义的方式,因此您可以让宏发出

(reify
  Servlet PFoo ... ; other interfaces & protocols
  (service [...] ...)
  (foo [...] ...)
  ;; other methods
  )

如果那更方便.

一个宏的草图,以servlet接口的名称来实现(可能是扩展javax.servlet.Servlet)并使用一些额外的方法注入协议:

(defprotocol PFancyServlet
  (do-get [this ...])
  (do-post [this ...]))

(defmacro servlet [servlet-iface & meths]
   `(reify ~servlet-iface PFancyServlet
      ~@meths))

方法需要包括do-get和do-post以及servlet-iface方法;你可以添加一些参数验证来确保这种情况.一个示例电话:

(servlet SomeServletInterface
  (service [this ...] ...)
  ;; ...
  (do-get [this ...] ...)
  (do-post [this ...] ...))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读