16

我在德国一家相当大的公司工作,并得到了为它创建主要网站的工作,其中包括:

  • 静态内容;信息和演示文稿
  • 员工区(约 6000 名员工),包括日历、职位描述、某种群组等各种内容
  • 太多其他动态的东西我不能在这里列出

我决定使用 COBOL 来完成这项工作,它可能被低估了,但它是一种非常强大的语言,特别是对于商业应用程序,以及正如我的同事所说的 web (2.0) 开发。

我还需要使用COBOL,因为公司的所有后端和交易系统都在其中编写(一些小部分也是在LISP中编写的,我不知道为什么)。我还收到了一个 API,它可以轻松地将 COBOL 与 MySQL 一起使用。

这是一个很大的项目,可能需要 2 个多月的时间来编写它。

  • 在 COBOL 中构建一个巨大的 Web 应用程序时,我需要期待什么?
  • 是否有适用于 COBOL 的 Web 框架?某种MVC?
  • 是否有任何用于使用 COBOL 进行实际 Web 开发的好资源?

提前致谢

4

6 回答 6

18

在 COBOL 中构建一个巨大的 Web 应用程序时,我需要期待什么?

这将需要很长时间。Django、Ruby on Rails 或 CodeIgniter 等框架专门设计用于在很短的时间内创建网站。

这些框架中的大多数可以在 20 分钟内构建工作的动态内容网站。COBOL 不能。除非您可以非常快速地打字,否则在您可以使用任何更现代的工具学习和构建网站的时间里,您可能只有很少的可用代码。

是否有适用于 COBOL 的 Web 框架?某种MVC?

现在问这个问题表明选择使用 COBOL 是一个非常非常糟糕的主意。

通常的策略是首先选择框架。在做出框架选择之后,我们会忍受利用该框架所需的语言。

但是,总是有http://www.coboloncogs.org/HOME.HTM

是否有任何用于使用 COBOL 进行实际 Web 开发的好资源?

http://search.barnesandnoble.com/COBOL-Programming-Using-the-NET-Framework/Ronald-D-Reeves/e/9780130668431

实际的 Web 开发是使用特定于 Web 的框架完成的。数十个 Python Web 框架、Ruby on Rails、任何 PHP 框架、任何 Java 框架中的任何一个。他们高度专业化,可以快速、廉价地构建网站。

COBOL 对此并不高度专业化。也没有人(在 i 系列之外)认真考虑将 COBOL 用于 Web 开发。

您最大的希望是使用尽可能多的外部库并尽可能少地编写 COBOL。您必须大量使用 OpenCOBOL 的 COBOL 到 C 功能才能使用 C 语言 API,并且实际上 - 使用 COBOL 包装器在 C 中构建您的站点。

于 2010-03-29T17:21:13.740 回答
12

请,请,请不要为此使用 COBOL。将来必须支持该站点的任何人都会感谢您选择更...现代的工具。

我建议您使用 Web 框架来编写前端,例如 PHP、ASP.NET MVC 等。然后创建一个 API(或具有某种接口的单独进程,如果需要),以允许该工具与您的 COBOL 后端交谈。这将允许您在前端使用 Web 框架 - 它将大放异彩 - 同时允许您利用您公司对 COBOL 的重大投资。

于 2010-03-29T17:04:27.807 回答
8

