一、Servlet
Servlet是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的Servlet上进行处理。
Servlet的任务有:
- 接收请求数据:我们都知道客户端请求会被封装成HttpServletRequest对象,里面包含了请求头、参数等各种信息。
- 处理请求:通常我们会在service、doPost或者doGet方法进行接收参数,并且调用业务层(service)的方法来处理请求。
- 完成响应:处理完请求后,我们一般会转发(forward)或者重定向(redirect)到某个页面,转发是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,两者是有很大区别的。
1、Servlet的创建
Servlet可以在第一次接收请求时被创建,也可以在在服务器启动时就被创建,这需要在web.xml的< servlet>中添加一条配置信息 < load-on-startup>5< /load-on-startup>,当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,当是一个负数时或者没有指定时,则指示容器在该servlet被请求时才加载。
2、Servlet的生命周期方法
> void init(ServletConfig)
servlet的初始化方法,只在创建servlet实例时候调用一次,Servlet是单例的,整个服务器就只创建一个同类型Servlet
> void service(ServletRequest,ServletResponse)
servlet的处理请求方法,在servle被请求时,会被马上调用,每处理一次请求,就会被调用一次。ServletRequest类为请求类,ServletResponse类为响应类
> void destory()
servlet销毁之前执行的方法,只执行一次,用于释放servlet占有的资源,通常Servlet是没什么可要释放的,所以该方法一般都是空的
3、Servlet的其他重要方法
> ServletConfig getServletConfig()
获取servlet的配置信息的方法,所谓的配置信息就是WEB-INF目录下的web.xml中的servlet标签里面的信息
> String getServletInfo()
获取servlet的信息方法
4、Servlet的域对象
- ServletContext域对象:代表整个web应用,this.getServletContext()
- HttpSession 域对象:在第一次调用 request.getSession() 方法时,服务器会检查是否已经有对应的session,如果没有就在内存 中创建一个session并返回。
- HttpServletRequet域对象:在service 方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束
- PageContext域对象:整个JSP页面,是四大作用域中最小的一个。
5、ServletConfig对象
ServletConfig config=this.getServletConfig();
config.getServletName()//获取当前servlet在web.xml文件当中的配置名称
config.getInitParamater("String name");//获取当前Servlet配置当中的指定名称的初始化参数的值
config.getInitParameter();//获取当前servlet所有配置参数组成的一个枚举
ServletContext getServletContext()//获取当前web应用的ServletContext对象
6、转发和重定向
转发是服务器行为,重定向是客户端行为。转发是服务器将请求转给内部其他Servlet处理,而重定向是服务器将请求回复给客户端,客户端再重新发送一个请求给服务器。重定向发送了两次request请求。
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp
二、Filter
filter与servlet在很多的方面极其相似,servlet主要负责处理请求,而filter主要负责拦截请求,和放行。用来进行过滤请求或者做统一转换。例如登陆验证和编码格式转换。
url-mapping的写法
匹配规则有三种:
- 精确匹配 —— 如/foo.htm,只会匹配foo.htm这个URL
- 路径匹配 —— 如/foo/*,会匹配以foo为前缀的URL
- 后缀匹配 —— 如*.htm,会匹配所有以.htm为后缀的URL
- < url-pattern>的其他写法,如/foo/ ,/.htm ,/foo 都是不对的。
执行filter的顺序
如果有多个过滤器都匹配该请求,顺序决定于web.xml filter-mapping的顺序,在前面的先执行,后面的后执行
三、Listener
Listener就是监听器,当监听的内容发生变化时,就会触发对应的监听方法。
监听对象:Application、Session、Request
1、 ServletContext(监听Application)
¨ 生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
void contextInitialized(ServletContextEvent sce):创建Servletcontext时
void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时
¨ 属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
void attributeAdded(ServletContextAttributeEvent event):添加属性时;
void attributeReplaced(ServletContextAttributeEvent event):替换属性时;
void attributeRemoved(ServletContextAttributeEvent event):移除属性时;
2、HttpSession(监听Session)
¨ 生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
void sessionCreated(HttpSessionEvent se):创建session时
void sessionDestroyed(HttpSessionEvent se):销毁session时
¨ 属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
void attributeAdded(HttpSessionBindingEvent event):添加属性时;
void attributeReplaced(HttpSessionBindingEvent event):替换属性时
void attributeRemoved(HttpSessionBindingEvent event):移除属性时
3、ServletRequest(监听Request)
¨ 生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
void requestInitialized(ServletRequestEvent sre):创建request时
void requestDestroyed(ServletRequestEvent sre):销毁request时
¨ 属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
void attributeAdded(ServletRequestAttributeEvent srae):添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时