浏览 2522 次
锁定老帖子 主题:mochiweb 学习笔记2
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-11
最后修改:2009-06-11
%% @spec init([]) -> SupervisorTree %% @doc supervisor callback. init([]) -> Ip = case os:getenv("MOCHIWEB_IP") of false -> "0.0.0.0"; Any -> Any end, WebConfig = [ {ip, Ip}, {port, 8000}, {docroot, skel_deps:local_path(["priv", "www"])}], Web = {skel_web, {skel_web, start, [WebConfig]}, permanent, 5000, worker, dynamic}, Processes = [Web], {ok, {{one_for_one, 10, 10}, Processes}}. 调用了skel_web:start([{ip,Ip},{port,8000},{docroot,"....priv/www"}])这个gen_server start(Options) -> {DocRoot, Options1} = get_option(docroot, Options), Loop = fun (Req) -> ?MODULE:loop(Req, DocRoot) end, mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]). get_option后得到的是 {"....priv/www",[{ip,Ip},{port,8000}]} Loop保存了当前模块的一个回调函数(有点类似与保存一个函数指针到变量,用于回调) 然后调用了 mochiweb_http:start([...]),传入的proplist 又增加了 {name, ?MODULE}, {loop, Loop} 这两项 start(Options) -> mochiweb_socket_server:start(parse_options(Options)). parse_options(Options) -> {loop, HttpLoop} = proplists:lookup(loop, Options), Loop = fun (S) -> ?MODULE:loop(S, HttpLoop) end, Options1 = [{loop, Loop} | proplists:delete(loop, Options)], %%上面3行,是取出传入的回调函数,然后又封装了一下,变成调用本模块的 %%loop函数,已之前保存的函数指针HttpLoop 为参数,并替换调list里面原来的那个 %%Loop函数指针 set_defaults(?DEFAULTS, Options1). %%set_defaults将预定义的一些参数添加到list中,如果里面没有定义,对于默认情况 %%就是现在的例子,这行代码等于没有,因为之前已经定义了name和port set_default({Prop, Value}, PropList) -> case proplists:is_defined(Prop, PropList) of true -> PropList; false -> [{Prop, Value} | PropList] end. set_defaults(Defaults, PropList) -> lists:foldl(fun set_default/2, PropList, Defaults). -define(DEFAULTS, [{name, ?MODULE}, {port, 8888}]). 启动 mochiweb_socket_server,传入的仍是一个list 这个list里存放了 ip:port 以及当前模块的一个回调函数指针,回调这个 loop(Socket, Body) -> inet:setopts(Socket, [{packet, http}]), request(Socket, Body). mochiweb_socket_server 先调用这个 start(Options) -> start(parse_options(Options)). 然后调用了这个 start(State=#mochiweb_socket_server{}) -> start_server(State); parse_options将传入的list,按指定格式存放到record中 -record(mochiweb_socket_server, {port, loop, name=undefined, max=2048, ip=any, listen=null, acceptor=null, backlog=30}). 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-17
好文,请问mochiweb的所有源代码是否只有src下那些?
|
|
返回顶楼 | |
发表时间:2009-06-17
src是mochiweb源代码,priv/skel是skelton的模板代码,用那个escript生成的是priv/skel的拷贝
|
|
返回顶楼 | |