文章《用C++实现类似于JAVA HttpServlet 的编程接口》中讲述了如何使用 acl_cpp 库之 HTTP 模块编写象 Java Servlet 一样的 WEB 应用。其中也讲到了 acl_cpp HTTP 模块中有关 Http Session、Cookie 的使用方法。而作为 WEB 编程中非常重要的网页模板引擎在 acl_cpp 并未实现。本文将结合谷歌的 ctemplate 库,讲解如何使用 acl_cpp 的 WEB 类库和谷歌的 ctemplate 模板引擎库来实现类似于 Java Servet + Velocity 的 WEB 应用。当然,用户也可以根据需要使用其它的模板引擎,如:CTPP(俄罗斯人写的)、Teng。关于 C++ 的模板引擎可以参考 《基于C++的模板引擎》。
一、HTML 模板:test.htm
<!--test.htm--> <html> <head> <title> {{NAME}} </title> </head> {{!This is a example of template.}} <body> SID: {{SID}} <br> COOKIE: {{COOKIE}} <br> PARAM: {{PARAM}} <br> <br> Hello {{NAME}}, You have just won ${{VALUE}}! <table border=1> {{#IN_TABLE}} <tr> <td> {{ITEM}} </td> <td> {{TAXED_VALUE}} </td> </tr> {{/IN_TABLE}} </table> <br> {{!Include child template.}} {{>INCLUDED_TEMPLATE}} </body> </html>
下面是内嵌在 test.htm 中的子模板:include.htm
<!--include.htm--> <div> {{INCLUDE_VAR}} </div>
ctemplate 模板说明(摘自 marising 的《C++模板引擎Ctemplate的介绍》,该文中还有关于 ctemplate 更为高级的说明):
ctemplate大体上分为两个部分,一部分是模板,另一部分是数据字典。模板定义了界面展现的形式(V),数据字典就是填充模板的数据(M),你自己写业务逻辑去控制界面展现(C),典型的MVC模型。
ctemplate模板中有四中标记,对应的数据字典也有不同的处理方式:
1)变量,{{变量名}},用两个大括号包含的就是变量名,在c++代码中,可以对变量赋值,任何类型的值都可以(如字符,整数,日期等)。
2)片断,{{#片断名}},片断在数据字典中表现为一个子字典,字典是可以分级的,根字典下面有多级子字典。片断可以处理条件判断和循环。
3)包含,{{>模板名}}包含指的是一个模板可以包含其他模板,对应的也是一个字字典。
4)注释,{{!注释名}},包含注释。
二、使用 ctemplate 库来替换 test.htm 模板中的参数,同时将子模板 include.htm 包含进 test.htm 中,功能实现如下:
#include <string> #include "ctemplate/template.h" using namespace ctemplate; // 打开模板文件将其中的标记进行替换,然后生成 HTML 页面 bool create_html(std::string* out, const char* sid, const char* cookie, const char* param) { // 调用 google ctemplate 模板引擎生成页面 // 创建父模板 TemplateDictionary dict("example"); // 设置模板中的参数值 dict.SetValue("SID", sid ? sid : "null"); dict.SetValue("COOKIE", cookie ? cookie : "null"); dict.SetValue("PARAM", param ? param : "null"); dict.SetValue("NAME", "John Smith"); int winnings = rand() % 100000; dict.SetIntValue("VALUE" , winnings); // 设置模板中的片断 // 创建表格:10 行 for (int i = 0; i < 10; i++) { TemplateDictionary *dict1 = dict.AddSectionDictionary("IN_TABLE"); dict1->SetValue("ITEM", "Lihaibo"); dict1->SetFormattedValue("TAXED_VALUE", "%.2f", winnings * 0.83); } // 允许显示表格内容 dict.ShowSection( "IN_TABLE" ); // 创建 dict 模板的子模板 TemplateDictionary *dict3 = dict.AddIncludeDictionary("INCLUDED_TEMPLATE"); // 设置子模板文件名 dict3->SetFilename("include.htm" ); // 替换子模板中的标记 dict3->SetValue("INCLUDE_VAR", "This is a include template."); // 根据 test.htm 页面模板创建 HTML 页面,并返回 return ExpandTemplate("test.htm", DO_NOT_STRIP, &dict, out); }
三、使用 acl::HttpServlet 类编写 HTTP 处理过程
#include "lib_acl.hpp" #include <string> class http_servlet : public acl::HttpServlet { public: http_servlet(void) { } ~http_servlet(void) { } // HTTP GET 请求过程 virtual bool doGet(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { return doPost(req, res); } // HTTP POST 请求过程 virtual bool doPost(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { // 获得 session const char* sid = req.getSession().getAttribute("sid"); if (sid == NULL || *sid == 0) req.getSession().setAttribute("sid", "xxxxxx"); sid = req.getSession().getAttribute("sid"); // 取得浏览器 cookie const char* cookie = req.getCookieValue("name"); // 取得请求参数 const char* param = req.getParameter("name"); // 创建 HTTP 响应头过程 // 添加 cookie res.addCookie("name", "value"); // 以 acl_master 框架控制方式或单独服务运行时必须设置状态位 res.setStatus(200); // 设置 Content-Type 字段 res.setContentType("text/html"); // 设置字符集 res.setCharacterEncoding("gb2312"); std::string buf; create_html(&buf, sid, cookie, param); // 生成 HTML 页面 // 发送 http 响应头 if (res.sendHeader() == false) return false; // 发送 http 响应体 if (res.getOutputStream().write(buf.c_str(), buf.length()) == -1) return false; return true; } };
int main(void) { http_servlet servlet; servlet.doRun("127.0.0.1:11211"); // 开始运行,并假设 memcached 监听于 127.0.0.1:11211 return 0; }
由上面的例子可以看出,使用 acl::HttpServlet 类库及 ctemplate 模板库编写 WEB 应用还是比较简单的,这是一种典型的 MVC 的设计示例,要比传统的 CGI 编程简易不少而且功能更为强大。
下载:http://sourceforge.net/projects/acl/
svn:svn checkout svn://svn.code.sf.net/p/acl/code/trunk acl-code
github:https://github.com/acl-dev/acl/
QQ 群:242722074
国内镜像:http://git.oschina.net/zsxxsz/acl/tree/master
微博:http://weibo.com/zsxxsz/
用C++实现类似于JAVA HttpServlet 的编程接口
使用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序
更多文章...
模板引擎参考文章:
相关推荐
https://sourceforge.net/projects/acl/,请从acl项目url下载)是acl的c ++包装库,并且acl_cpp比acl具有更多有用的功能,例如例如流式mime解析,处理程序套接字支持以及db(mysql和sqlite)池接口,HttpServlet等。...
https://sourceforge.net/projects/acl/,请从acl项目url下载)是acl的c++封装库,acl_cpp比acl有很多有用的功能,比如如流式mime解析、handler socket支持、db(mysql和sqlite)池接口、HttpServlet等。有了acl_cpp,...
【标题】"Tomcat下HttpServlet的Web应用工程"是一个基于Java J2EE技术的Web项目,它在Tomcat7服务器环境下运行。这个项目利用了Eclipse 4.4作为集成开发环境(IDE),展示了如何在Linux操作系统中构建和部署Web应用...
ServletContext 读取 web 应用中的资源文件 在 Web 应用程序中,我们经常需要读取某些资源文件,如配置文件、图片等等。为了实现这一点,ServletContext 接口提供了一些方法来读取 web 应用中的资源文件,这些方法...
总的来说,使用Eclipse和Tomcat编写Servlet涉及创建Web项目、配置编译路径、编写Servlet类、发布和运行项目以及通过URL访问Servlet。这个过程让开发者能够快速地开发和测试基于Servlet的Java Web应用。
当开发Java Web应用时,通常会将`httpservlet.jar`、`javax.servlet.jsp.jar`和其他必要的库一起打包到应用的Web-INF/lib目录下,这样在部署到支持Servlet和JSP的Web服务器(如Tomcat、Jetty等)时,服务器可以找到...
4、网络通信库:阻塞/非阻塞网络 IO 库(其中 lib_acl_cpp 库通过嵌入 polarssl 而具备了 SSL 的能力) 5、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式及触发器模式 6、事件引擎:支持 select、...
本文档旨在帮助开发者深入了解`HttpServlet`的工作原理以及如何有效地使用它来开发高性能的Web应用程序。 #### 2. 谁需要阅读这份文档 - **Servlet开发者**:如果你正在使用Servlet技术来构建Web应用程序,那么这...
【Java Web应用开发知识点】 1. JSP表达式:在JSP中,要使用一个表达式,需要用到`<%= %>`元素,它用于输出变量或表达式的值到页面上。 2. JSP注释:在客户端浏览器的源代码中可以看到HTML注释,JSP注释在客户端是...
本教程“基于工作任务的Java_Web应用教程”由覃国蓉教授编写,是一份详实的电子教案,旨在通过实际工作任务的实施,帮助学习者掌握Java Web开发的核心技术和实践技能。Java Web技术是构建动态、交互式Web应用程序的...
在IT行业中,Web技术是构建互联网应用程序的基础,而"Web原理及应用:Hello World"这一主题则涵盖了初识Web开发的基本概念。在这个实验中,我们将使用Eclipse这一强大的集成开发环境(IDE)来编写Servlet,这是一个...
【Java技术在Web应用开发中的应用】 Java技术是Web应用开发中的重要基石,尤其是在IBM教育学院的课程中,深入探讨了如何利用Java构建高效、可扩展的Web应用程序。本课程聚焦于Java Web技术,涵盖了从基础到高级的...
Servlet是Java EE(现在称为Jakarta EE)规范的一部分,它定义了一组接口和类,允许开发者编写能与Web服务器交互的应用程序。Servlet容器(如Tomcat、Jetty等)负责加载和管理Servlet实例,处理来自客户端的请求,并...
下面是一个使用Java编写的简单代理servlet示例: ```java public class FutureWebServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ...
1、掌握 HttpServlet 的概念,相关 API 以及开发步骤; 2、掌握 JSP 技术的基本语法; 3、掌握 JSP 各隐含变量的使用方法; 4、掌握使用 Servlet 和 JSP 集成开发简单用户登录功能。
【标题】: 构建与部署简单Web应用程序 ...以上就是关于这个简单Web应用程序的关键知识点,涵盖了Web应用的基本原理、Tomcat服务器的使用以及项目构建的常规步骤。理解这些概念对于开发和维护Web应用程序至关重要。
Struts1是一个经典的Java Web开发框架,主要用于构建MVC(Model-View-Controller)架构的应用程序。本讲座主要介绍Struts1在Java Web应用中的基础知识和应用。 首先,Java Web应用是基于Java技术构建的互联网应用...
【标题】"rbe.rar_The Web" 涉及的知识点主要集中在使用嵌入式Jetty servlet容器来开发Web应用程序。Jetty是一款轻量级、高性能的HTTP服务器和Servlet容器,广泛应用于Java Web应用的部署和测试。下面将详细阐述相关...