JavaWeb 博客
http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/
监听器>过滤器>serlvet,配置的时候要注意先后顺序
监听器 观察者模式
Servlet 单例模式 装饰器模式 模板模式 工厂模式 外观模式
过滤器 责任链模式
Servlet url-pattern 路径配置有三种方式
<url-pattern>/ServletCode</url-pattern>
<url-pattern>/*</url-pattern> /user/*
<url-pattern>*.do</url-pattern>
<url-pattern>/</url-pattern>
具体匹配规则详解:
https://www.cnblogs.com/canger/p/6084846.html
同一个Servlet init方法执行一次
ServletContext 是代表了Servlet应用程序。每个Web应用程序只有一个ServletContext ,所以可实现如下等功能
1. ServletContext 可以实现不同Servlet之间的通讯
2. ServletContext 可以实现请求转发
3. ServletContext对象读取资源文件
ServletContext 可以实现不同Servlet之间的通讯
<!-- 配置WEB应用的初始化参数 --> 6
<context-param> 7
<param-name>url</param-name> 8 <param-value>jdbc:mysql://localhost:3306/test</param-value> 9 </context-param>
获取url参数
ServletContext 可以实现请求转发
访问的是ServletContextDemo4,浏览器显示的却是ServletContextDemo5的内容,这就是使用ServletContext实现了请求转发
ServletConfig 封装可以通过@WebServlet或者web.xml传给一个Servlet的配置信息,以这种方式传递的每一条信息都称做初始化信息,初始化信息就是一个个K-V键值对。为了从一个Servlet内部获取某个初始参数的值,init方法中调用ServletConfig的getinitParameter方法或getinitParameterNames方法获取,除此之外,还可以通过getServletContext获取ServletContext对象
例如:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
@WebServlet(name = "filterServlet", urlPatterns = { "/myApp" }, initParams = {
@WebInitParam(name = "user", value = "xiaobai"), @WebInitParam(name = "email", value = "xiaobai@example.com")
Tomcat 启动时 将Servlet 包装成 Wrapper对象
Request对象可以获取浏览器发送的参数和相关地址信息如url 项目名称 参数数据等有inputStream对象
Response 有OutputStream输出数据 可实现文件下载功能
Response 可实现图片验证码功能
response 可以重定向
重定向:客户端( 浏览器)重新请求
转发: 服务器请求另一资源
Servlet 线程不安全 单例=可以从init只执行一次看到 Servlet是单例多线程
在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择
1.实现 SingleThreadModel 接口
该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销,在现在的Servlet开发中基本看不到SingleThreadModel的使用,这种方式了解即可,尽量避免使用
2.同步对共享数据的操作
使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,可以通过同步块操作来保证Servlet的线程安全。如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码
3.避免使用实例变量
线程安全问题很大部分是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的
Java 内存模型中,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全
局部变量线程安全的原因:
多线程下每个线程对局部变量都会有自己的一份copy,这样对局部变量的修改只会影响到自己的copy而不会对别的线程产生影响,线程安全的
相关博客:
https://blog.csdn.net/qq_24145735/article/details/52433096
过滤器实现Filter 接口 init 方法 项目启动时完成初始化 doFilter 具体过滤逻辑 chain.doFilre(req,resp)执行被拦截代码 destory
Filter 线程安全问题和Servlet一样 都是单例的
java监听器Listener
监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等
按监听的对象划分,可以分为
ServletContext对象监听器
HttpSession对象监听器
ServletRequest对象监听器
按监听的事件划分
对象自身的创建和销毁的监听器
对象中属性的创建和消除的监听器
session中的某个对象的状态变化的监听器
相关连接
https://www.cnblogs.com/ygj0930/p/6374384.html
https://www.cnblogs.com/w-wfy/p/6425357.html
getAttribute与getParameter的区别
这部分是对JSP的扩展,经常在JSP或者Servlet中获取数据,那么getAttribute与getParameter有什么区别呢?
1 从获取到数据的来源来说:
getAttribtue获取到的是web容器中的值,比如:
我们在Servlet中通过setAttribute设定某个值,这个值存在于容器中,就可以通过getAttribute方法获取;
getParameter获取到的是通过http传来的值,比如这样一个http请求:
http:localhost:8080/test/test.html?username=xingoo
还有其他的GET和POST方式,都可以通过getParameter来获取。
2 从获取到的数据类型来说:
getAttribute返回的是一个对象,Object。
getParameter返回的是,前面页面中某个表单或者http后面参数传递的值,是个字符串
Servlet3.0版本:
新增注解:@WebServlet @WebFilter @WebListener @WebInitParam @MultipartConfig 等Servlet Filter等的实现,不用在web.xml进行配置
相关面试题:
https://blog.csdn.net/t0404/article/details/51893265