web学习
Posted zjsdbk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web学习相关的知识,希望对你有一定的参考价值。
ServletAPI中有4个Java包:
1、javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口
2、javax.servlet.http:其中包含定义HTTPServlet和Servlet容器之间契约的类和接口
3、javax.servlet.annotation: 其中包含Servlet、Filter、Listener的标注,它还为被标注元件定义元数据
4、javax.servlet.descriptor :其中包含提供程序化登录web应用程序的配置信息的类型。
二. Servlet技术概述
Servlet技术的核心是Servlet接口,他是所有Servlet类必须直接或间接实现的一个接口,在编写实现Servlet的Servlet类的时候是直接实现它,在扩展实现这个接口的类的时候就是间接实现它。
Servlet接口中定义了Servlet与Servlet容器之间的契约,这个契约归结起来就是:Servlet容器将Servlet类加载到内存,并在Servlet类的实例上调用具体的方法。在一个应用程序中每种Servlet类种只能有一个实例。
用户请求致使Servlet容器调用了Servlet类种的service方法,并且传入一个ServletRequest实例和一个ServletResponse的实例,ServletRequest中封装了当前的HTTP请求,
因此Servlet开发人员不必解析和操作原始的HTTP请求数据.ServletResponse表示=当前用户的HTTP响,使得将响应发回客户端变得十分容易.
对于每一个应用程序,Servlet容器还会创建一个Servlet Context的实例,这个对象中封装了上下文的环境详情,每个上下文只有一个ServletContext.每个Servlet示例也都有一个封装Servlet配置的ServletConfig
三, Servlet接口
Servlet接口中定义了5个方法:
1、void init(ServletConfig config) throws ServletException
2、void service(ServletRequest request, ServletResponse response) throws ServletException,java.ioi.IOException
3、void destroy()
4、java.lang.String getServletInfo()
5、ServletConfig getServletConfig()
这里需要注意的是,在编写Java方法签名的时候,对于与包含该方法的类型不处于同一个包中的类型的时候要使用类的全名.所以在service方法中javax.servlet.ServletException的签名中可以不用写包的名称,但是java.io.IOException则要编写完整的类名称.
在这五个方法中,init、service和destroy是生命周期方法.Servlet容器根据以下规则调用这三个方法:
init: 当Servlet第一次被请求的时候Servlet容器会调用这个方法,在后续的请求中不会被再次调用
service: 每当请求Servlet的时候多会调用一次
destroy: 当销毁Servlet的时候,该方法被调用.
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学习的主要内容,如果未能解决你的问题,请参考以下文章