web学习
Posted zjsdbk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web学习相关的知识,希望对你有一定的参考价值。
本文接上文
一、ServletRequset接口
对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将他传递给service方法。ServletRequset封装了关于这个请求的信息。
ServletRequset接口中定义了一些方法:
getParameter是在ServletRequest中最常用的方法。该方法通常是用来返回HTML表单域的值,getParameter也可以用于获取查询字符串的值。
二、ServletResponse接口
javax.servlet.ServletResponse接口表示一个Servlet响应,在调用service方法之前Servlet容器首先创建一个ServletResponse的实例,并将他作为第二个参数传入到service方法中,ServletResponse隐藏了像浏览器发送响应的复杂过程。
在ServletResponse接口中,定义的方法之一是getWriter方法,该方法返回了一个可以向客户端发送文本的java.io.aPrintWriter。默认的情况下该对象采用的是ISO-8859-1的编码方式。
三、ServletConfig
当Servlet容器初始化Servlet的时候,Servlet容器会给Servlet的init方法传入一个ServletConfig的实例,该实例中封装了可以通过@WebServlet或者部署描述符传递给Servlet的配置信息
这样传入的每一条信息就是一个初始参数,一个初始参数有key合 value两个元件
为了从Servlet内部获取到初始参数的值,要在Servlet容器传给Servlet的init方法的ServletConfig中调用getInitParameter方法,getInitParameter方法的签名如下:
此外,getInitParameterNames方法则是返回所有初始化参数名称的一个Enumeration:
举个例子,当要获取contactName参数的值,要使用下面的方法签名
除了getInitParameter和getInitParameterNamespace之外,ServletConfig还提供了一个很有用的方法:getServletContext。利用这个方法可以从Servlet内部获取ServletContext。
四、ServletContext
ServletContext表示Servlet应用程序,每个应用程序只有一个上下文对象,当把一个应用程序同时部署到多个容器的分布式环境中的时候,每个jvm上面的Web应用程序都会有一个ServletContext对象。
通过ServletConfig中调用getServletContext方法,可以获得ServletContext实例,有了ServletContext就可以共享从应用程序中所有资料处访问到的信息,并且可以动态的注册web对象,前者将对象保存在ServletContext内部的Map中,
保存在ServletContext中的对象被称作为属性
ServletContext中的以下的方法负责处理属性:
五、GenericServlet抽象类
GenericServlet实现了Servlet和ServletConfig两个接口,并且完成了以下任务:
1、将init方法中的ServletConfig付给一个类级的变量,以便可以通过调用getServletConfig获取,
2、将接口中的所有方法提供默认实现,
3、提供方法,包围ServletConfig中的方法
六、HttpServlet
HttpServlet类覆盖了javax.servlet.GenericServletl类,在使用HttpServlet的时候,还要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。
HttpServletRequest接口扩展了javax.servlet.ServletRequest,HttpServletResponse接口扩展了javax.servlet.ServletResponse。
HttpServlet覆盖了GenericServlet中的service方法,并且通过下面的签名再添加一个service方法:
protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,java.io.IOException
新的service方法和javax.servlet.Servlet中的service方法之间的区别在于参数列表不同
python web学习1初识tornado框架
1、初识tornado
什么是tornado: 全称为Tomado Web Server是一种Web服务器软件的开源版本。
特点:作为Web框架,是个轻量级的Web框架,类似于另一个Python Web框架爱Web.py,其用于异步非阻塞IO的处理方式;作为Web服务器,Tomado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tomado 和其他的Python Web应用框架进行对比,结果最大浏览量超过第二名近40%。
使用场景:用户量达,高并发(12306、web游戏服务器);大量的HTTP持久连接,即a)使用同一个TCP连接来发送和接收多个HTTP请求/应答而不是为每一个新的请求/应答打开新的连接的方法b)对于HTTP1.0,可以在其请求头的包(header)中添加Connection:Keep-Alive= c)对于HTTP1.1,所有的连接默认都是持久连接。
C10K:上面的高并发问题,通常使用C10K这一概念进行描述。C10K---Concurrently handling ten thousand connections,即并发10000个连接。对于单台服务器而言,根本无法承担,而采用多台服务器分布式又意味着高昂的成本。
性能:Tomado再设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其称为一个拥有非常高性能的解决方案(服务器与框架的集合体)。
Django和tornado的对比:
2、tornado的安装
Tornado应该运行在类Unix平台,在线上部署时为了最佳的性能和扩展性。进退间linux和DSB(因为充分利用Linux的epoll工具和BSD的kqueue工具,是Tornado不依靠多进程/多线程而达到高性能的原因)。
对于MAC OS系统,虽然也是衍生自BSD并且支持kqueue,但是其网络性能通常不太给力,因此只推荐开发使用。
对于Windows,Tornado官方并没有提供配置支持,但是也可以运行起来,不过仅推荐在开发中使用。
3、第一个tornado程序
[代码3-1]
1 import tornado.web 2 import tornado.ioloop 3 4 # 类比于Django中的视图,即一个业务处理类 5 class IndexHandler(tornado.web.RequestHandler): 6 # 只能处理get请求 7 def get(self, *args, **kwargs): 8 # write对应http请求的方法,给浏览器响应信息 9 self.write("test tornado") 10 11 12 if __name__ == \'__main__\': 13 # 实例化一个app对象 14 # Applicaiton:是tornado web框架的核心应用类,是与服务器对应的接口 15 # 里面保存了路由映射表,有一个listen方法,是用来创建一个http服务器的实例 16 # 并绑定了端口(监听端口),注意此时并没有开启监听 17 app = tornado.web.Application([ 18 (r"/", IndexHandler) 19 ] 20 ) 21 app.listen(8000) 22 # IOLoop.current():返回当前线程的IOLoop实例 23 # IOLoop.start():启动IOLoop实例的I/O循环,同时开启了监听 24 tornado.ioloop.IOLoop.current().start()
[代码3-2]
1 import tornado.web 2 import tornado.ioloop 3 import tornado.httpserver 4 5 # 类比于Django中的视图,即一个业务处理类 6 class IndexHandler(tornado.web.RequestHandler): 7 # 只能处理get请求 8 def get(self, *args, **kwargs): 9 # write对应http请求的方法,给浏览器响应信息 10 self.write("test tornado") 11 12 13 if __name__ == \'__main__\': 14 app = tornado.web.Application([ 15 (r"/", IndexHandler) 16 ] 17 ) 18 httpServer = tornado.httpserver.HTTPServer(app) 19 # 将服务器绑定到指定的端口 20 httpServer.bind(8000) 21 # 参数1表示此时只启动一个进程,默认也是开启一个进程,值大于0,表示创建多个进程, 22 # 值为None或者小于等于0,将开启对应cpu个数的进程 23 httpServer.start(1) 24 tornado.ioloop.IOLoop.current().start()
上述两份代码是等同的,代码3-2可以用于创建多进程。
另外需要注意的是:
(1)app.listen()方法只能在单个进程中使用。
(2)虽然tornado给我们提供了一次性启动多个进程的方式[代码3-2],但是由于一些原因,不建议使用上面的方式启动多进程,而是采用手动的方式。具体的原因如下:
①每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会影响所有的子进程。
②所有的子进程douyou一个命令启动的,无法做到在不停止服务的情况下修改代码。
③所有进程共享一个端口,想要分别监控很困难。
4、tornado的options模块
用来定义options选项变量的方法,定义的变量可以在全局的tornado.options.options中获取使用,主要的传入参数:
- name 选项变量名,须保证全局唯一性,否则会报“Option \'xxx\' already defined in ...”的错误;
- default 选项变量的默认值,如不传默认为None;
- type 选项变量的类型,从命令行或配置文件导入参数的时候tornado会根据这个类型转换输入的值,转换不成功时会报错,可以是str、float、int、datetime、timedelta中的某个,若未设置则根据default的值自动推断,若default也未设置,那么不再进行转换。可以通过利用设置type类型字段来过滤不正确的输入。
- multiple 选项变量的值是否可以为多个,布尔类型,默认值为False,如果multiple为True,那么设置选项变量时值与值之间用英文逗号分隔,而选项变量则是一个list列表(若默认值和输入均未设置,则为空列表[])。
- help 选项变量的帮助提示信息,在命令行启动tornado时,通过加入命令行参数 --help 可以查看所有选项变量的信息(注意,代码中需要加入tornado.options.parse_command_line())。
tornado.options.options
全局的options对象,所有定义的选项变量都会作为该对象的属性。
tornado.options.parse_command_line()
转换命令行参数,并将转换后的值对应的设置到全局options对象相关属性上。追加命令行参数的方式是--myoption=myvalue
新建opt.py,我们用代码来看一下如何使用:
1 # coding:utf-8 2 3 import tornado.web 4 import tornado.ioloop 5 import tornado.httpserver 6 import tornado.options # 新导入的options模块 7 8 tornado.options.define("port", default=8000, type=int, help="run server on the given port.") # 定义服务器监听端口选项 9 tornado.options.define("itcast", default=[], type=str, multiple=True, help="itcast subjects.") # 无意义,演示多值情况 10 11 class IndexHandler(tornado.web.RequestHandler): 12 """主路由处理类""" 13 def get(self): 14 """对应http的get请求方式""" 15 self.write("Hello Itcast!") 16 17 if __name__ == "__main__": 18 tornado.options.parse_command_line() 19 print tornado.options.options.itcast # 输出多值选项 20 app = tornado.web.Application([ 21 (r"/", IndexHandler), 22 ]) 23 http_server = tornado.httpserver.HTTPServer(app) 24 http_server.listen(tornado.options.options.port) 25 tornado.ioloop.IOLoop.current().start()
执行如下命令开启程序:
$ python opt.py --port=9000 --itcast=python,c++,java,php,ios
以上是关于web学习的主要内容,如果未能解决你的问题,请参考以下文章