Servlet(server与applet的缩写)
1、什么是Servlet?
servlet与普通的java程序不同,他是运行在web应用服务器上的Java程序,可以对web浏览器或其他Http客户端程序发送的请求进行处理
~servlet容器(WEB容器,例如tomcat)是web服务器或者应用程序服务器的一部分,用于在发送请求和响应上提供网络服务。
~servlet是基于servlet容器(servlet引擎)实现的,由容器来实例化和调用Servlet的方法,servlet容器包含和管理servlet的生命周期
servlet不仅约束了服务器如何实现规范,也约束着java web项目的结构
Note:有了servlet之后,用户通过点击某个链接或者在浏览器的地址栏中输入URL来访问servlet,web容器接收到请求之后,并不是直接将请求交给servlet,而是先交给servlet容器,servlet容器实例化servlet,调用servlet的一个特定方法对请求进行处理,并产生一个响应,这个响应有servlet容器返回给Web容器,web容器包装这个响应,以http响应形式发送给浏览器
2、servlet的作用?
(1)通信支持:利用容器提供的方法,你能轻松的让 Servlet 与 web 服务器对话,而不用自己建立 serversocket 、监听某个端口、创建流等。容器知道自己与 web 服务器之间的协议,所以你的 Servlet 不用担心 web 服务器(如Apache)和你自己的 web 代码之间的 API ,只需要考虑如何在 Servlet 中实现业务逻辑(如处理一个订单)。
(2)生命周期管理:Servlet 容器控制着 Servlet 的生与死,它负责加载类、实例化和初始化 Servlet ,调用 Servlet 方法,以及使 Servlet 实例被垃圾回收,有了 Servlet 容器,你不需要太多的考虑资源管理。
(3)多线程支持:容器会自动为它所接收的每个 Servlet 请求创建一个新的 java 线程。针对用户的请求,如果 Servlet 已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。
(4)声明方式实现安全:利用 Servlet 容器,你可以使用 xml 部署描述文件来配置和修改安全性,而不必将其硬编码写到 Servlet 类代码中。
(5)JSP支持(将jsp翻译为真正的java代码):Servlet容器负责将 jsp 代码翻译为真正的 java 代码。
3、在web容器中,servlet主要经历的4个阶段:
(1)在web容器启动或者客户机第一次请求服务时,容器加载servlet,并将其放入servlet实例化池
(2)当实例化结束后,容器将调用Servlet对象的init()方法完成Servlet的初始化操作
(3)容器通过servlet的service()方法处理客户端请求,在Service()方法中,servlet实例根据不同的http请求作出不同的处理,并在处理之后作出相应的响应
(4)在web容器关闭时,容器调用servlet对象的destroy()方法对资源进行释放,在调用此方法后该servlet对象就会被垃圾回收器回收
4、servlet为什么是单例的?每次访问请求对象和响应对象都是新的?线程安全问题?
(1)浏览器多次对servlet的请求,一般情况下,服务器只创建一个servlet对象,也就是说一旦一个servlet对象被创建,机会驻留在内存中,为后续请求做服务,直至服务器关闭
(2)每次访问请求对象,servlet引擎都会创建一个新的HttpServletRequest,请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
request对象代表http请求,我们获取浏览器提交过来的数据,就找request,response代表http响应,向浏览器输出数据,找response对象
(3)当多个用户访问servlet的时候,服务器会为每个用户创建一个线程,当多个用户并发访问servlet共享资源的时候就会出现安全问题
原则:
①当一个变量需要被多个用户共享,则应当在访问该变量的时候,加同步机制Synchronized
②如果一个变量不需要共享,则直接在doGet()或者doPost()定义,这样就不会存在线程问题
5、Get与Post的区别:
(1)Get:
①暴露请求信息,不安全
②请求信息大小不能超过1kb,上传信息有限,不可以上传图片
③请求速度快
(2)Post
①隐藏了请求信息,比较安全,但是1也可以通过相关工具访问到数据
②post方式没有限制请求数据的大小,可以做图片上传
6、关于请求中文乱码的处理
(1)对于post请求,可以设置编码方式:request.setChatacterEncoding("UTF-8");
注意:必须在获取第一个参数之前设置,并且该方法只对post方式有效
(2)对于get请求
重新设置Tomcat的编码方式,修改Tomcat配置文件:Tomcat根目录/conf/server.xml(修改端口的那一行)设置为UTF-8
7、Servlet的一些细节问题
(1)一个servlet可以有多个
(2)配置Servlet可以使用通配符(*)
(3)自定义的servlet中的
(4)可以将servlet的初始化操作向前移,配置
8、servlet注解
这是Servlet3.0提出的新特性,支持注解配置,大大简化了工作
本来servlet的配置需要这么写
有了注解配置之后,我们就可以这么做:
也可以省略name,直接写url为:@WebServlet("/foreServlet")