第一章_servlet

简介:

[Servlet与Jsp学习指南]

*学习此servlet前,需要下载servlet-api.jar,MyEclipse中需要自带javaEE3.0版本的才可以使用注解访问servlet

1.1Servlet API概述

Javax.servlet 包含定义ServletServlet容器之间契约的类和接口

Javax.servlet.http 包含定义http servletservlet容器之间契约的类和接口

Javax.servlet.annotation 包含对servletfilterlistener进行标注的注解。它还为标注元件指定元数据。

Javax.servlet.descriptor 包含为web应用程序的配置信息提供编程式访问的类型。

 

Servlet技术的核心是Servlet接口,这是所有Servlet类都必须直接或者间接实现的一个接口。用户的请求会引发Servlet容器调用一个servletservice方法,并给这个方法传入一个ServletRequest实例和一个ServletResponse实例。

 

1.2Servlet

Servlet接口定义了以下5个方法。

Void init(ServletConfig config) throws ServletException

Void service(ServletRequest request,ServletResponse response) throws ServletException,Java.io.IOException

Void destroy()

java.lang.String getServletInfo()

ServletConfig getServletConfig()

 

Initservicedestroy方法属于Servlet声明周期方法。Servlet容器将根据以下原则调用这三个方法。

1. Init。第一次请求Servlet时,Servlet容器就会调用这个方法。在后续的请求中,将不再调用该方法。可以利用这个方法来编写一些应用程序初始化相关的代码。在调用这个方法时,Servlet容器会传递一个ServletConfig。一般来说,会将ServletConfig赋给一个类级变量,以便Servlet类中的其他方法也可以使用这个对象。

2. Service。每次请求Servlet时,Servlet容器都会调用这个方法。必须在这里编写要Servlet完成的相应代码,第一次请求Servlet时,Servlet容器会调用init方法和service方法,对于后续请求,则只调用service方法。

3. Destroy。要销毁Servlet时,Servlet容器就会调用这个方法。它通常发生在卸载应用程序,或者关闭Servlet容器的时候。一般来说,可以在这个方法中编写一些资源清理相关的代码。

Servlet中的另外两个方法是非声明周期方法:getServletInfogetServletConfig

1.  getServletInfo。该方法返回Servlet的描述,可以返回可能有用的任意字符串,甚至是null

2. getServletConfig。该方法返回由Servlet容器传给init方法的ServletConfig。但是,为了让getServletConfig返回非null值,你肯定已经为传给init方法的ServletConfig赋给了一个类级变量。

*必须注意个一点是线程安全性。一个应用程序中的所有用户将共用一个Servlet实例,因此不建议使用类级变量,除非他们是只读的,或者是java.util.concurrent.atomic包中的成员。

 

1.3、编写基础的Servlet应用程序

[java]  view plain  copy
  print ?
  1. package servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.Servlet;  
  7. import javax.servlet.ServletConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.annotation.WebServlet;  
  12. @WebServlet(name="MyServlet",urlPatterns={"/my"})  
  13. public class MyServlet implements Servlet{  
  14.     private transient ServletConfig servletConfig ;  
  15.   
  16.     @Override  
  17.     public void destroy() {  
  18.         // TODO Auto-generated method stub  
  19.           
  20.     }  
  21.   
  22.     @Override  
  23.     public ServletConfig getServletConfig() {  
  24.         // TODO Auto-generated method stub  
  25.         return servletConfig;  
  26.     }  
  27.   
  28.     @Override  
  29.     public String getServletInfo() {  
  30.         // TODO Auto-generated method stub  
  31.         return "My Servlet";  
  32.     }  
  33.   
  34.     @Override  
  35.     public void init(ServletConfig servletConfig) throws ServletException {  
  36.         // TODO Auto-generated method stub  
  37.         this.servletConfig = servletConfig ;  
  38.     }  
  39.   
  40.     @Override  
  41.     public void service(ServletRequest req, ServletResponse res)  
  42.             throws ServletException, IOException {  
  43.         // TODO Auto-generated method stub  
  44.         String servletName = servletConfig.getServletName() ;  
  45.         res.setContentType("text/html");  
  46.         PrintWriter writer = res.getWriter() ;  
  47.         writer.print("<html><head></head><body>Hello from " + servletName + "</body></html>") ;  
  48.     }  
  49.       
  50. }  

1.4ServletRequest

对于每一个HTTP请求,Servlet容器都会创建一个serveltRequest实例,并将它传给Servletservice方法。ServletRequest封装有关请求的信息。

下面是ServletRequest接口中的方法。

Public int getContentLength()

返回请求主体中的字节数。如果不知道字节的长度,该方法将返回-1

Public java.lang.String getContentType()

返回请求主体MIME类型,如果不知道类型,则返回null

