Servlet总结

一、Servlet是扩展Web服务器功能的组件规范。
组件:具有一定规范,实现部分功能的可以单独部署的软件模块。组件必须要部署到容器里面才能运行。
容器:符合一定规范,并且提供组件运行环境的程序

目的:为了让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)













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值