发布了 CGI 和 AJAX 的 OpenCOBOL 示例后,我想补充一下,继续努力。COBOL 可以做前端。

   >>SOURCE FORMAT IS FIXED
  ******************************************************************
  * Author:    Brian Tiffin, Francois Hiniger
  * Date:      30-Aug-2008
  * Purpose:   Display the CGI environment space
  * Tectonics: cobc -x cgienv.cob
  *   Move cgienv to the cgi-bin directory as cgienv.cgi
  *   browse http://localhost/cgi-bin/cgienv.cgi or cgienvform.html
  ******************************************************************
   identification division.
   program-id. cgienv.

   environment division.
   input-output section.
   file-control.
       select webinput assign to KEYBOARD.

   data division.
   file section.
   fd webinput.
      01 postchunk       pic x(1024).

   working-storage section.
   78 name-count      value 34.
   01 newline         pic x   value x'0a'.
   01 name-index      pic 99 usage comp-5.
   01 value-string    pic x(256).
   01 environment-names.
      02 name-strings.
         03 filler    pic x(20) value 'AUTH_TYPE'.
         03 filler    pic x(20) value 'CONTENT_LENGTH'.
         03 filler    pic x(20) value 'CONTENT_TYPE'.
         03 filler    pic x(20) value 'DOCUMENT_ROOT'.
         03 filler    pic x(20) value 'GATEWAY_INTERFACE'.
         03 filler    pic x(20) value 'HTTP_ACCEPT'.
         03 filler    pic x(20) value 'HTTP_ACCEPT_CHARSET'.
         03 filler    pic x(20) value 'HTTP_ACCEPT_ENCODING'.
         03 filler    pic x(20) value 'HTTP_ACCEPT_LANGUAGE'.
         03 filler    pic x(20) value 'HTTP_COOKIE'.
         03 filler    pic x(20) value 'HTTP_CONNECTION'.
         03 filler    pic x(20) value 'HTTP_HOST'.
         03 filler    pic x(20) value 'HTTP_REFERER'.
         03 filler    pic x(20) value 'HTTP_USER_AGENT'.
         03 filler    pic x(20) value 'LIB_PATH'.
         03 filler    pic x(20) value 'PATH'.
         03 filler    pic x(20) value 'PATH_INFO'.
         03 filler    pic x(20) value 'PATH_TRANSLATED'.
         03 filler    pic x(20) value 'QUERY_STRING'.
         03 filler    pic x(20) value 'REMOTE_ADDR'.
         03 filler    pic x(20) value 'REMOTE_HOST'.
         03 filler    pic x(20) value 'REMOTE_IDENT'.
         03 filler    pic x(20) value 'REMOTE_PORT'.
         03 filler    pic x(20) value 'REQUEST_METHOD'.
         03 filler    pic x(20) value 'REQUEST_URI'.
         03 filler    pic x(20) value 'SCRIPT_FILENAME'.
         03 filler    pic x(20) value 'SCRIPT_NAME'.
         03 filler    pic x(20) value 'SERVER_ADDR'.
         03 filler    pic x(20) value 'SERVER_ADMIN'.
         03 filler    pic x(20) value 'SERVER_NAME'.
         03 filler    pic x(20) value 'SERVER_PORT'.
         03 filler    pic x(20) value 'SERVER_PROTOCOL'.
         03 filler    pic x(20) value 'SERVER_SIGNATURE'.
         03 filler    pic x(20) value 'SERVER_SOFTWARE'.
      02 filler redefines name-strings.
         03 name-string   pic x(20) occurs name-count times.

   procedure division.

  * Always send out the Content-type before any other IO
   display
       "Content-type: text/html"
       newline
   end-display.

   display
       "<html><body>"
   end-display.
   display
       "<h3>CGI environment with OpenCOBOL</h3>"
   end-display.
   display
       '<a href="/cgienvform.html">To cgienvform.html</a>'
       "<p><table>"
   end-display.

  * Accept and display some of the known CGI environment values
   perform varying name-index from 1 by 1
       until name-index > name-count
           accept value-string from environment
               name-string(name-index)
           end-accept
           display
               "<tr><td>"
               name-string(name-index)
               ": </td><td>"
               function trim (value-string trailing)
               "</td></tr>"
           end-display
           if (name-string(name-index) = "REQUEST_METHOD")
              and (value-string = "POST")
                  open input webinput
                  read webinput
                      at end move spaces to postchunk
                  end-read
                  close webinput
                  display
                      '<tr><td align="right">'
                      "First chunk of POST:</td><td>"
                      postchunk(1:72)
                      "</td></tr>"
                  end-display
           end-if
   end-perform.
   display "</table></p></body></html>" end-display.
   goback.

这是一个在混合中添加一点 AJAX 的表单。

<html>
<head>
<title>Simple Ajax Example</title>
<script language="Javascript">
function xmlhttpPost(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            updatepage(self.xmlHttpReq.responseText);
        }
    }
    self.xmlHttpReq.send(getquerystring());
}

function getquerystring() {
    var form     = document.forms['f1'];
    var word = form.word.value;
    qstr = 'w=' + escape(word);  // NOTE: no '?' before querystring
    return qstr;
}

function updatepage(str){
    document.getElementById("result").innerHTML = str;
}
</script>
</head>
<body>
<form name="f1">
  <p>word: <input name="word" type="text">
  <input value="Go" type="button" onclick='javascript:xmlhttpPost("/cgi-bin/cgienv.cgi")'></p>
  <div id="result"></div>
</form>
</body>
</html>

并且只是添加,当我为 OpenCOBOL FAQ 测试这个时,它是使用嵌入在 COBOL 中的 WebKit 浏览器,利用 Vala WebKit 绑定。发挥魅力。COBOL 控制处理 CGI 的浏览器。

