Servlet总结

    xiaoxiao2021-03-25  120

    一、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)

    转载请注明原文地址: https://ju.6miu.com/read-14036.html

    最新回复(0)