Public java.lang.String getParameter(java.lang.String name)

返回指定请求参数的值

Public java.lang.String getProtocol()

返回这个HTTP请求的协议名称和版本号

getParameterServletRequest中最常用的方法。该方法通常用来返回一个HTML表单域的值。

getParameter也可以用来获取查询字符串的值。例如:如果利用下面这个URI调用一个servlet

http://domain/context/servletName?id=123

将可以在Servlet中利用下面这个语句来获取id的值

String id = request.getParameter(“id”) ;

注意,如果该参数不存在,那么getParameter将返回null

 

1.5ServletResponse

ServletResponse中定义的其中一个方法是getWriter方法,它返回可以将文本传给客户端的java.io.PrintWriter。在默认情况下,PrintWriter对象采用ISO-8859-1编码。

 

1.6ServletConfig

为了从一个Servlet内部获取某个初始参数的值,应该在由Servlet容器传给Servletinit方法的ServletConfig中调用getInitParameter方法。getInitParameter方法的签名如下:

java.lang.getInitParameter(java.lang.String name) ;

此外,getInitParameterNames方法则是返回所有初始化参数名称的一个Enumeration

java.util.Enumeration<java.lang.String> getInitParameterNames()

除了这2个方法外,ServletConfig还提供了另一个很有用的方法:getServletContext。可以利用这个方法从Servlet内部获取ServletContext


[java]  view plain  copy
  print ?
  1. package servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.Servlet;  
  7. import javax.servlet.ServletConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.annotation.WebInitParam;  
  12. import javax.servlet.annotation.WebServlet;  
  13. @WebServlet(name="ServletConfigDemoServlet",  
  14.         urlPatterns={"/servletConfigDemo"},  
  15.         initParams={  
  16.             @WebInitParam(name="admin",value="Benjamin"),  
  17.             @WebInitParam(name="email",value="whx449261417@sina.com")  
  18.         }  
  19.     )  
  20. public class ServletConfigDemoServlet implements Servlet{  
  21.     private transient ServletConfig servletConfig ;  
  22.     @Override  
  23.     public void destroy() {  
  24.     }  
  25.   
  26.     @Override  
  27.     public ServletConfig getServletConfig() {  
  28.         // TODO Auto-generated method stub  
  29.         return servletConfig;  
  30.     }  
  31.   
  32.     @Override  
  33.     public String getServletInfo() {  
  34.         // TODO Auto-generated method stub  
  35.         return "servletConfig demo";  
  36.     }  
  37.   
  38.     @Override  
  39.     public void init(ServletConfig servletConfig) throws ServletException {  
  40.         // TODO Auto-generated method stub  
  41.         this.servletConfig = servletConfig ;  
  42.     }  
  43.   
  44.     @Override  
  45.     public void service(ServletRequest req, ServletResponse res)  
  46.             throws ServletException, IOException {  
  47.         ServletConfig servletConfig = getServletConfig() ;  
  48.         String admin = servletConfig.getInitParameter("admin") ;  
  49.         String email = servletConfig.getInitParameter("email") ;  
  50.         res.setContentType("text/html");  
  51.         PrintWriter writer = res.getWriter() ;  
  52.         writer.print("<html><head></head><body>Admin:"+admin+"<br/>Email:"+email+"</body></html>") ;  
  53.     }  
  54.       
  55. }  


1.7ServletContext

ServletContext标识Servlet应用程序。每个Web应用程序只有一个context。在分布式环境中,一个应用程序同时部署到多个容器中,并且每台java虚拟机都有一个ServletConfig对象。

ServletConfig中调用getServletContext方法可以获得ServletContext

 

1.8GenericServlet

GenericServlet通过在init方法中将ServletConfig对象赋给一个类级变量servlet-config,实现对ServletConfig的保存。下面是GeneericServlet的源代码:

