`
qqsunkist
  • 浏览: 33206 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

理解cppcms中的form

 
阅读更多

问题:

cppcms中form如何使用呢?官网上,除了教学篇-5之外,再无其他关于form使用的帮助文档了。当然,还有另外两种办法,就是看reference api文档和源代码。但是每次在使用form之前,或者长时间不用cppcms都使用后面两种办法自学的话,真是有点费劲费时。

 

小结:

基于上述问题原因,做了下面cppcms中form的小结,以便后续使用。

 

还是先看教学篇5的源代码,先看content.h。

#include <cppcms/view.h>
#include <cppcms/form.h>

namespace content {
  struct info_form : public cppcms::form {
    cppcms::widgets::text name;
    cppcms::widgets::radio sex;
    cppcms::widgets::select marital;
    cppcms::widgets::numeric<double> age;
    cppcms::widgets::submit submit;

    info_form(){
      name.message("Your Name");
      sex.message("Sex");
      marital.message("Marital Status");
      age.message("Your Age");
      submit.value("Send");

      add(name);
      add(sex);
      add(marital);
      add(age);
      add(submit);

      sex.add("Male", "male");
      sex.add("Female", "female");
      marital.add("Single", "single");
      marital.add("Married", "married");
      marital.add("Divorced", "divorced");

      name.non_empty();
      age.range(0, 120);
    }

    virtual bool validate(){
      if(!form::validate())
	return false;
      if(marital.selected_id()!="single" && age.value()<18){
	marital.valid(false);
	return false;
      }
      return true;
    }
  };

  struct message : public cppcms::base_content {
    std::string name, state, sex;
    double age;
    info_form info;
  };
}

 照常例,使用cppcms时,都先准备content,同样我们定义一个message struct,template被填充message中的成员变量值。正如教学篇5中,页面只有一个简单的form,里面包含姓名(text)、性别(radio)、婚姻状况(select)、age(text),提交按钮(submit)五个form组件。

 

按照传统HTML页面来讲,当客户提交表单时,表单中信息均保存在http request中POST数组变量中。在cppcms中,我们可以通过使用http_request的post(std::string const &name)读取这些原始数据。以下,是我使用CPPCMS按照传统方式编写的一个简单表单交互测试。

 

1. 定义content.h

#ifndef CONTENT_H
#define CONTENT_H

#include <cppcms/view.h>
#include <cppcms/form.h>

namespace content {
  struct message : public cppcms::base_content {
    std::string name, state, sex; 
    double age;
  };//end message
}// end content

#endif

 2. 定义basicform view

<% c++ #include "content.h" %>
<% skin form_skin %>
<% view basicform uses content::message %>
<% template render() %>
<html>
<body>
<% if not empty name %>
<h1>Hi, <%= name %></h1>
<p>Your sex is <%= sex %>, and your marital status is <%= state %>.
<p>Your age is <%= age %>.</p>
<% else %>
<h1> Input Your Details </h1>
	<form method="post" action="">
	<p>Your name: <input type="text" name="name"></p>
	<p>Sex: <input type="radio" name="sex" value="male">Male
		<input type="radio" name="sex" value="female">Female</p>
	<p>
	Marital status: <select size="1" name="state">
		   	   <option value="single">Single</option>
			   <option value="married">Married</option>
			   <option value="divorced">Divorced</option>
	                </select>
	</p>
	<p>Your age: <input type="text" name="age"></p>
	<p><input type="submit" value="Send"></p>
	
	</form>
<% end %>
</body>
</html>
<% end template %>
<% end view %>
<% end skin %>

 3. 编写controller,base_form.cpp

#include <cppcms/application.h>
#include <cppcms/applications_pool.h>
#include <cppcms/service.h>
#include <cppcms/http_request.h>
#include <cppcms/http_response.h>
#include <cppcms/url_dispatcher.h>
#include <cppcms/url_mapper.h>
#include <iostream>

#include "content.h"

using namespace std;
class hello : public cppcms::application{
public:
  hello(cppcms::service &s):cppcms::application(s){}
  
  void main(std::string){
    content::message c;
    if(request().request_method()=="POST"){
      if(request().post("name")!=""){
	c.name = request().post("name");
	c.sex = request().post("sex");
	c.state= request().post("state");
	c.age = atoi(request().post("age").c_str());

	render("basicform", c);
      }
    }
    else
      render("basicform", c);
  }
};

int main(int argc, char **argv){
  try{
    cppcms::service app(argc, argv);
    app.applications_pool().mount(cppcms::applications_factory<hello>());
    app.run();
  }
  catch(std::exception const &e){
    cerr<<e.what() << endl;
  }
}

 4. Makefile

CXX=g++
CPPCMSTMPL=cppcms_tmpl_cc
LIBS=-lcppcms -lbooster

all: clean hello_form

hello_form: base_form.cpp basic_view.cpp content.h
	$(CXX) -Wall base_form.cpp basic_view.cpp -o hello_form ${LIBS}
basic_view.cpp: base_form.tmpl content.h
	$(CPPCMSTMPL) base_form.tmpl -o basic_view.cpp 
clean:
	rm -rf hello_form basic_view.cpp

 5. config.js

{ 
    "service" : {
	"api" : "fastcgi",
	"ip" : "127.0.0.1",
	"port" : 9000
    }
}
根据上述测试,不免有很多麻烦之处,比如在template中编写表单,在controller应用程序中,需要对表单的变量逐一进行解析。上述测试中,还没有加对表单数据的验证等。总之,编写起来比较繁琐。

不过,cppcms作者设计和实现了form的相关工具集用以解决传统表单交互的麻烦。

1. 在template中编写表单 —— 在cppcms template系统中定义了直接将form数据(model)转换成form视图(View)的构件(<% form as_p info %>),并且可以按照不同html_list_type方式形成不同类型的view.

2. 在content(model)中, 直接通过C++语言定义form表单,并且通过base_widgets类包包装了传统form的基础构件。其中新添加了numeric<T>组件,用以编制收集用户在表单输入数值,减少不必要的cast。另外,通过包装的widgets,还可以在此基础上,对用户录入数据进行验证。

3. widgets包装的每个form组件,都实现了load接口函数(纯虚函数,定义在base_form类中),这样用户只需要轻松调用load函数,实现request中表单数据的解析。

4. 通过form.h,即可看出cppcms眼中的form。一个form可以由多个sub-form组成,每个form都是由若干widget组成的。

因此,针对这样复杂的form,作者还提供了STL风格的form iterator,是不是很人性化啊。

 

分享到:
评论

相关推荐

    ORACLE ebs FORM开发中form个性化处理

    开发者需要理解并熟练运用Form Pers和其他相关工具,结合"FormPers_ML_RUP4.doc"、"个性化整理.doc"以及Metalink中的资源,以实现高效且灵活的Form个性化设置。这不仅能满足用户的个性化需求,也有助于保持系统的...

    Form1调用Form2 ,From2回传值或调用Form1内的方法。

    这在开发GUI应用程序时尤为常见,例如一个窗体(Form1)打开另一个窗体(Form2),然后Form2执行某些操作并返回结果给Form1,或者调用Form1中的方法。这个过程可以通过多种方式实现,其中一种常见且灵活的方法是使用...

    C# form1 ,form2 互相传值

    在C#编程中,Form1和Form2之间的数据传递是一个常见的需求,特别是在开发Windows桌面应用程序时。本主题将深入探讨如何在两个独立的窗体之间有效地传递数据,以实现Form1的TextBox控件值传递到Form2,以及Form2的...

    Form(汉化+注册)

    汉化版的Form使得中文用户在使用过程中能够更好地理解各项参数和功能,避免了语言障碍带来的困扰。汉化不仅仅是简单的翻译,还包括对软件界面、菜单、帮助文档等的本地化处理,使用户能更直观地理解和操作。这对于非...

    Form2调用Form1控件的解决方案

    接下来的问题是:如何实现在`Form2`中的某个操作能够反过来影响`Form1`中的某些控件状态或行为?这个问题在多窗体应用中十分常见且实用。 #### 解决方案概述 本文将详细介绍一种通过使用C#中的引用参数(`ref`)来...

    FORM表单中文乱码问题分析与解决

    例如,在网页中的ContentType指定了编码方式为UTF-8,那么FORM表单中的数据将被编码为UTF-8然后发送给服务器。 对中文的解码方式:然而,当服务器收到FORM表单中的数据时,默认情况下是用ISO-8859-1对中文进行解码...

    C# 不同Form之间值的传递

    在C#编程中,Form是Windows应用程序中用户界面的基本组件,常常需要在多个Form之间传递数据。本篇文章将深入探讨三种常见的在不同Form之间传递值的方法:公共变量、窗口调用以及构造函数。 1. 公共变量 公共变量是...

    Delphi 调用DLL文件中的FORM

    当DLL中包含有FORM(窗体)时,调用DLL文件中的FORM可以让应用程序在运行时加载并显示这部分界面。下面我们将详细探讨如何在Delphi中实现这个过程。 首先,理解DLL的基本概念。DLL是一种共享库,它包含可由多个程序...

    Form Builder切换中英文环境脚本

    标题中的“Form Builder切换中英文环境脚本”指的是一个用于构建表单的工具,它具有在中文和英文环境之间切换的功能。这样的脚本通常是为了帮助用户根据不同的语言需求来定制和展示表单内容。在软件开发中,尤其是...

    cppcms_forms.zip

    让我们深入探讨cppcms框架中的forms处理以及与MySQL的集成。 1. **cppcms Forms 概念** - 在Web开发中,表单(Forms)是用户与服务器交互的主要手段,用于收集和提交数据。 - cppcms提供了对HTTP请求,特别是POST...

    C#使用multipart/form-data示例

    通过理解以上知识点和查看示例代码,我们可以深入理解`multipart/form-data`的工作原理,并掌握如何在C#中不依赖特定库地处理此类请求。这不仅有助于提高我们的编程技能,也有助于解决那些不支持标准库的情况下的...

    在EBS FORM中上传文件

    在Oracle EBS(Enterprise Business Suite)系统中,EBS Form是一种常见的用户界面,用于与数据库交互,处理业务流程。在EBS Form中实现文件上传功能是企业日常操作中经常遇到的需求,例如上传合同、报表或其他业务...

    SpringMVC中form:select的使用

    在Spring MVC框架中,`form:select`是用于创建HTML选择元素(下拉列表)的标签,它极大地简化了在表单中处理选择项的工作。...通过理解和熟练使用`form:select`,可以提升开发效率,构建更加健壮和用户友好的Web应用。

    struts form 表单 用法

    Struts Form 表单是Apache Struts框架中的一个重要组成部分,用于处理HTTP请求并管理与之相关的数据。在Web开发中,表单是用来收集用户...理解并熟练运用Struts Form,对于构建基于Struts的MVC架构的Web应用至关重要。

    C# WinForm 在Panel中添加Form 教程+源码

    本教程将详细介绍如何在Panel中添加Form,并提供相关源码供参考学习。 首先,Panel控件是Windows Forms中的一种容器控件,它允许我们在其内部放置其他控件,包括Form。与MDI窗体相比,Panel控件提供了一个更加灵活...

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    在Form1中,有一个按钮Button1,当用户点击Button1时,会打开Form2,并将Form1中的某个文本框(textBox1)的内容传递给Form2。同时,我们将一个委托赋值给Form2的委托变量SetProperty,这个委托将用于在Form2中调用...

    在delphi 11.3 Form窗体的panel 中嵌入 Fmx窗体

    本知识点将详细探讨如何在VCL Form窗体的Panel组件中嵌入一个FMX窗体,以及相关的源代码实现。 首先,理解VCL和FMX的区别是关键。VCL是Delphi早期的UI库,主要针对Windows平台,而FMX则是后来推出的新一代跨平台UI...

    form-generator项目集成方案.doc

    在引入form-generator项目时,需要复制form-generator项目的components文件夹下的全部文件、uits文件夹下的所有文件以及views文件夹下全部文件到自己项目中,styles文件夹下全部文件复制到自己工程,icons文件夹下...

Global site tag (gtag.js) - Google Analytics