action交互

action交互

https://www.cnblogs.com/dreamliner/archive/2009/05/30/1492434.html

mark

ASP

  1. 设计web页面,动态内容使用特定的asp过程名% func() %替代,也称其为一个占位符。
  2. 在某个.c文件中定义与asp过程对应的C函数
  3. 使用websAspDefine注册asp过程

函数原型

int AspProcName (int ejid, webs_t wp, int argc, chart_t **argv); 

ejid参数作为JavaScript解释器句柄可以用来调用JavaScript相关函数,例如ejGetVar和ejSetResult。wp参数作为浏览器连接的句柄,可以用来调用很多有用的GoAhead服务器函数,例如用来输出HTML语句的websWrite等。argc和argv包含传递给asp过程的实参的个数和内容。

例子

清单1中的<% UpdateProcInfor(); %>标签为例,此标签的目的是为了显示系统当前正在运行的进程的信息。

获取进程信息实际上是由位于ui.c中的UpdateProcInfo函数完成的,详见清单2,它负责获取系统进程信息,并格式化为HTML输出。

清单3中的websAspDefine函数将<% UpdateProcInfor(); %>标签与UpdateProcInfo函数关联起来,这样当GoAhead解析home.asp页面遇到<% UpdateProcInfor(); %>标签时,控制权就会跳转到UpdateProcInfor()函数,在输出以HTML格式表示的进程信息后,控制权转交给GoAhead继续解析home.asp页面。

//清单1:home.asp(省略了其它无关的部分,细节请参考附带源代码)
<html>
<head>
<% WriteMetaElement(); %>
</head>
…
<form action="/goform/UpdateConfig" method="post">
<input type="text" name="interval" value="" size="7" />
<input type="submit" name="ok" value="Update" />
<input type="reset" name="cancel" value="Reset" />
</form>
<% UpdateProcInfo(); %>
</html>
        
//清单2:ui.c
#include "ui.h"
#include "..\webs.h"
//以HTML格式输出系统当前进程信息
int UpdateProcInfo(int ejid, webs_t wp, int argc, char_t *argv)
{
return WriteProcPage(wp);
}
//根据用户输入改变刷新间隔时间设置
void UpdateConfig(webs_t wp, char_t *path, char_t *query)
{
int tmpInterval=atoi(websGetVar(wp, "interval", "-1"));
if(tmpInterval>3)
{
s_interval=tmpInterval;
}
websRedirect(wp, L"home.asp");
}

//清单3:main.c文件中的initWebs()函数
#include "ui.h"
//关联asp标签和C函数名字
websAspDefine(T("UpdateProcInfo"), UpdateProcInfo);
websAspDefine(T("WriteMetaElement"), WriteMetaElement);
//关联GoForms标签和C函数名字
websFormDefine(T("UpdateConfig"), UpdateConfig);

goaction

GoAction绑定到以/ action /开头的URI 。当客户端请求URI / action / NAME时,将调用操作处理程序,然后该操作处理程序将通过NAME查找GoAction定义并注册好后GoAction函数,就可以通过浏览器ip:port/action/exampleAction访问这个action

这个和asp的过程有点区别的,asp的是页面里面有asp过程,去调用asp过程

websDefineAction(“ buy”,buy);

jst的绑定是这样的

websDefineJst(“ outputTable”,outputMyTable);

其实,我理解的是form也是一个action,因为submit也是提交到一个指定/goform/xxx的网址执行函数xxx

这个和action是一样的可以看到源码 证实了这一点,也就是form是action实现的

#define websFormDefine websDefineAction

应该是新版用websDefineAction替换了websFormDefine,在官网的api已经没有websFormDefine

https://www.embedthis.com/goahead/doc/ref/api/goahead.html#group___webs_1ga16df3436fa7bff9179b1d278c24beef5

FORM交互

注意 新版使用action 在route.txt中使用uri=/action/

GoAhead实现了称为GoForms的标准的通用网关接口(CGI)处理用户提交的表单。与传统的CGI方法不同,GoForms过程不是为每个浏览器连接都创建一个新的进程,而是通过与GoAhead服务器共享地址空间,于是可以直接访问全部的请求上下文。GoForms处理器可以自动解析和访问所有的POST和查询数据,它也提供了一组API可以轻松访问CGI变量。

GoForms过程与ASP过程不同,它主要用来响应用户输入以更新系统设置或者执行特定的动作。在GoAhead中,GoForms实现为一个URL处理器,它会解释以"/goform"开始的URLs。紧跟着"goform"之后的字符串定义了表单名字和用户请求的细节。例如:“/goform/ UpdateConfig?interval=5”这个请求表示调用GoForms过程" UpdateConfig ",GoForms变量interval表示用户设置的新刷新间隔时间。GoAhead对ASP过程和GoForms过程的处理十分类似,只是GoForms过程通过websFormDefine函数调用进行关联,并且必须遵守原型void GoFormsProcName(webs_t wp, char_t *path, char_t *query);。完整的GoForms过程示例请参考列表1-3中的用来处理用户请求的UpdateConfig过程。

源码的句柄设置

initWebs()中定义: 
   websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);//这里设置form方式调用时候的文件位置 

C代码的注册

websFormDefine

C代码的实现原型

void GoFormsProcName(webs_t wp, char_t *path, char_t *query)

web的调用方式1

var objAction = "/goform/fun_me?account="+account+"&password="+password; 

web调用的方式2 使用submit

<form action="/goform/fun_me" method="post">
	<input type="submit" name="ok" value="Update" />
</form>

websFormDefine(T("fun_me"), fun_me);

数据传递

webs到客户端的数据基本通过websWrite写字符串的方式来通讯 
websGetVar(wp, T("sql"), T("")); //得到webs变量 
websWrite();//把字符串发送到浏览器    可以直接在网页调用的<% xxx() %>  的xxx直接输出
websDone(wp, 200);//用于form方式的调用

goahead将前端数据存在哪一个buf

goahead如何处理前端发过来的字符串。
网上的教程都是使用websGetVar对表单数据进行读取。
goahead将表单数据存放在wp->var这个hash表中,而对于json没有进行处理。
根据这个函数能够找到在http.c中,有一个websSetFormVars()它将wp->input的数据存在Var中。


goahead如何接受json字符串:
websSetStatus(wp,200);
websWriteHeaders(wp,-1,0);
websWriterHeader(wp,"Content-Type","application/text");
char*jsonString=wp->input.servp;
然后使用jsonc或者jsonrpc进行解析
posted @ 2019-12-27 19:58  zongzi10010  阅读(719)  评论(0编辑  收藏  举报