[java]  view plain  copy
  print ?
  1. package javax.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.Serializable;  
  5. import java.util.Enumeration;  
  6. import java.util.ResourceBundle;  
  7.   
  8. public abstract class GenericServlet  
  9.   implements Servlet, ServletConfig, Serializable  
  10. {  
  11.   private static final String LSTRING_FILE = "javax.servlet.LocalStrings";  
  12.   private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");  
  13.   private transient ServletConfig config;  
  14.   
  15.   public void destroy()  
  16.   {  
  17.   }  
  18.   
  19.   public String getInitParameter(String name)  
  20.   {  
  21.     ServletConfig sc = getServletConfig();  
  22.     if (sc == null) {  
  23.       throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  
  24.     }  
  25.   
  26.     return sc.getInitParameter(name);  
  27.   }  
  28.   
  29.   public Enumeration<String> getInitParameterNames()  
  30.   {  
  31.     ServletConfig sc = getServletConfig();  
  32.     if (sc == null) {  
  33.       throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  
  34.     }  
  35.   
  36.     return sc.getInitParameterNames();  
  37.   }  
  38.   
  39.   public ServletConfig getServletConfig()  
  40.   {  
  41.     return this.config;  
  42.   }  
  43.   
  44.   public ServletContext getServletContext()  
  45.   {  
  46.     ServletConfig sc = getServletConfig();  
  47.     if (sc == null) {  
  48.       throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  
  49.     }  
  50.   
  51.     return sc.getServletContext();  
  52.   }  
  53.   
  54.   public String getServletInfo()  
  55.   {  
  56.     return "";  
  57.   }  
  58.   
  59.   public void init(ServletConfig config)  
  60.     throws ServletException  
  61.   {  
  62.     this.config = config;  
  63.     init();  
  64.   }  
  65.   
  66.   public void init()  
  67.     throws ServletException  
  68.   {  
  69.   }  
  70.   
  71.   public void log(String msg)  
  72.   {  
  73.     getServletContext().log(getServletName() + ": " + msg);  
  74.   }  
  75.   
  76.   public void log(String message, Throwable t)  
  77.   {  
  78.     getServletContext().log(getServletName() + ": " + message, t);  
  79.   }  
  80.   
  81.   public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse)  
  82.     throws ServletException, IOException;  
  83.   
  84.   public String getServletName()  
  85.   {  
  86.     ServletConfig sc = getServletConfig();  
  87.     if (sc == null) {  
  88.       throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  
  89.     }  
  90.   
  91.     return sc.getServletName();  
  92.   }  
  93. }  

大家考虑一下为什么GenericServlet中有两个init方法?

GenericServlet通过在init方法中将ServletConfig对象赋给一个类级变量servletConfig,实现对ServletConfig的保存。

但是如果在类中覆盖了这个方法,则调用servlet中的init方法,并且必须调用super.init(servletConfig)来保存ServletConfig。为了避免这么做,GenericServlet又另外提供了一个init方法,它不带参数。当把ServletConfig赋给servletConfig之后,这个方法就会被第一个init方法调用,从而不影响servletConfig的创建。

 

1.9HTTP Servlet

1.9.1 HttpServlet

HttpServlet类覆盖javax.servlet.GenericServlet类,在使用HttpServlet时,还要使用HttpServletRequestHttpServletResponse对象,它们分别标识Servlet请求和Servlet响应。HttpServletRequest接口集成javax.servlet.ServletRequestHttpServletResponse继承javax.servlet.ServletResponse

这个新的service方法与javax.servlet.Servlet中的区别在于,前者接受的是HttpServletRequestHttpServletResponse,而不是ServletRequestServletResponse

原始的service方法将请求和响应对象进行向下转换,分别从Servlet容器转换成HttpServletRequestHttpServletResponse,并调用新的service方法。

HttpServlet中新的service方法会查看通常用来发送琴秋(通过调用request.getMethod)Http方法,并调用以下某个方法(doGetdoPostdoHeaddoPutdoTracedoOptionsdoDelete)

总之,HttpServlet中有两项特性是GenericServlet所没有的:

1、不覆盖service方法,而是覆盖doGetdoPost,或者两者都覆盖调。

2、将用HttpServletRequestHttpServletResponse代替ServletRequestServletResponse

 

1.9.2 HttpServletRequest

 

HttpServletRequest表示HTTP环境中的Servlet请求。它集成javax.servlet.ServletRequest接口,并增加了几个方法,例如:

Java.lang.String getContextPath()

返回表示请求context的请求URI部分。

Cookie[] getCookies()

返回一个Cookie对象数组

java.lang.String getHeader(java.lang.String name)

返回指定HTTP标头的值

java.lang.String getMethod()

返回发出这条请求的HTTP方法的名称

java.lang.String getQueryString()

返回请求URL中的查询字符串

HttpSession getSession()

返回与这个请求有关的session对象。如果没有找到,则创建新的session对象。

HttpSession getSession(boolean create)

返回与这个请求有关的session对象。如果没有找到,并且create参数为true,那么将创建新的session对象。如果为false,返回空

 

1.9.3 HttpServletResponse

HttpServletResponse表示HTTP环境下的Servlet响应。下面是其中定义的部分方法:

Void addCookie(Cookie cookie)

给这个响应对象添加cookie

Void addHeader(java.lang.String name,java.lang.String value)

给这个响应对象添加标头

Void sendRedirect(java.lang.String location)

发送响应代号,将浏览器重定向到指定的位置

 

1.10、处理HTML表单

1.11使用部署描述符(配置文件)

 

