一、三种作用域
作用域:web开发中用于存储和获得数据。
1、request
一次请求有效,在forward跳转时可用request作用域传递数据。
2、session
client不变,session不变。用于标记用户状态、存储用户数据、验证码、购物车等。
3、ServletContext
web应用不变,ServletContext不变,ServletContext代表的是整个web应用。一般用于储存全web单例的重量级资源。
ServletContext对象通过session获得,ServletContext ctx = session.getServletContext();
二、连接池
作用:原有JDBC的开发过程中,通过Class.forName等代码创建的连接,是现用现创建,系统效率低(Connection等资源的创建需要开启IO,只要涉及到IO操作,其效率一般都相对比较低下),所以产生了连接池。本质上就是预先创建一些连接存储起来,用户需要访问数据时,直接从连接池中获得已经创建好的连接,用完之后再归还到连接池。这样就减少了连接创建过程中的性能损失,提高系统的运行效率。
1、tomcat的连接池的弊端
不能应用main测试,也不能应用junit测试。测试代价太大。
2、项目中使用的连接池,一定不是web容器连接池(tomcat、weblogic等),建议使用第三方连接池:框架连接池。
三、Filter过滤器
作用:Filter解决的是多个Servlet中所存在的公有代码的冗余问题,引入Filter之后,把多个Servlet的冗余代码,提取到Filter中,那样用户的请求就会先经过Filter,然后再访问后续的Servlet。既能保证用户功能的完成,同时也解决了代码的冗余问题。
1、开发步骤
a、implements Filter 实现Filter接口
public class MyFilger implements Filter{ @Override public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){ System.out.println("--------MyFilter invoke before request-------"); chain.doFilter(request,response); System.out.println("--------MyFilter invoke after response--------"); } }
Filter不仅可以拦截request,还可以拦截reponse。在doFilter()方法中有一个参数为FilterChain对象,FilterChain.doFilter(request,response)方法意味着将request传递给后续的Servlet,所以,在该方法之间的代码会在request之前执行,而Servlet所相应的response,也会在执行完Filter中的该方法之后的代码后才响应回client。
b、在web.xml中配置Filter
<servlet> <servlet-name>targetServlet</servlet-name> <servlet-class>com.liquidxu.servlet.TargetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>targetServlet</servlet-name> <url-pattern>/target</url-pattern> </servlet-mapping> <filter> <filter-name>myFilter</filter-name> <filter-class>com.liquid.filter.MyFilter</filter-class> </filter> <filter-mappine> <filter-name>myFilter</filter-name> <url-pattern>target</url-pattern> </filter-mapping>
filter的写法跟servlet的写法基本一致,但是需要注意的是,servlet的url-pattern是该servlet的访问路径,而filter想拦截哪个servlet,就将自己的url-pattern写的跟该servlet的url-pattern一致即可。
如果该filter想拦截所有的请求,该filter的url-pattern写成/*即可。
如果该filter想批量拦截对Servlet的请求,则需要修改Servlet的url-pattern。例如,Servlet1的url-pattern为/admin/targer1,Servlet2的url-pattern为/admin/target2,这样将该filter的url-pattern写成/admin/*,这样就可以同时过滤到Servlet1和Servlet2了。
2、存在的问题
Filter默认只过滤用户的直接请求或者redirect的请求,而不过滤forward跳转。
解决方案:
<filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>target</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
只需在filter-mapping节点下加入此内容即可。
四、Servlet内容拾遗
1、Servlet的创建
Servlet对象为一种类型只创建一个对象提供服务,所以Serlvet对象为单例。
多个线程访问同一个Servlet对象,Servlet是没有成员变量的,因此可以保证线程安全。
2、Servlet的生命周期
a、默认用户第一次访问的时候会创建Servlet。
b、Tomcat启动的时候Servlet也可能会被创建,不过需要配置web.xml文件如下:
<servlet> <serlvet-name>targetServlet</servlet-name> <servlet-class>com.liquidxu.servlet.TargetServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
c、Servlet创建以后,会调用一次init方法,完成初始化处理。
d、Servlet的service方法对外提供服务,每一次请求都会调用。
e、Servlet会在销毁之前调用destory方法。
3、Servlet规范组件的启动顺序
ServletContextListener----->Filter----->Servlet
4、Servlet的核心实现原理
用户请求该Servlet的时候,tomcat通过用户请求的url-pattern通过查找web.xml文件中的内容,获得该url-pattern所对应的Servlet的全限定名。然后利用该Servlet类的全限定名便可以通过反射创建出该Servlet类的对象,之后便调用该Servlet类的service方法来进行服务。