于 2012-12-02T16:38:54.330 回答
5

大多数人对使用 COBOL 开发 Web 应用程序的第一反应是非常消极的!

总的来说,我同意并建议不要将 COBOL 用于前端 Web 开发,因为还有其他工具附带了大量用于构建此类应用程序的预打包支持。支持通常来自库附加组件和 Web 服务的预构建接口。实现语言本身不太重要。

例如,Ruby on Rails 是一种基于 MVC 模型的应用程序框架,它使用 Ruby(语言)将它们“粘合”在一起。只要您坚持使用 Rails 框架,您的相当一部分开发工作就会烟消云散。但是,打破框架,它很可能会打破你。我认为使用诸如 Ruby on Rails 之类的框架非常适合您从头开始控制一切的新开发。

你的情况可能有些不同。如果我理解正确,您有一个 COBOL 应用程序基础和一个 mySQL 数据库,需要集成到一个新的 Web 应用程序中。Rails 框架在这种情况下可能特别有用,也可能不特别有用。这完全取决于你如何“在中间相遇”。使用强大的支持 Web 的工具来前端具有基于 COBOL 的后端的 Web 应用程序是一种相当普遍的行业实践。将两者结合在一起是一种相当特定于平台的艺术形式。

相同的评论适用于任何其他 Web 应用程序框架和工具集。我只是以 Ruby on Rails 为例。底线是,没有多少人(其中包括我)考虑过使用 COBOL 来前端 Web 应用程序。

尽管有上述情况,我注意到您在您的商店中使用了 openCobol。这可以使构建仅 COBOL 的解决方案成为一个合理的前景。与许多 COBOL 实现不同,openCobol 具备“网络就绪”功能,并且具有独立于数据库的抽象层 ,因此访问您的 mySQL 数据库应该非常轻松。Web 就绪部分是 openCobol 使用 C 应用程序二进制接口 (ABI) 的结果。C ABI 应该极大地促进在混合语言环境中的工作,并使与 CGI(通用网关接口)的交互变得非常简单;从这个例子可以看出。

OpenCobol 使构建 Web 应用程序变得可行,但它实用吗?如前所述,除非有一个记录在案的 Web 应用程序框架可供使用,否则您最终会自己做很多事情。我认为您在发布问题时可能已经得出了这个结论。据我所知,开发这样的框架也是可行的,但目前还不存在。如果你继续这个项目,也许你可以为开发一个用于 openCobol 的 Web 应用程序框架做出贡献。

我发现接受的答案中的“Cobol on Cogs”参考有点不公平,你问了一个严肃的问题,应该得到一个完全严肃的答案。这种类型的参考可能反映了对 COBOL 的一些“红脖子”封闭心态(是的,我已经准备好并期待对这一点投反对票)。

于 2010-03-30T20:31:25.543 回答
4

如果您因为需要与一些遗留 COBOL API 集成而不得不使用 Cobol,那么您如何使用 Cobol 通过一些 RESTful(或类似)API 公开数据。然后用 Django 之类的现代工具编写您的 Web 应用程序(这非常好)。然后,Python Web 应用程序可以通过您在 Cobol 中提供的 RESTful API 轻松访问必要的数据。

这将允许您为每项工作使用正确的工具:用于 Web 应用程序的现代 Web 应用程序框架和一些 Cobol 代码,用于公开您只有 Cobol API 的数据。

于 2010-03-29T22:32:07.610 回答
1

Microfocus提供了一个名为 Enterprise Server 的产品,它允许 COBOL 与 Web 服务进行交互。

如果您有一个 COBOL 程序 A 和另一个 COBOL 程序 B 并且 A 通过接口部分调用 B,则该工具允许您将 B 的接口部分公开为 Web 服务。

对于程序 A,然后生成客户端代理,A 现在可以通过 Web 服务调用 B。

当然,因为 B 现在有一个 Web 服务,任何其他类型的程序(命令行、Windows 应用程序、Java、ASP 等)现在也可以调用它。

他们还有另一个产品“COBOL.Net”,它为 COBOL 程序提供了 .NET IL 的解释器。

因为这是在 .NET 平台上,所以您可以与 C# 等混合搭配。

这使您可以两全其美。您保留现有的 COBOL 后端,但可以使用现代工具(例如 ASP / MVC / Struts / JSP)开发 Web 应用程序。并且您将两者与 Web 服务链接在一起。

于 2010-03-29T19:51:14.973 回答