[java]  view plain  copy
  print ?
  1. package app01c;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. @SuppressWarnings("serial")  
  12. public class SimpleServlet extends HttpServlet{  
  13.     @Override  
  14.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  15.             throws ServletException, IOException {  
  16.         resp.setContentType("text/html") ;  
  17.         PrintWriter writer = resp.getWriter() ;  
  18.         writer.print("<html><head></head><body>Simple Servlet</body></html>") ;  
  19.     }  
  20. }  

[java]  view plain  copy
  print ?
  1. package app01c;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. @SuppressWarnings("serial")  
  12. public class WelcomeServlet extends HttpServlet{  
  13.     @Override  
  14.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  15.             throws ServletException, IOException {  
  16.         resp.setContentType("text/html") ;  
  17.         PrintWriter writer = resp.getWriter() ;  
  18.         writer.print("<html><head></head><body>Welcome</body></html>") ;  
  19.     }  
  20. }  


[java]  view plain  copy
  print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <welcome-file-list>  
  8.     <welcome-file>index.jsp</welcome-file>  
  9.   </welcome-file-list>  
  10.   <servlet>  
  11.     <servlet-name>ss</servlet-name>  
  12.     <servlet-class>app01c.SimpleServlet</servlet-class>  
  13.     <load-on-startup>10</load-on-startup>  
  14.   </servlet>  
  15.   <servlet-mapping>  
  16.     <servlet-name>ss</servlet-name>  
  17.     <url-pattern>/simple</url-pattern>  
  18.   </servlet-mapping>  
  19.     
  20.    <servlet>  
  21.     <servlet-name>ww</servlet-name>  
  22.     <servlet-class>app01c.WelcomeServlet</servlet-class>  
  23.     <load-on-startup>20</load-on-startup>  
  24.   </servlet>  
  25.   <servlet-mapping>  
  26.     <servlet-name>ww</servlet-name>  
  27.     <url-pattern>/welcome</url-pattern>  
  28.   </servlet-mapping>  
  29. </web-app>  

这样我们就可以利用下面这些路径去访问它们了:

http://localhost:8080/app01c/simple

http://localhost:8080/app01c/welcome

 

1.12、小结

Servlet技术是JavaEE技术的组成部分。Servlet容器中运行的所有Servlet,以及容器与Servlet之间的契约,都采用了javax.servlet.Servlet接口的形式。Javax.servlet包也提供了实现Servlet接口的GenericServlet抽象类。这是一个便利类,可以通过扩展它来创建Servlet。但是,大多数现代的Servlet都在HTTP环境中处理请求。因此,将javax.servlet.http.HttpServlet类子类化会更有意义。HttpServlet类本身也是GenericServlet的一个子类。

目录
相关文章
|
15天前
|
安全 Java 应用服务中间件
Servlet 教程 之 Servlet 简介 1
Servlet是运行在Web服务器上的Java程序,用于处理HTTP请求,充当浏览器和服务器间的中间层。它们接收用户输入,与数据库交互并动态生成网页。相比CGI,Servlet性能更优,运行在服务器地址空间内,跨平台且受安全管理器保护,可访问全部Java类库。
14 0
|
15天前
|
XML 安全 Java
Servlet 教程 之 Servlet 简介 3
Servlet是运行在Web服务器上的Java程序,用于处理HTTP请求和响应,与数据库或应用交互。相比CGI,Servlet性能更优,平台无关,并受服务器安全管理器保护。它们主要任务包括读取客户端数据、处理信息、生成结果及发送响应。Servlet利用javax.servlet和javax.servlet.http包构建,遵循Java Servlet 2.5和JSP 2.1规范,可被编译成Java类运行。
17 1
|
15天前
|
XML 缓存 安全
Servlet 教程 之 Servlet 简介 2
Servlet是Java编写的Web服务器程序,用于处理HTTP客户端请求和与服务器/数据库交互。相比CGI,Servlet性能更优,平台无关,并受服务器安全管理系统保护。Servlet的主要任务包括读取表单数据、处理HTTP请求、访问数据库、生成结果及发送响应。它们可以与applets、数据库或其他软件通信,支持多种文档格式。
16 1
|
3月前
|
安全 小程序 Java
Servlet相关知识点
Servlet相关知识点
|
6月前
|
小程序 Java API
04JavaWeb基础 - Servlet简介
04JavaWeb基础 - Servlet简介
19 0
|
9月前
|
API 容器
JavaWeb第七章课后题 Servlet详解
JavaWeb第七章课后题 Servlet详解
183 0
|
10月前
|
缓存 Java
|
前端开发 Java 应用服务中间件
Servlet入门学习笔记(下)
Servlet入门学习笔记(下)
|
前端开发 Java 关系型数据库
Servlet入门学习笔记(上)
Servlet入门学习笔记(上)
|
Oracle Java 关系型数据库
Servlet知识点汇总
java提供的基础的类库
81 0
Servlet知识点汇总