跳过Http协议ヾ(o・ω・)ノ,上课笔记如下:
Servlet快速入门:(1)写一个java程序实现Servlet接口或者继承实现Servlet接口类(2)将编译好的带包的.class放到WEB-INF/classes下以外,还要配置web应用的 web.xml注册Servlet。
Servlet的生命周期:Servlet第一次被访问在内存中创建对象,在创建后立即调用init()方法进行初始化,对每次请求用service(req,res)方法处理请求,此时会用Request对象封装请求信息,并用Response对象(最初是空的)代表响应信息,传入service方法里使用,当service方法处理完后,返回服务器服务器根据Response中的信息组织响应消息返回给浏览器。响应结束后servlet并不销毁,一直留在内存中等待下一次请求。直到服务器关闭或web应用被移除虚拟主机,servlet对象销毁前调用destroy方法善后。
通常我们只需要直接继承HttpServlet。
Servlet细节:
(1)一个
(2)url-partten中的路径可以使用*匹配符号进行配置,但是要注意,只能是/开头/*结尾或*.后缀这两种方式
~由于*的引入,有可能一个路径被多个urlpartten匹配,这是优先级判断条件如下:
哪个最像找哪个
*.后缀永远匹配级最低
(3)
(4)缺省Servlet:如果有一个Servlet的url-partten被配置为了一根正斜杠,这个Servlet就变成了缺省Serlvet.其他Servlet 都不处理的请求,由缺省Servlet来处理.
其实对于静态资源的访问就是由缺省Servlet来执行
设置404页面500页面等提示页面也是由缺省Servlet来执行
通常我们不会自己去配置缺省Servlet
(5)线程安全问题
由于默认情况下Servlet在内存中只有一个对象,当多个浏览器并发访问Servlet时就有可能产生线程安全问题
解决方案:
加锁--效率降低
SingleThreadModel接口 -- 不能真的防止线程安全问题
最终解决方案:在Servlet中尽量少用类变量,如果一定要用类变量则用锁来防止线程安全问题,但是要注意锁住内容应该是造成线程安全问题的核心代码,尽量的少锁主内容,减少等待时间提高servlet的响应速度.
ServletConfig --代表当前Servlet在web.xml中的配置信息
String getServletName() -- 获取当前Servlet在web.xml中配置的名字
String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值
Enumeration getInitParameterNames() -- 获取当前Servlet所有初始化参数的名字组成的枚举
ServletContext getServletContext() -- 获取代表当前web应用的ServletContext对象
ServletContext --代表当前web应用
1,作为域对象可以在整个web应用范围内共享数据。
2,用来获取web应用的初始参数。
3,实现Servlet的转发--重定向:302+Location(两次请求两次响应)。请求转发:服务器内不进行资源流转(一次请求一次响应)。
4,getRealPath方法--在这个方法中传入一个路径,这个方法的底层会在传入的路径前拼接当前web应用的硬盘路径从而得到当
前资源的硬盘路径,这种方式即使换了发布环境,方法的底层也能得到正确的web应用的路径从而永远都是正确的资源的路径。