Servlet学习笔记

Servlet的基础概念

1.  Servlet是什么?
答:1) 模块化的程序,运行在服务器端,增强了请求/响应导向服务;
    2) 应用示例:
       a. 访问远端对象;
       b. 跟踪大量信息;
       c. 多用户协作

2.  HTTP和Servlets
答:1) Servlet是HTTP协议中作为CGI的一个替代品;
    2) HttpServlet类用于开发HTTP为基础的Servlet

3.  HttpServlet
答:1) 继承抽象类javax.servlet.GenericServlet,实现接口Java.io.Serializable;
    2) 用以开发Http协议为基础的Servlet

4.  服务方法
答:1) 每当服务接收到对Servlet的请求时,服务器就会产生一个新线程,并调用Service。service方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并相应地调用doGet、doPost、doPut、doDelete等。
    2) doGet/doPost方法接收HttpServletRequest和HttpServletResponse对象。
    3) 99%的时间里,只需注意GET和/或POST请求;
    4) 没有任何doHead方法。

5.  返回响应
答:1) PrintWriter out = response.getWriter                 // 用于返回文本数据给客户端
    2) ServletOutputStream out = response.getOutputStream   // 用于返回二进制数据给客户端

6.  支持Servlet的Web服务器
答:1) J2EE应用服务器包括:Web Container和EJB Container;
    2) Web Container的Servlet Engine提供对Servlet的运行支持;

                                                                                
     星期五      晴

用Servlet处理表单数据

1. Form元素的属性
答:1) ACTION: 用来指定要处理FORM数据的Servlet的URL,也可以指定FORM数据将要发送到的电子邮件;
    2) METHOD: 指定数据传送给HTTP服务器的方法;
    3) ENCTYPE: 指定数据在传输之前进行编码的方式, 例multipart/form-data 编码将每个字段作为MIME可兼容的文档的单独部分传输。

2. 解析请求
答:1) 对于所有的请求:
       a. getParameterNames: 以Enumeration形式获取表单中清单, 每一项都可以转换成String;
       b. getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null;没有任何值,返回空String);
       c. getParameterValues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组);


Servlet的生命周期

1.  Servlet的生命周期
答:1) 通过web Container装载(J2EE的组件都是被动地装载入Container)并实例化Servlet对象;
    2) 调用init()方法(在整个生命周期中只被调用一次);
    3) 调用service()方法(在整个生命周期中可被调用多次);
    4) 调用destroy()方法(在整个生命周期中只被调用一次);

2.  init方法
答:1) 当首次创建Servlet时就会调用init方法, 而不是每个用户请求都会调用该方法。
    2) 除非被destroy方法移除,否则不能被重载;
    3) init方法一结束,servlet即可接受客户端请求;
    
3.  init方法实例
答:1) 在编写接受ServletConfig作为参数的init方法时,应该总是在首行调用super.init;
    2) init方法接受ServletConfig作为参数, 用以下方法获得参数值:
       a. getInitParameter: 返回指定参数名称对应的值,如果参数不存在,返回null;
       b. getInitParameterNames: 返回指定参数名称对应的值枚举,如果参数不存在,返回的空枚举;


      星期一      阴

3.  service方法
答:1) 每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程, 并调用service。service方法检查HTTP请求类型,请相应地调用doGet、doPost、doPut、doDelete。
    2) 被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest);

4.  Servlets的多线程安全
答:1) 多线程占用资源少,处理速度快,提高了效率。
    2) 一些编码建议:
       a. 对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题;
       b. 同步化所有访问重要数据的实例变量;
       c. 创建访问类变量的访问方法。

5.  SingleThreadModel接口
答:1) 如果希望禁止多线程访问,可以让Servlet使用SingleThreadModel接口:
       public class YourServlet extends HttpServlet implements SingleThreadModel{
       ...
       }
    2) 使用此接口,系统将保证不会存在多个请求线程同时访问Servlet的单个实例。但是仍然需要同步对存储在Servlet外部的类变量或共享字段的访问。
    3) 如Servlet频繁被访问,则Servlet访问的同步将严重影响性能(延时)。

6.  destroy方法
答:1) 服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法;
    2) 该方法允许Servlet:
       a. 关闭数据库连接;
       b. 中止后台线程;
       c. 将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。

