组件:具有一定规范,实现部分功能的可以单独部署的软件模块。组件必须要部署到容器里面才能运行。
容器:符合一定规范,并且提供组件运行环境的程序
目的:为了让web服务器能够处理动态资源的请求(如:页面在进行js计算后动态拼出来的页面)
二、Servlet生命周期:实例化、初始化、就绪、销毁
1.何时实例化:接受到浏览器的请求或者启动Tomcat时(需要在web.xml文件中设置load-on-startup)
2.创建好servlet对象后会立即调用init()方法初始化servlet对象,同时使用ServletCofig对象作为参数传进init()。ServletConfig有getInitParameter()可以访问Servlet对象的初始化参数。初始化参数在web.xml文件中设置,
<Servelt>
<init-param>
<param-name>name</param-name>
<param-value>明超</param-value>
</init-param>
</Servlet>
使用String getInitParameter(String paramName)获取初始化参数
3.初始化后调用Web容器会自动调用service(),并且根据请求类型的不同(get/post),调用doGet和doPost方法,我们在写一个Servlet类时,要重写HttpServlet的Service(),Service()可以调用多次
4.销毁指的是Servlet容器在销毁Servlet对象是会调用destory()方法
三、转发
一个组件(Servlet/JSP)将未完成的处理通过容器转交给另一个web组件继续完成。常见的情况是:一个Servlet将数据处理完毕之后交给JSP展示
转发的特点:
1、转发的目的地只能是同一个应用内部的一个组件。
2、转发之后,浏览器地址栏的地址不变
3、转发所涉及的各个web组件可以共享一个request对象和response对象
转发和重定向的区别:
1、转发的目的地只能是同一个应用内部某个组件的地址,重定向则可以是任意地址
2、转发浏览器地址不变,重定向地址改变
3、转发所涉及的各个组件共享request对象,重定向不可以
4、转发是一件事情没有做完,重定向是已经做完
四、状态管理
将浏览器与WEB服务器之间的多次交互看成一个整体,并且将多次交互涉及的数据保存下来。
cookie:将数据保存在客户端,默认情况下:浏览器会将cookie保存在内存里,浏览器关闭,cookie销毁。可以使用
cookie.setMaxAge(int seconds)设置生存时间,当参数>0会保存在硬盘上。
cookie保存在浏览器上,对于数据来说不安全。
cookie只能存放少量数据(4K)
cookie只能存放String类型
session(会话):将数据保存在服务器,服务器会将空闲时间过长的session对象删除,服务器默认超时限制是30分钟
修改超时限制可以在Tomcat的web.xml文件中写:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
浏览器访问服务器,服务器会创建一个Session对象,该对象有一个唯一的ID号,sessionId.然后服务器默认使用set-cookie消息头将sessionId发送给浏览器,浏览器将SessionId保存在内存中。当浏览器再次访问服务器时,会将sessionId发送过去,服务器依据此ID查找之前创建的session对象。
五、过滤器
Servelt中定义的一组特殊组件,可以拦截Servlet容器的调用过程并进行相应的处理,某个过滤器只有一个实例,即单例模式。
如何写一个过滤器
1.写一个java类,实现Filter接口
2.在doFilter()中编写处理逻辑
3.配置过滤器
注意:Filter的xml配置要写在Servlet的xml配置前
例1:敏感词过滤
step1:创建comment.jsp
<form action="comment" method="post">
<input name="content"/><input type="submit" value="发表">
</form>
step2:创建CommentFilter1过滤器
public class CommentFilter1 implements Filter{
private FilterConfig config;
public CommentFilter1() {
system.out.println("Filter's constructor...");
}
public void init(FilterConfig fc)throws ServeltException{
syso(Filter1 is init...);
//因为init方法只执行一次,执行完毕参数fc会被销毁,所以将fc赋值给config属性,这样就可以在doFilter()中访问到Filterconfig对象了
config = fc;
}
public void destory(){
syso("destory....");
}
//容器会调用doFlter方法处理请求,如果调用了FilterChain的doFilter(),容器会继续调用后续的过滤器或者Servlet,没有调用FilterChain则不再后续调用
public void doFilter(ServletRequest req,ServletResponse res,FilterChain fc) throwsIOException,ServletException{
syso("doFilter is begin...");
HttpServletRequest req1 = (HttpServeltRequest) req;//强转为字接口是为了方便调用方法
HttpServletResponse res1 =(HttpServletResponse)res;
req1.setCharacterEncoding("utf-8");
String content = req1.getParameter("content");
res1.setContentType("text/html;charset="utf-8"");
PrintWriter out = res1.getWriter();
//通过FilterConfig对象读取初始化参数
String illegalStr = config.getInitParameter("illegalStr");
if(content.indexOf(illegalStr) !=-1){
out.println(<h1>评论当中有敏感字</h1>);
}else{
fc.doFilter(req1,res1)//无敏感字,向后调用
syso("commentFilter1.doFilter()执行完毕");
}
}
}
strp3:xml文件
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.CommentFilter1</filter-class>
<init-param>
<param-name>illegalStr</param-name>
<param-value>cat</<param-value>>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>CommentServlet</servlet-name>
<servlet-class>web.CommentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CommentServlet</servlet-name>
<url-pattern>/comment</url-pattern>
</servlet-mapping>
过滤器的优先级是按照xml文件中的filter-mapping的顺序调用
六:监听器
是servlet中定义的一组特殊的组件,用来监听容器产生的事件并进行处理。
容器会产生两大类事件:
1.Servelt生命周期相关事件:容器在创建或者销毁request,session,ServletContext对象所产生的事件。
2.绑定相关事件:容器在调用request,session,ServletContext的setAttribute,removeAttrivbute时产生的事件
ServletContext
在容器启动的时候,会为每一个应用创建一个符合ServletContext接口要求的对象(Servlet上下文),该对象一直存在,当容器关闭时被销毁
ServletContext的作用
1.绑定数据。setAttribute(),getAttribute(),removeAttribute().
request,session.ServletContext都提供了上述方法,如果满足使用条件,应优先选择生命周期短的request<session<ServletContext
2.访问全局的初始化参数
使用<context-param>配置初始化参数,使用String getInitParameter(String paramName),可以被同一个应用中的Servelt、Filter共享
3.依据逻辑路径(path)获得实际部署时的路径
String getRealPath(String Path)