`
hackiller
  • 浏览: 18979 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

J2EE复习(四)servlet

阅读更多

一、什么是Servlet?
Servlet 是在服务器上运行来响应客户端请求的一种java组件。Servlet与具体的客户服务端协议无关,但Servlet常用于HTTP协议,所以,“Servle”t常被用于“HTTP Servlet”的意思。
Servlet使用的java软件包:javax.servlet(基本Servlet框架)和javax,servlet.http(HTTP Servlet)
HTTP Servlets典型应用包括:
1.通过提交HTML表单操作存储数据。
2.提供动态内容,如将从数据库中查询到的结果返回给客户端
3.管理无状态的HTTP上的有状态的信息,如一个为多个同时存在的客户管理购物车并映射每一个请求到正确的客户的在线购物系统
二、Servlets 和 CGI(Commone Gateway Interface)
最早用来产生动态网页服务的方法便是CGI,CGI是一种与语言无关的接口,此种接口允许服务器启动通过环境变化来获取与此次请求有关信息的外部程序。每一个请求都通过CGI程序或者CGI脚本由单独的线程响应。
Servlets相比CGI的几个优势:
1.Servlet中,每个请求由一个轻量级的Java线程处理,不用为每一个请求启动新的系统线程。
2.一个Servlet在请求期间会驻留在内存中。
3.响应所有并发的请求只需要唯一一个实例,节省了内存并可以使Servlet管理持久数据显得更快捷。
三、Servlet 生命周期
Servlet 的生命周期就是指创建 Servlet 实例之后其存在的时间以及何时消失
生命周期的 3个方法为:init()、service()、destroy()
1.装载servlet类以及其他可能使用到的类
2.调用init(ServletConfig config)方法加载配置信息,初始化servlet
3.调用service(doGet/doPost)方法处理业务逻辑,service方法在初始化前不会被调用
4.调用destroy方法销毁不再使用的servlet
四、Servlet的部署
1.用myeclipse建立好web工程,写好HelloClientServlet.java类

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloClientServlet extends HttpServlet
{
  //doGet() 方法处理客户端作出的 GET 请求。
  public void doGet(HttpServletRequest req,
                       HttpServletResponse res)
            throws ServletException, IOException
  {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    out.println("<HTML><HEAD><TITLE>Hello Client!</TITLE>"+
  "</HEAD><BODY>Hello Client!</BODY></HTML>");
    out.close();
  }

  //doPost() 方法处理客户端作出的 POST 请求。
  public void doPost(HttpServletRequest req,
                       HttpServletResponse res)
            throws ServletException, IOException
  {
    doGet(req,res);
  } 
}

 2.web.xml文件中配置Servlet

 

<!-- 第一个servlet程序配置 -->
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>HelloClientServlet的包路径</servlet-class>
</servlet>
<!-- 第一个servlet程序映射 -->
<servlet-mapping>
<servlet-name>firstServlet</servlet-name><!-- 必须与配置中的servlet-name相同 -->
<url-pattern>/first.do</url-pattern>
</servlet-mapping>

 3.发布到本机web服务器(使用Tomcat5.5)中,通过http://localhost:服务器端口号/工程名/first.do启动servlet。
五、javax.servlet 包的接口介绍
ServletConfig
用来封装web.xml中对当前Servlet的配置信息
getInitParameter()---可以获取初始化参数
ServletContext
代表当前Servlet运行的上下文环境,Web容器会为每一个Web工程创建一个对应ServletContext对象
setAttribute()
getAttribute()
removeAttribute()
ServletRequest
为Servlet所发送的请求,用ServletRequest封装
setAttribute()
getAttribute()
removeAttribute()
getParameter()
常用子接口HttpServletRequest
ServletResponse
Servlet对客户段所做的响应,用ServletResponse描述
getWriter():获取PrintWriter输出流给客户发送的响应内容
setContentType:设置响应内容的响应类型和字符集信息
sendRedirect:设置重新请求路径
子接口HttpServletResponse
六、过滤器(Filter)
1.Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。
2.生命周期
初始化----当容器第一次加载该过滤器时, init() 方法将被调用。
过滤----doFilter() 方法被容器调用,同时传入分别指向这个请求/响应链中的ServletRequest 、 ServletResponse 和 FilterChain 对象的引用
销毁----容器紧跟在垃圾收集之前调用 destroy() 方法
3.编写字符编码过滤器
(1)实现Filter接口中的三个方法:
init() ----这个方法在容器实例化过滤器时被调用
doFilter() ----与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法―― doFilter()。
destroy() ---这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter
{

  private String encode;

  public void destroy()
  {
    this.encode = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException
  {
    if(encode!=null)
    {
      request.setCharacterEncoding(encode);
      response.setCharacterEncoding(encode);
    }
    // 将资源链到下一Filter, 如果这是最后一个Filter, 则将资源链到目的位置.
    chain.doFilter(request, response);
  }

  public void init(FilterConfig config) throws ServletException
  {
    encode = config.getInitParameter("encode");
    System.out.println("CharacterEncoding...encode="+encode);
  }

}

 (2)web.xml文件中配置字符编码过滤器

<!-- 字符编码过滤器配置 -->
<filter>
<filter-name>encodeFilter</filter-name>
<filter-class>CharacterEncodingFilter全路径</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- 字符编码过滤器映射,/*过滤所有请求 -->
<filter-mapping>
<filter-name>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 七、监听器(ServletContextListener)
1.ServletContext相关监听接口
(1)javax.servlet.ServletContextListener:监听WEB应用,当应用开始的时候它会调用contextInitialized()方法,当应用关闭的时候,它同样会调用contextDestroyed()方法
(2)javax.servlet.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性
2.HttpSession相关监听接口
(1)javax.servlet.http.HttpSessionListener:监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
(2)avax.servlet.http.HttpSessionBindingListener:
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener
当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)
(3)avax.servlet.http.HttpSessionAttributeListener:监听HttpSession中的属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。
3.写一个统计在线用户的例子
(1)建立CunterListstener.java类

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class CunterListstener implements HttpSessionListener
{
  public static int count;
  
  public void sessionCreated(HttpSessionEvent arg0)
  {
    count++;
  }

  public void sessionDestroyed(HttpSessionEvent arg0)
  {
    if(count>0) count--;
  }
}

 (2)建立index.jsp,查看在线人数

<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
  <head>
    <title>站点计数监听器</title>
  </head>
  
  <body>
    <h1>站点计数监听器</h1>
    <hr>
    当前在线人数:<%=CunterListener.count%>
  </body>
</html>

 3.在web.xml文件中配置监听器

<!-- 配置监听器 -->
<listener>
 <listener-class>CunterListstener全路径</listener-class>
</listener>

 4.发布工程到Tomcat上,进入index.jsp网页 ,看到网页内容:  当前在线人数:1。代表的是只有自己在线。

 九、Cookie
Cookie 用于存储 Web 服务器发送给客户端的信息。服务器通过设置响应标题中的 Set-Cookie 方法来发送 cookie。javax.servlet.http.Cookie类方法:
getComment/setComment 获取/设置Cookie的注释。
getDomain/setDomain   获取/设置Cookie适用的域。
getMaxAge/setMaxAge   获取/设置Cookie过期之前的时间,以秒计。
getName/setName       获取/设置Cookie的名字。
getPath/setPath       获取/设置Cookie适用的路径。
getSecure/setSecure   获取/设置一个boolean值,表示是否Cookie只能通过加密的连接(即SSL)发送。
getValue/setValue     获取/设置Cookie的值。


getPath()返回的如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面。这里的方法可以用来设定一些更一般的条件。例如,someCookie.setPath("/"),此时服务器上的所有页面都可以接收到该Cookie。
如果不设置Cookie的过期时间,则Cookie只在当前会话内有效,即在用户关闭浏览器之前有效,而且这些Cookie不会保存到磁盘上。

 

通过HttpServletResponse的addCookie方法加入。

Cookie userCookie = new Cookie("userName", "hackiller");
response.addCookie(userCookie);

 由于HttpServletRequest的getCookies方法返回的是一个Cookie对象的数组,因此通常要用循环来访问这个数组查找特定名字,然后用getValue检查它的值。

//获取指定名字的Cookie值
public static String getCookieValue(Cookie[] cookies,String cookieName,String defaultValue) 
{
    for(int i=0; i<cookies.length; i++) 
    {
      Cookie cookie = cookies[i];
      if (cookieName.equals(cookie.getName())) return(cookie.getValue());
     }
     return(defaultValue);
}

 自动保存的Cookie,Cookie能够在浏览器退出的时候自动保存下来

import javax.servlet.http.Cookie;

public class MyCookie extends Cookie
{
  public static final int COOKIE_MAX_AGE = 60*60*24*7;//一周
  public MyCookie(String cookieName, String cookieValue)
  {
    super(cookieName, cookieValue);
    //设置Cookie的过期时间为一周
    setMaxAge(COOKIE_MAX_AGE);
  }
}

 十、Servlet 通信方法

(1)Servlet 使用 RequestDispatcher 接口的 forward() 和include() 方法访问网络资源
将请求从一个 Servlet 转送到同一个服务器上的另一个 Servlet

public void forward (ServletRequest req, ServletResponse res);

 在一个 Servlet 中包含另一个 Servlet  的内容

public void include (ServletRequest req, ServletResponse res);

 使用javax.servlet.http.HttpServlet.getServletContext()方法创建RequestDispatcher对象,用于访问另一个 Servlet 的内容

RequestDispatcher dispatcher=getServletContext().getRequestDispatcher("/usersServlet2");

 (2)Servlet 上下文
将所有 Servlet 所共有的属性和资源存储于 ServletContext 接口对象。处理上下文属性的方法为:

public Object getAttribute(String name);

 返回 Servlet 容器属性名称。如果该名称没有属性则返回 null

public void setAttribute(String name, Object object);

 将对象绑定到 Servlet 上下文中给定的属性名称

public void removeAttribute(String name);

 删除给定名称的属性

4
0
分享到:
评论

相关推荐

    j2ee复习资料

    ### j2ee复习资料知识点详解 #### 一、教学目标及考试形式 - **教学目标**:本课程旨在帮助学生全面复习J2EE相关的基础知识和技术要点,为即将到来的考试做充分准备。 - **考试形式**:考试总分为100分,其中笔试占...

    j2ee复习题

    Java 2 Platform, Enterprise Edition(J2EE)是Oracle公司推出的用于...总结,J2EE复习题集将涉及这些关键知识点,通过深入学习和实践,开发者能更好地理解J2EE架构,从而高效地开发出满足企业需求的高质量应用程序。

    J2EE期末复习资料

    J2EE包含多种组件和服务架构,如Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等。其中,EJB是J2EE的核心组件之一,提供了一种创建可复用、安全且事务性的...

    J2EE认证考试复习资料

    J2EE认证考试通常包含多个部分,涵盖了J2EE体系结构、Servlet、JSP(JavaServer Pages)、EJB、JNDI(Java Naming and Directory Interface)、JMS、JTA以及Web服务等相关技术。在准备这样的考试时,考生需要深入...

    j2ee复习资料j2ee试卷

    【J2EE复习知识点】 1. **Java2平台版本**:Java2平台分为三个主要版本:J2SE(Java Standard Edition),J2EE(Java Enterprise Edition),和J2ME(Java Micro Edition)。J2EE是面向企业级应用开发的,提供了...

    软件07级J2EE复习题

    【J2EE核心概念】 ...总结来说,这些复习题目涵盖了J2EE平台的基础概念,包括容器、组件、生命周期、Web应用体系、数据库访问接口(JDBC)以及软件设计模式等多个重要领域,是深入理解J2EE开发的关键知识点。

    j2ee复习资料,还有多选题

    **J2EE复习知识点概述** J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级分布式应用程序的框架。它提供了一系列的API和服务,支持多层架构,包括Web层、业务逻辑层(EJB)和数据访问...

    J2EE复习题和答案完美版

    本文档提供了J2EE复习题和答案,涵盖了JSP、Servlet、JSTL等方面的知识点,供开发者学习和参考。 1. 在JSP中,要定义一个方法,需要用到以下()元素。 知识点:JSP脚本元素。JSP脚本元素有三种: declaration、...

    J2EE复习题 文件内容很值得看 也很适合考试

    这个压缩包文件“J2EE复习题答案.doc”显然是为了帮助学习者准备J2EE相关的考试或者进行自我测试而准备的。 J2EE 知识体系广泛,涵盖了许多核心技术,包括: 1. **Servlet**:Servlet 是 Java 编写的服务器端程序...

    j2ee期末复习资料

    J2EE期末复习资料主要涵盖了Java企业级应用开发的基础知识,包括Servlet、JSP、HTTP协议、JavaBean、JDBC以及数据库查询等多个方面。以下是这些知识点的详细解释: 1. **JSP Page指令属性**: - `import`属性:在...

    j2ee复习.zip

    **Java企业版(J2EE)技术复习指南** Java企业版(J2EE)是Java平台上用于构建分布式、多层企业级应用的框架。它提供了一系列的组件和服务,旨在简化开发、部署和管理大型应用程序的过程。J2EE的复习涵盖了许多关键...

    J2EE复习题1

    这些知识点涵盖了Web开发中的MVC架构、Struts2框架配置、HTTP会话管理、HTML基础、Servlet与JSP交互、JavaScript的DOM操作以及Tomcat服务器的基本配置等方面的内容,对于理解和开发J2EE应用程序至关重要。

    J2EE复习资料(可缩印)1

    【J2EE复习资料(可缩印)1】 J2EE(Java 2 Platform, Enterprise Edition)是一个由Oracle公司主导的Java平台,主要用于构建和部署分布式、基于组件的企业级应用程序。它提供了一个全面的框架,涵盖了从客户端到...

    doc\j2ee复习提纲(最新完整版).doc

    【J2EE复习提纲详解】 J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个重要组成部分,主要用于开发和部署企业级分布式应用程序。以下是对J2EE核心概念的详细解析: 1. **J2EE多层架构** - J2EE架构...

    合肥工业大学J2EE期末复习试题.pdf

    根据提供的信息,我们可以推断这份文档“合肥工业大学J2EE期末复习试题.pdf”主要围绕Java 2 Platform, Enterprise Edition(J2EE)的相关知识点进行展开。由于提供的部分内容并不包含具体的题目或知识点,我们将...

    j2ee复习题 一些简答和概念

    【Servlet生命周期】Servlet的生命周期包括装载、初始化(init())、服务(service())和销毁(destroy())四个阶段。在web.xml文件中配置Servlet及其映射。 【JSP指令与动作标签】JSP中的指令标签(如page、...

    J2EE复习冲刺精简版1

    J2EE复习冲刺精简版1主要涵盖了Spring MVC和Struts框架的相关知识,这两个都是Java企业级开发中常用的MVC(Model-View-Controller)架构模式实现。以下是这些知识点的详细说明: **Spring MVC** Spring MVC是Spring...

    韩顺平.2011最新j2ee视频教程.细说servlet ppt和笔记

    这份笔记可以作为学习者复习和理解Servlet的参考,帮助他们在没有视频的情况下回顾课程内容。 2. “韩顺平j2ee视频实战教程servlet.课件(吐血整理).pptx” - 这是一个PowerPoint文件,可能是韩顺平在视频课程中使用...

    J2EE复习资料

    以上是关于J2EE复习资料的主要知识点总结,涵盖了J2EE应用程序的组成、容器的作用、数据库连接管理、Web应用程序的基本结构、Servlet和JSP的工作机制等多个方面,对于理解和掌握J2EE技术体系有着重要的意义。

    j2ee 大学java课程复习题

    J2EE容器分为四种:WEB容器管理JSP和Servlet;EJB容器管理EJB;APPLET容器管理Java Applet;应用程序客户容器管理Java标准应用程序。 2. **减少服务器交互的技术** 使用JavaScript可以在客户端进行数据验证,...

Global site tag (gtag.js) - Google Analytics