• 1. Servlet技术
  • 2. 主要内容什么是Servlet Servlet处理请求的过程 Servlet的生命周期 如何编写Servlet 利用Servlet完成以下任务 对客户端请求进行响应 接收客户端请求发送的数据 如何进行会话跟踪(三种方式:session、URL重写、cookie) 如何在多个Servlet之间跳转 如何在一个Servlet中包含另外一个Servlet的输出 如何在同一Web应用不同用户之间共享信息
  • 3. Servlet简介Servlet是基于Servlet框架(接口)的Java对象,对Web服务器的功能进行扩展,用来生成动态的内容。简单地说Servlet是容器负责管理的服务器端Java程序,用来处理客户端请求,并对客户端请求进行响应。 是SUN公司(已被Oracle收购)提供的服务器端动态服务技术之一。 requestresponseServletEJBWeb 容器Web 浏览器
  • 4. Servlet在JavaEE中的位置
  • 5. B/S请求响应模型
  • 6. Servlet Architecture客户端客户端浏览器服务器LogsWeb 服务器JVMServlet Request HandlerServlet EngineMyServlet1. 浏览器发送HTTP请求 2. Servlet请求处理器拦截请求,并将其发送给运行在JVM中的Servlet引擎 3. Servlet引擎根据请求创建请求、响应对象并将其传递给Servlet的services方法 4. Servlet对请求进行处理,并将输出输出给Servlet引擎 5. Servlet引擎将输出回送给Web服务器 6. Web服务将请求回传给客户端浏览器
  • 7. Servlet Work Flow
  • 8. Servlet框架的对象模型<> javax.servlet.Servletinit( ) getServletConfig( ) service( ) getServletInfo( ) destroy( )<> javax.servlet.ServletConfiggetInitParameter( ) getServletContext( ) getInitParameterNames( ) getServletName( )<> javax.io.Serializablejavax.servlet.GenericServletinit( ) getServletConfig( ) service( ) getServletInfo( ) destroy( ) getInitParameter( ) getServletContext( ) getInitParameterNames( ) getServletName( ) log( )javax.servlet.http.HttpServletdoDelete( ) doGet( ) doOptions( ) doPost( ) doPut( ) doTrace( ) getLastModified( ) service( )Basic Servlet
  • 9. 创建第一个Servlet
  • 10. 使用GenericServlet处理请求Serverrequestresponseservice( )GenericServlet subclass覆盖 service() 方法即可
  • 11. 使用HTTPServlet 处理请求ServerresponseHttpServlet subclassPost requestGet requestresponseservice( )doGet( )doPost( )覆盖 service()或doXXX() 方法即可,使用doXXX()方法时,关键看对客户何种提交方式进行处理
  • 12. HttpServlet类HttpServlet 处理使用HTTP协议发送的请求和响应 HttpServlet 的service() 检查请求提交的方法并调用HTTPServlet响应的方法: doGet, doPost, doPut, doDelete, doTrace, doOptions or doHead 该类是一个抽象类。
  • 13. 创建一个Servlet继承HTTPServlet 实现 doGet 或 doPost 方法(或两者都实现) 这两个方法的方法参数均为: HttpServletRequest: 用于获取Form表单的数据、HTTP请求头部信息等等。 HttpServletResponse: 用于设置HTTP状态代码、HTTP响应头部信息、获取用于向客户端发送数据的输出流对象。 多数情况下, 我们在doPost 方法中 调用 doGet, 或相反。
  • 14. 输出HTML默认情况下, 响应中并没有设定内容的类型 为了生成HTML类型的文档: 通过设置Content-Type 头部信息,告诉浏览器发送的是HTML文档 对输出的文本进行修改以创建合法的HTML页面。 应当在输出文档之前设置所有的头部信息。 能说出为什么吗?
  • 15. public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World\n"); out.println(""); out.println("

    " + new java.util.Date() + "

    \n"); out.println("

    Hello World

    \n"); } }HelloWorld.java
  • 16. 配置Servlet器 hello HelloWorld hello /hello web.xmlmyApp/WEB-INF/classes/HelloWorld.class
  • 17. 其他示例:codes/structure目录下的FirstServlet.java
  • 18. Servlet的生命周期
  • 19. Servlet生命周期
  • 20. Servlet生命周期init()service()②①③④⑤service()②①第一次请求Servlet再次请求Servlet③④
  • 21. Servlet 生命周期加载Servlet 类调用 Init方法 进行初始化设置创建Servlet 实例调用 service 方法处理客户端请求调用 destroy 方法 销毁Servlet实例 并释放占用资源垃圾回收ServletConfig
  • 22. 初始化Servletsinit 方法接收一个ServletConfig 类型的参数 ServletConfig 拥有获取额外初始参数的方法 这些参数是在web应用的web.xml部署描述文件中进行设定的。 要执行初始化设置,请覆盖init()方法而不是init(ServletConfig) 方法 init() 方法在执行默认的初始化操作后自动调用。
  • 23. InitExample ServletInit login snoopy web.xml示例
  • 24. 使用Annotation提供配置信息@WebServlet( name=“InitExample", urlPatterns={"/init"}, initParams={ @WebInitParam( name="login", value="snoop") } )
  • 25. public class ServletInit extends HttpServlet { String _login = null; Calendar _initTime = null; public void init() throws ServletException { _login = this.getInitParameter("login"); _initTime = new GregorianCalendar(); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); res.setContentType("text/html"); out.println("Initialization

    " + "I am the Servlet of " + _login+ "
    " + "I was initialized at " + _initTime.get(Calendar.HOUR_OF_DAY) + ":"+ _initTime.get(Calendar.MINUTE) + ":"+ _initTime.get(Calendar.SECOND) + "

    "); }}ServletInit.java
  • 26. 服务器加载ServletServlet通常在第一次调用时才进行加载。 可以在web.xml 部署描述文件中指定为,在服务器启动时加载,如下例所示: 或者在注解中加入:loadOnStartup=1 InitExample ServletInit
  • 27. 移除Servlet服务器可以从内存中移除已经加载的Servlet 管理人员实施(如服务器关闭) Servlet长时间处于闲置状态 服务器需要释放资源 只有在所有的线程都完成以后或超过了设定的期限时才会移除Servlet。 在将Servlet移除以前, 调用destroy() 方法 可以执行资源释放工作,如关闭数据库的连接。
  • 28. 从请求中获取信息
  • 29. HTTP Request 请求示例GET /default.asp?username=zhangsan HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/png, */* Accept-Language: en Connection: Keep-Alive Host: www.neusoft.edu.cn User-Agent: Mozilla/4.04 [en] (WinNT; I ;Nav) Cookie:SITESERVER=ID=8dac8e0455f4890da220ada8b76f; ASPSESSIONIDGGQGGGAF=JLKHAEICGAHEPPMJKMLDEM Accept-Charset: iso-8859-1,*,utf-8
  • 30. 获取HTTP协议相关的数据可以通过HttpServletRequest 对象获取HTTP请求的值。 获取头信息hdr可以使用请求参数的getHeader(“hdr”) 方法进行获取 获取所有的头部信息名可以使用方法: getHeaderNames() 获取特定请求信息的方法有: getCookies, getContentLength, getContentType, getMethod, getProtocol, 等。
  • 31. public class ShowRequestHeaders extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Servlet Example: Showing Request Headers"; out.println( "" + title + "\n" + "

    " + title+ "

    \n" + "

    Request Method: "+request.getMethod()+"

    " + "

    Request URI: "+request.getRequestURI()+"

    " + "

    ServletPath: "+request.getServletPath()+"

    " + "

    Request Protocol: "+request.getProtocol()+"

    " + "\n" + "");
  • 32. Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = (String) headerNames.nextElement(); out.println("
  • " +""); } out.println("
    Header NameHeader Value
    " + headerName + ""+request.getHeader(headerName)+"
    \n"); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } }
  • 33. 获取Form表单中的数据使用HTML表单,我们可以向Web应用发送参数。
    组成了一个简单的Form表单: action: 表单数据要发送到的Web应用的地址。 method: 发送数据是所使用HTTP协议的提交方法 (也就是 get 或 post)。
  • 34.