7. 在Servlet终止时处理Service线程
答:1) 在destroy()方法中:如有服务(通过一个同步化的实例方法取得当前线程数大于0),则置关闭状态为true(通过一个同步化的实例方法实现)。然后循环等待服务线程数为0. 
    2) 在Service()方法中: 如见关闭状态为true,便不执行具体逻辑方法,直接退出。

 

     星期二      晴

资源访问

1. 分布式JAVA技术
答:1) JDBC;
       a. 实现了Data和Client的分开;
       b. 通过简单的配置可以适用不同种类的数据库。
    2) RMI(RMI使用的协议为Internet Inter ORB Protocol);
    3) CORBA(核心技术为ORB:相应的你的请求转为另一个物理地址另一个不同语言对象的请求。纯Java的情况下根本不用CORBA);

2.  转发结果至可视页面
答:1) 用JavaBean(用来装载一组值,遵从一定协议的class)封装结果;
    2) 每个JVM中的每一个应用程序里都存在一个上下文;
    3) servletContext在servletConfig的对象中;
    4) ServletContext.getRequestDispatcher(String path):返回一个RequestDispatcher
    5) 通过RequestDispatcher的forward()或include()方法传送请求。

3. 转发请求至新的资源
答:1) request dispatcher的二种传送请求方式
       a. Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML);
       b. Include: 包括静态或动态内容;
    2) 获得request dispatcher的二种方式:
       a. ServletRequest.getRequestDispatcher()       // 相对路径
       b. ServletContext.getRequestDispatcher()       // 绝对路径
    3) 四种资源范围
       a. javax.servlet.ServletContext: 整个应用程序范围内;
       b. javax.servlet.http.HttpSession: 会话期间;
       c. javax.servlet.ServletRequest: 一个请求期间;
       d. javax.servlet.jsp.PageContext: 一个JSP页面;

     星期三      晴

Servlets中的持久状态

1. HTTP协议中无状态的优缺点:
答:优点:可以服务很多客户端;
    缺点:不能在多个请求之间共享信息(通过Cookie和Session解决);

2. Cookies
答:1) Cookies是Web服务器发送到浏览器的简短文本信息,以后在访问同一个Web站点或域时浏览器就会毫无更改地返回该文本信息。
    2) 用户可以决定是否接受Cookie。
    3) 一个Cookie由以下内容组成:
       a. 名称;
       b. 单个值;
       c. 一些操作属性:路径或所在域、有效期以及版本号。
    4) 每个站点,浏览器通常只接受20条Cookie,总共接受300条,以及每条Cookie限制为4KB。

3.  设置Cookie
答:1) 创建Cookie: 
       Cookie c = new Cookie("CookieName", "CookieValue");
    2) 设置有效期:
       c.setMaxAge(int lifetime); 黙认为负值,只作用于当前会话,不能存储在磁盘上;如为0值表示删除Cookie;有效值为秒为单位。
    3) 在响应头中放置Cookie: 
       response.addCookie(c);
    4) 从客户端读取Cookie: 
       Cookie[] cookies = request.getCookies();
       Cookie cookie;
       for(int i=0; i<cookies.length; i++)
       {
          cookie = cookies[i];
          out.println("<tr><td>" + cookie.getName() + "</td><td>" + cookie.getValue());
       }

4. Sessions
答:1) 一个客户端和一个服务器端一次连接信息的所有集合,通过brower发出,由服务器端的servlet调用;
    2) 提供一种方式在多个页面请求间确认用户或者储存关于用户的信息;
    3) 实现会话跟踪的三种方式:a. cookie; b. URL重写; c. 隐藏的表单段

5. 设置Sessions
答:1) 创建Sessions: 
       HttpSession session = request.getSession(true);      // true表示如不存在则创建一个新的session
    2) 用指定名称将一个对象绑定到session: 
       public void setAttribute(String name, Object value);
    3) 删除与指定名称相关的所有值:
       public void removeAttribute(String name);
    4) 返回会话中所有属性名
       public Enumeration getAttributeNames();
    5) 返回指定名称对象
       public Object getAttribute(String name);

6. Cookies和Sessions的比较
答:1) Cookies可由用户决定是否需要, Sessions不能;  
    2) Cookies是一种装载sessionID的可能;
    3) Cookies存储在客户端, Sessions存储于服务器端;
    4) Cookies可以构造,可以由Request取出,由Response返回
  星期四      晴

