zoukankan      html  css  js  c++  java
  • action交互


    title: action交互
    date: 2019/12/21 15:17:28
    toc: true

    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进行解析
    
  • 相关阅读:
    sql练手
    简单工厂模式和抽象工厂模式的区别:面向接口编程
    UML中聚合和组合的关系(笔记)
    如何修改SQL Server 2005服务器名称 (装载)
    .NET 图片处理剪裁
    sql server 中的汉字转化为拼音
    sql server while, case,if..else ... try catch ..对象
    String 和 StringBuilder 的相同点和不同点
    sql 折分字符串并修改数据库表中数据
    SQL Server 与 Excel,Access 数据表的导入导出(注:参照博园.NET大观)
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/12109387.html
Copyright © 2011-2022 走看看