我是一个地道的Java程序员,但最近领导给指派了个c++的开发任务,开发一个c++版的单点登录的CAS客户端。虽然一点没学过c++,但也只能硬着头皮上。
CGI编程,简单的说是公共网关接口,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。具体的内容可以自行百度,这里不做赘述,这篇文章主要讲一下怎么在Tomcat下运行C++程序。
第一步,配置Tomcat。
我使用的Tomcat是免安装版,我再Tomcat6与Tomcat7上亲测可行。
首先修改conf/web.xml
1.取消如下代码的注释:
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
其中,executable是需要自己加进去的,value值为空即可。本来这里应该写cmd /c 以表示用c++的方式来解释cgi脚本,但是我发现写了之后会报
java.io.IOException: Cannot run program "cmd /c" (in directory "D:\newWorkSpace\cas_cgi_client\WebRoot\WEB-INF\cgi"): CreateProcess error=2, ?????????
花了好长时间才发现是executable的值写了才cmd /c的原因,所以改成了空,表示可以编译任何文件。
2.取消下面代码的注释:
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
这里的cgi表示的是c++的cgi文件的路径为WEB-INF/cgi文件夹下,/cgi-bin/*表示运行后地址栏输入的地址为:localhost:8080/项目名/cgi-bin/cgi文件。
第二步,修改conf/context.xml
将Context标签修改为
<Context privileged="true">
第三步,编写并编译一个c++程序
#include <iostream>
using namespace std;
int main ()
{
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello World - 第一个 CGI 程序</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! 第一个 CGI 程序</h2>\n";
cout << "</body>\n";
cout << "</html>\n";
// system("PAUSE");
return 0;
}
编译后生成可执行文件(如client.exe)
第四步,新建Java项目
我是在eclipse里新建了一个web项目,大家也可以直接在Tomcat的ROOT目录下直接新建。在WEB-INF下新建文件夹cgi,并将client.exe文件拷贝到cgi文件夹下,也可以将client.exe重命名为client.cgi后拷贝到cgi文件夹下。
启动Tomcat,
如果是client.exe,在地址栏输入:
http://localhost:8080/cas_cgi_client/cgi-bin/client.exe
如果是client.cgi,在地址栏输入:
http://localhost:8080/cas_cgi_client/cgi-bin/client.cgi
即可在浏览器上显示相应的内容。