过滤器

1.  什么是过滤器?
答:与Servlet相似,过滤器是一些Web应用程序组件,可以绑定到一个Web应用程序档案中。但是与其他Web应用程序组件不同的是,过滤器是“链”在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发的响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。

2.  过滤器可以用于:
答:1) 为一个Web应用程序的新功能建立原型(可被添加到Web应用程序中或者从Web应用程序中删除而不需重写基层应用程序代码);
    2) 向过去的代码中添加新功能。

3.  过滤器放在容器结构什么位置?
答:过滤器放在Web资源之前,可以在请求抵达它所应用的Web资源(可以是一个servlet、一个JSP页面,甚至是一个HTML页面这样的静态内容)之前截获进入的请求,并且在它返回到客户之前截获输出请求。

4.  过滤器的存活周期
答:过滤器有四个阶段(与servlet类似):
    1) 实例化;
    2) 初始化(调用init()方法);
    3) 过滤(调用doFilter()方法);
    4) 销毁(调用destroy()方法);

5. 过滤器类和接口
答:所有的过滤器都必须实现javax.servlet.Filter接口:
    1) 容器调用init()方法初始化过滤器实例:
       public void init(FilterConfig config) throws ServletException
    2) doFilter()方法包含过滤器逻辑:
       public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
    3) destroy()方法由容器在销毁过滤器实例之前调用:
       public void destroy();
    4) FilterChain的doFilter()方法之后的代码构成了后期处理过滤器调用。

6.  配置过滤器
答:使用<filter>和<filter-mapping>元素来配置:
    <filter>
       <filter-name>XSLTFilter</filter-name>                   //过滤器名
       <filter-class>filters.SmartXSLFilter</filter-class>     //具体过滤器类
       <init-param>                                            //初始化参数
          <param-name>xsltfile</param-name>
          <param-value>/xsl/stockquotes.xsl</param-value>
       </init-param>
    </filter>
    <filter-mapping>                        //将过滤器应用于Web应用程序中的每个Web资源
       <filter-name>Logger</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>

    星期五      晴

Web应用程序生命周期事件及监听器(Servlet V2.3版本以后新增功能)

1. 什么是事件监听器?
答:1) 支持ServletContext、HttpSession(since v2.3)及ServletRequest(since v2.4)中状态改变的事件通知;
    2) 实现了一个或多个servlet事件监听器接口的类型;
    3) 控制ServletContext、HttpSession(since v2.3)及ServletRequest(since v2.4)中的生命周期;

2. Servlet Context事件监听器
答:1) 对于应用程序而言在JVM层别管理资源或保存状态
    2) 有二种类型的事件监听器:
       a. ServletContextListener(以下是该监听器的方法)
          contextDestroyed(ServletContextEvent sce)
          contextInitialized(ServletContextEvent sce)
       b. ServletContextAttributeListener(以下是该监听器的方法)
          attributeAdded(ServletContextAttributeEvent scab)
          attributeRemoved(ServletContextAttributeEvent scab)
          attributeReplaced(ServletContextAttributeEvent scab)

3. HTTP Session事件监听器
答:1) 管理从同一个客户端或用户向一个Web应用程序发出的一系列请求相关的状态或资源;
    2) 有二种类型的事件监听器:
       a. HttpSessionListener(以下是该监听器的方法)
          sessionCreated(HttpSessionEvent se)
          sessionDestroyed(HttpSessionEvent se)
       b. HttpSessionAttributeListener(以下是该监听器的方法)
          attributeAdded(HttpSessionBindingEvent se)
          attributeRemoved(HttpSessionBindingEvent se)
          attributeReplaced(HttpSessionBindingEvent se)

4. Servlet Requst事件监听器
答:1) 管理整个request生命周期的状态
    2) 有二种类型的事件监听器
       a. ServletRequestListener(以下是该监听器的方法)
          requestDestroyed(ServletRequestEvent sre) 
          requestInitialized(ServletRequestEvent sre)
       b. ServletRequestAttributeListener(以下是该监听器的方法)
          attributeAdded(ServletRequestAttributeEvent srae)
          attributeRemoved(ServletRequestAttributeEvent srae)
          attributeReplaced(ServletRequestAttributeEvent srae)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值