代码之家  ›  专栏  ›  技术社区  ›  cibercitizen1

如何访问Webrick服务的.rhtml页面的HTML请求参数?

  •  4
  • cibercitizen1  · 技术社区  · 14 年前

    我正在使用Webrick(内置的RubyWebServer)来服务.rhtml 文件(嵌入Ruby代码的HTML,如JSP)。

    它工作得很好,但我不知道如何访问参数 (例如) http://localhost/mypage.rhtml?foo=bar ) 在.rhtml文件的ruby代码中。 (请注意,我没有使用rails框架,只使用webrick+.rhtml文件)

    谢谢

    4 回复  |  直到 14 年前
        1
  •  3
  •   SztupY    14 年前

    根据erbhandler的源代码,它以如下方式运行rhtml文件:

        Module.new.module_eval{
          meta_vars = servlet_request.meta_vars
          query = servlet_request.query
          erb.result(binding)
        }
    

    所以绑定应该包含 query (包含查询字符串的哈希)和 meta_vars 变量(包含环境的散列,如 SERVER_NAME )您可以访问rhtml文件(以及 servlet_request servlet_response 可能也有,但我不确定)。

    如果不是这样,您也可以尝试查询cgi参数 ENV["QUERY_STRING"] 并解析它,但这只能作为最后的手段(而且它可能只对CGI文件有效)。

        2
  •  3
  •   cibercitizen1    14 年前

    这就是解决方案:

    (假设请求是 http://your.server.com/mypage.rhtml?foo=bar )

     <html>
    
        <body>
    
        This is my page (mypage.rhtml, served by webrick)
    
        <%
        # embedded ruby code
    
        servlet_request.query ["foo"] # this simply prints bar on console
    
        %>
    
        </body>
    
    </html>
    
        3
  •  1
  •   Jon Skeet    14 年前

    浏览 the documentation ,看起来你应该 HTTPRequest 从中可以获取查询字符串。然后你可以使用 parse_query 获取名称/值哈希。

    或者,可能只是打电话 query() 将直接给你哈希…我的红宝石付还不够,但你至少想试试看。

        4
  •  1
  •   duncan    14 年前

    您没有提供太多详细信息,但是我想您有一个servlet来服务将用erb处理的文件,并且默认情况下,Web服务器服务公共目录中的任何静态文件。

    require 'webrick'
    include WEBrick
    require 'erb'
    
    s = HTTPServer.new( :Port => 8080,:DocumentRoot    => Dir::pwd + "/public" )
    
    class MyServlet < HTTPServlet::AbstractServlet
      def do_GET(req, response)
        File.open('public/my.rhtml','r') do |f|
         @template = ERB.new(f.read)
        end
        response.body = @template.result(binding)
        response['Content-Type'] = "text/html"
       end
    end
    
    s.mount("/my", MyServlet)
    
    trap("INT"){
      s.shutdown
    }
    s.start
    

    这个例子是有限的,当您转到/my时,总是处理相同的文件。在这里,您应该根据请求路径构造文件路径。在这里我说了一个重要的词:“请求”,你所需要的一切都在那里。

    要获取HTTP头参数,请使用req[header_name]。要获取查询字符串中的参数,请使用req.query[param_name]。req是传递给servlet的httpRequest对象。

    一旦有了所需的参数,就必须将其绑定到模板上。在这个例子中,我们从self传递绑定对象(绑定是在内核中定义的,它表示代码执行的上下文),因此do-get方法中定义的每个局部变量都将在模板中可用。但是,您可以创建自己的绑定,例如在调用“result”时传递proc对象并将其传递给erb处理器。

    您的解决方案是:

      def do_GET(req, response)
        File.open('public/my.rhtml','r') do |f|
         @template = ERB.new(f.read)
        end
    
        foo = req.query["foo"]
        response.body = @template.result(binding)
        response['Content-Type'] = "text/html"
       end