Servlet相关

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值