精华内容
下载资源
问答
  • Servlet Java Servlet 是运行在Web 服务器或应用服务器上的程序. 其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet...

    Servlet

    1
    浏览器通过HTTP协议与Tomcat通信,Tomcat内部通过Servlet标准与我们自定义的Servlet程序(Web Applications)进行连接。

    • Java Servlet 是运行在Web 服务器或应用服务器上的程序. 其主要功能在于交互式地浏览和修改数据,生成动态Web内容.
    • 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,我们将Servlet理解为后者。

    Servlet常用API(了解):
    javax.servlet:其中包含定义Servlet和Servlet容器之间的类和接口
    javax.servlet.http:其中包含定义HTTP Servlet和Servlet容器之间的类和接口
    javax.servlet.annotation:其中包含标注Servlet,Filter,Listener的注解

    1 HttpServlet处理Http请求

    • Servlet的service()方法是请求的入口方法,HttpServlet实现service()方法在这个入口方法中根据不同的Http请求方法(如GET、POST请求)调用不同的方法。
    • HttpServlet中的Service方法会检验用来发送请求的HTTP方法(通过调用request.getMethod() ),并调用以下方法之一:doGetdoPost、doHead、doPut、doTrace、doOptions、doDelete.
    (1) HTTP的头信息:

    Accept:指定浏览器或其他客户端可以处理的MIME 类型。值image/png 或image/jpeg 是最常见的两种可能值。
    Accept-Charset:指定浏览器可以用来显示信息的字符集。例如ISO-8859-1。
    Accept-Encoding: 用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。值gzip 或compress 是最常见内容编码方式。
    Accept-Language: 用来告知服务器客户端能够处理的自然语言集。例如,en、en-us、ru 等。
    Authorization:用于客户端在访问受密码保护的网页时识别自己的身份。
    Connection:指示客户端是否可以处理持久HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求来检索多个文件。值Keep-Alive 意味着使用了持续连接。
    ContentLength:只适用于POST 请求,并给出POST 数据的大小(以字节为单位)。
    Cookie: 把之前发送到浏览器的cookies 返回到服务器。
    Host :指定原始的URL 中的主机和端口。
    If-ModifiedSince: 如果在If-ModifiedSince字段指定的日期后,资源发生了更新,服务器会接受请求。如果没有更新,服务器会发送一个304 Not Modified响应。
    If-Unmodified-Since:这个头信息是If-Modified-Since 的对立面,指定的请求资源只有在字段值指定的日期之后,未发生更新的情况下,才能处理请求。如果发生了更新,则返回412 Precondition Failed。
    Referer:会告知服务器请求的原始资源的URI,只要查看Referer就能知道请求的URI是从哪个Web页面发起的。原始URI地址中可能会带有密码等信息,出于安全考虑一般不建议发送该字段。
    User-Agent: 这个头信息识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。

    (2) HttpServletRequest 对象操作HTTP Request头的方法:

    Cookie[] getCookies(): 返回一个数组,包含客户端发送该请求的所有的Cookie 对象。
    Enumeration getHeaderNames():返回一个枚举,包含该请求中所有的头信息名。
    Enumeration getParameterNames():返回一个String 对象的枚举,包含在该请求中包含的参数的名称。
    HttpSession getSession()返回与该请求关联的当前session 会话,或者如果请求没有session 会话,则创建一个。
    HttpSession getSession(boolean create):返回与该请求关联的当前HttpSession,或者如果没有当前会话,且create==true,则返回一个新的session 会话。
    String getCharacterEncoding():返回请求主体中使用的字符编码的名称。
    String getContentType():返回请求主体的MIME 类型,如果不知道类型则返回null。
    String getContextPath():返回指示请求上下文的请求URI 部分。
    String getHeader(String name):以字符串形式返回指定的请求头的值。
    String getMethod(): 返回请求的HTTP 方法的名称,例如,GET、POST 或PUT。
    String getParameter(String name)以字符串形式返回请求参数的值,或者如果参数不存在则返回null
    String getProtocol(): 返回请求协议的名称和版本。
    String getQueryString(): 返回包含在路径后的请求URL 中的查询字符串。
    String getRemoteUser():如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回null。
    String getRequestURI():从协议名称直到HTTP 请求的第一行的查询字符串中,返回该请求的URL 的一部分。
    String getRequestedSessionId():返回由客户端指定的session 会话ID。
    String[] getParameterValues(String name):返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回null。
    int getContentLength():以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回-1。

    代码示例:

    @WebServlet("/log")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        	 // 按照 UTF-8 编码形式,从 请求中 读取用户的提交内容
            req.setCharacterEncoding("utf-8");
            String username = req.getParameter("username");
            String password = req.getParameter("password");
    
    		获取文件内容时:
    		Part coverImage = req.getPart("cover_image");
            String filename = coverImage.getSubmittedFileName();
            String path = req.getServletContext().getRealPath("images") + "\\" + filename;//获取images的绝对路径
            InputStream is = coverImage.getInputStream();
            // 类似 IO 时,文件复制的代码
            byte[] buffer = new byte[8192];
            int len;
            try (OutputStream os = new FileOutputStream(path)) {
                while ((len = is.read(buffer)) != -1) {
                    os.write(buffer, 0, len);
                }
            }
    
        }
           }
    

    注意:
    GET方法不允许获取请求体,如果需要获取时,可以这样做:

    ServletInputStream inputStream =req.getInputStream();
    InputStream is = inputStream;
    is.nextLine();
    

    2 Servlet 服务器HTTP 响应

    (1) 服务器端Response常见报头

    Allow :指定服务器支持的请求方法(GET、POST 等)。
    CacheControl:指定响应文档在何种情况下可以安全地缓存。可能的值有:public、private 或 no-cache 等。Public 意味着文档是可缓存,Private 意味着文档是单个用户私用文档,且只能存储在私有(非共享)缓存中,no-cache 意味着文档不应被缓存。
    Connection指示浏览器是否使用持久HTTP 连接。值close 指示浏览器不使用持久HTTP 连接,值keep-alive 意味着使用持久连接
    ContentDisposition:可以让您请求浏览器要求用户以给定名称的文件把响应保存到磁盘。
    ContentEncoding:在传输过程中,这个头信息指定页面的编码方式。
    ContentLanguage:表示文档编写所使用的语言。例如,en、en-us、ru 等。
    ContentLength :指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 连接时才需要这些信息。
    ContentType:提供了响应文档的MIME(Multipurpose Internet Mail Extension)类型。
    Expires :指定内容过期的时间,在这之后内容不再被缓存。
    LastModified :指示文档的最后修改时间。
    If-Modified-Since :请求头信息提供一个日期。
    Location:可以将响应接收方引导至与请求URI位置不同的资源。基本上,该字段会配合3XX:Redirection响应,提供重定向的URI.
    Refresh :指定浏览器应该如何尽快请求更新的页面。您可以指定页面刷新的秒数。
    Retry-After:可以与503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久就可以重复它的请求。
    Set-Cookie :指定一个与页面关联的cookie。

    (2) HttpServletResponse对象操作HTTP Response头的方法

    String encodeRedirectURL(String url):为sendRedirect 方法中使用的指定的URL 进行编码,或者如果编码不是必需的,则返回URL 未改变。
    String encodeURL(String url):对包含session 会话ID 的指定URL 进行编码,或者如果编码不是必需
    的,则返回URL 未改变。
    boolean isCommitted() :返回一个布尔值,指示响应是否已经提交。
    void addCookie(Cookie cookie)把指定的cookie 添加到响应。
    void addDateHeader(String name, long date):添加一个带有给定的名称和日期值的响应报头。
    void addHeader(String name,String value): 添加一个带有给定的名称和值的响应报头。
    void addIntHeader(String name, int value):添加一个带有给定的名称和整数值的响应报头。
    void sendRedirect(String location)使用指定的重定向位置URL 发送临时重定向响应到客户端。
    void setCharacterEncoding(String charset)设置发送到客户端的响应字符编码(MIME 字符集)例如,UTF-8。
    void setContentLength(int len):设置在HTTP Servlet 响应中的内容主体的长度,该方法设置HTTPContent-Length 头。
    void setContentType(String type)设置发送到客户端响应的内容类型。
    void setDateHeader(String name, long date):设置一个带有给定的名称和日期值的响应报头。
    void setHeader(String name String value):设置一个带有给定的名称和值的响应报头。
    void setIntHeader(String name, int value):设置一个带有给定的名称和整数值的响应报头。
    void setStatus(int sc) :为该响应设置状态码。

    代码示例:

    @WebServlet("/log")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setContentType("text/html; charset=utf-8");
                // resp.setContentType("text/html");
          		 //resp.setCharacterEncoding("utf-8");
                PrintWriter writer = resp.getWriter();
                writer.println("<h1>登陆成功</h1>"); 
                resp.sendRedirect("/u");//路径跳转
        }
    }
    

    当需要返回json数据类型时:resp.setContentType("application/json; charset=utf-8");

    (3) Http状态码

    100 Continue:只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求。
    101 Switching Protocols:服务器切换协议。
    200 OK 请求成功。
    201 Created :该请求是完整的,并创建一个新的资源。
    202 Accepted :该请求被接受处理,但是该处理是不完整的。
    204 No Content :无内容
    206 Partial Content :局部请求
    301 Moved Permanently:所请求的页面已经转移到一个新的URL,永久重定向
    302 Found :所请求的页面已经临时转移到一个新的URL。
    303 See Other :所请求的页面可以在另一个不同的URL 下被找到。
    307 Temporary Redirect:所请求的页面已经临时转移到一个新的URL,临时重定向
    400 Bad Request :服务器不理解请求。
    401 Unauthorized :所请求的页面需要用户名和密码。
    402 Payment Required:您还不能使用该代码。
    403 Forbidden :禁止访问所请求的页面。
    404 Not Found :服务器无法找到所请求的页面。.
    405Method NotAllowed:在请求中指定的方法是不允许的。
    408 Request Timeout :请求需要的时间比服务器能够等待的时间长,超时。
    413Request EntityToo Large:服务器不接受该请求,因为请求实体过大。
    414 Request-url TooLong:服务器不接受该请求,因为URL 太长。当您转换一个"post" 请求为一个带有长的查询信息的"get" 请求时发生。
    500 Internal ServerError:未完成的请求。服务器遇到了一个意外的情况。
    502 Bad Gateway :未完成的请求。服务器从上游服务器收到无效响应。
    503 Service Unavailable:未完成的请求。服务器暂时超载或死机。
    504 Gateway Timeout :网关超时。
    505 HTTP Version Not Supported:服务器不支持"HTTP协议"版本

    (4)HttpServletResponse 对象设置HTTP 状态代码的方法

    public void setStatus ( int statusCode ) 该方法设置一个任意的状态码。setStatus 方法接受一个int(状态码)作为参数。如果您的反应包含了一个特殊的状态码和文档,请确保在使用PrintWriter 实际返回任何内容之前调用setStatus。
    public void sendRedirect(String url) 该方法生成一个302 响应,连同一个带有新文档URL 的Location 头。
    public void sendError(int code, String message) 该方法发送一个状态码(通常为404),连同一个在HTML 文档内部自动格式化并发送到客户端的短消息。

    展开全文
  • Servlet3与Servlet4

    千次阅读 2019-03-11 09:38:28
    异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成...

    Servlet3

    Servlet 3.0 新特性

    • 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。

    • 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。

    • 可插性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内的各种常用框架的整合特性记忆犹新。将相应的插件封装成 JAR 包并放在类路径下,Struts2 运行时便能自动加载这些插件。现在 Servlet 3.0 提供了类似的特性,开发者可以通过插件的方式很方便的扩充已有 Web 应用的功能,而不需要修改原有的应用

    消息异步

    Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:

    1. Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理
    2. 调用业务接口的某些方法,以完成业务处理;
    3. 最后,根据处理的结果提交响应,Servlet 线程结束。

    Servlet2.x详细说明:

    其中第二步的业务处理通常是最耗时的,这主要体现在数据库操作,以及其它的跨网络调用等,在此过程中,Servlet 线程一直处于阻塞状态,直到业务方法执行完毕。在处理业务的过程中,Servlet 资源一直被占用而得不到释放,对于并发较大的应用,这有可能造成性能的瓶颈。对此,在以前通常是采用私有解决方案来提前结束 Servlet 线程,并及时释放资源。

    Servlet3优化改进:

    1. Servlet 接收到请求之后,可能首先需要对请求携带的数据进行一些预处理
    2. 接着,Servlet 线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时 Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用),或者将请求继续转发给其它 Servlet。如此一来, Servlet 线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。

    web.xml
    servlet3为filter和servlet增加了异步支持标签,<async-supported>,默认是false,需要手动开启

    <servlet> 
        <servlet-name>DemoServlet</servlet-name> 
        <servlet-class>footmark.servlet.Demo Servlet</servlet-class> 
        <async-supported>true</async-supported> 
    </servlet>
    

    注解
    注解增加了属性asyncSupported支持异步

    @WebFilter(urlPatterns = "/demo",asyncSupported = true) 
    public class DemoFilter implements Filter{...}
    

    异步Demo如下:

    @WebServlet(urlPatterns = "/demo", asyncSupported = true)
    public class AsyncDemoServlet extends HttpServlet {
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException {
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter out = resp.getWriter();
            out.println("进入Servlet的时间:" + new Date() + ".");
            out.flush();
     
            //在子线程中执行业务调用,并由其负责输出响应,主线程退出
            AsyncContext ctx = req.startAsync();
            new Thread(new Executor(ctx)).start();
     
            out.println("结束Servlet的时间:" + new Date() + ".");
            out.flush();
        }
    }
     
    public class Executor implements Runnable {
        private AsyncContext ctx = null;
        public Executor(AsyncContext ctx){
            this.ctx = ctx;
        }
     
        public void run(){
            try {
                //等待十秒钟,以模拟业务方法的执行
                Thread.sleep(10000);
                PrintWriter out = ctx.getResponse().getWriter();
                out.println("业务处理完毕的时间:" + new Date() + ".");
                out.flush();
                ctx.complete();	//告诉context,这个子线程完毕
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    为了监听异步事件,Servlet3提供了AsyncListener事件监听器

    1. 异步线程开始时,调用 AsyncListener 的 onStartAsync(AsyncEvent event)方法;
    2. 异步线程出错时,调用 AsyncListener 的 onError(AsyncEvent event)方法;
    3. 异步线程执行超时,则调用 AsyncListener 的 onTimeout(AsyncEvent event)方法;
    4. 异步执行完毕时,调用 AsyncListener 的 onComplete(AsyncEvent event) 方法;

    要注册一个 AsyncListener,只需将准备好的 AsyncListener 对象传递给 AsyncContext 对象的 addListener() 方法即可

    AsyncContext ctx = req.startAsync(); 
    ctx.addListener(new AsyncListener() { 
        public void onComplete(AsyncEvent asyncEvent) throws IOException { 
            // 做一些业务操作
        } 
        ... 
    });
    

    注解支持

    @WebServlet

    @WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):

    属性名类型描述
    nameString指定 Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
    valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。
    urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
    loadOnStartupint指定 Servlet 的加载顺序,等价于 <load-on-startup> 标签。
    initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于 <init-param> 标签。
    asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于 <async-supported> 标签。
    descriptionString该 Servlet 的描述信息,等价于 <description> 标签。
    displayNameString该 Servlet 的显示名,通常配合工具使用,等价于<display-name>标签。

    监听使用如下:

    @WebServlet(urlPatterns = {"/simple"}, asyncSupported = true, 
    loadOnStartup = -1, name = "SimpleServlet", displayName = "ss", 
    initParams = {@WebInitParam(name = "username", value = "tom")} 
    ) 
    public class SimpleServlet extends HttpServlet{}
    

    @WebInitParam

    该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数,这等价于 web.xml 中 和 的 子标签。@WebInitParam 具有下表给出的一些常用属性:

    属性名类型是否可选描述
    nameString指定参数的名字,等价于<param-name>
    valueString指定参数的值,等价于<param-value>
    descriptionString关于参数的描述,等价于 <description>

    @WebFilter

    @WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 ):

    属性名类型描述
    filterNameString指定过滤器的 name 属性,等价于 <filter-name>
    valueString[]该属性等价于 urlPatterns 属性。但是两者不应该同时使用。
    urlPatternsString[]指定一组过滤器的 URL 匹配模式。等价于<url-pattern>标签。
    servletNamesString[]指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是web.xml 中<servlet-name> 的取值。
    dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
    initParamsWebInitParam[]指定一组过滤器初始化参数,等价于 <init-param>标签。
    asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于<async-supported> 标签。
    descriptionString该过滤器的描述信息,等价于 <description>标签。
    displayNameString该过滤器的显示名,通常配合工具使用,等价于 <display-name>标签。

    @WebListener

    该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:

    • ServletContextListener
    • ServletContextAttributeListener
    • ServletRequestListener
    • ServletRequestAttributeListener
    • HttpSessionListener
    • HttpSessionAttributeListener

    这个接口只有一个默认value属性
    一个简单示例如下:

    @WebListener("This is only a demo listener") 
    public class SimpleListener implements ServletContextListener{...}
    

    如此,则不需要在 web.xml 中配置<listener> 标签了。它等价的 web.xml 中的配置形式如下:

    <listener> 
        <listener-class>footmark.servlet.SimpleListener</listener-class> 
    </listener>
    

    @MultipartConfig

    该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:

    属性名类型是否可选描述
    fileSizeThresholdint当数据量大于该值时,内容将被写入文件。
    locationString存放生成的文件地址。
    maxFileSizelong允许上传的文件最大值。默认值为 -1,表示没有限制。
    maxRequestSizelong针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。

    可插性支持

    Servlet 3.0 引入了称之为“Web 模块部署描述符片段”的 web-fragment.xml 部署描述文件,该文件必须存放在 JAR 文件的 META-INF 目录下,该部署描述文件可以包含一切可以在 web.xml 中定义的内容。JAR 包通常放在 WEB-INF/lib 目录下,除此之外,所有该模块使用的资源,包括 class 文件、配置文件等,只需要能够被容器的类加载器链加载的路径上,比如 classes 目录等。

    • 编写一个类继承自 HttpServlet,将该类放在 classes 目录下的对应包结构中,修改 web.xml,在其中增加一个 Servlet 声明。这是最原始的方式;
    • 编写一个类继承自 HttpServlet,并且在该类上使用 @WebServlet 注解将该类声明为 Servlet,将该类放在 classes 目录下的对应包结构中,无需修改 web.xml 文件。
    • 编写一个类继承自 HttpServlet,将该类打成 JAR 包,并且在 JAR 包的 META-INF 目录下放置一个 web-fragment.xml 文件,该文件中声明了相应的 Servlet 配置。
    <?xml version="1.0" encoding="UTF-8"?>
    <web-fragment
        xmlns=http://java.sun.com/xml/ns/javaee
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
        metadata-complete="true">
        <servlet>
            <servlet-name>fragment</servlet-name>
            <servlet-class>footmark.servlet.FragmentServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>fragment</servlet-name>
            <url-pattern>/fragment</url-pattern>
        </servlet-mapping>
    </web-fragment>
    

    web-fragment.xml 包含了两个可选的顶层标签, 和 ,如果希望为当前的文件指定明确的加载顺序,通常需要使用这两个标签, 主要用于标识当前的文件,而 则用于指定先后顺序。

    <web-fragment...>
        <name>FragmentA</name>
        <ordering>
            <after>
                <name>FragmentB</name>
                <name>FragmentC</name>
            </after>
        <before>
            <others/>
        </before>
        </ordering>
        ...
    </web-fragment>
    

    ServletContext 的性能增强

    该对象支持在运行时动态部署 Servlet、过滤器、监听器,以及为 Servlet 和过滤器增加 URL 映射等。以 Servlet 为例,过滤器与监听器与之类似。ServletContext 为动态配置 Servlet 增加了如下方法:

    • ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)
    • ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
    • ServletRegistration.Dynamic addServlet(String servletName, String className)
    • <T extends Servlet> T createServlet(Class clazz)
    • ServletRegistration getServletRegistration(String servletName)
    • Map<String,? extends ServletRegistration> getServletRegistrations()

    其中前三个方法的作用是相同的,只是参数类型不同而已;通过 createServlet() 方法创建的 Servlet,通常需要做一些自定义的配置,然后使用 addServlet() 方法来将其动态注册为一个可以用于服务的 Servlet。两个 getServletRegistration() 方法主要用于动态为 Servlet 增加映射信息,这等价于在 web.xml( 抑或 web-fragment.xml) 中使用 <servlet-mapping> 标签为存在的 Servlet 增加映射信息。

    以上 ServletContext 新增的方法要么是在 ServletContextListener 的 contexInitialized 方法中调用,要么是在 ServletContainerInitializer 的 onStartup() 方法中调用。

    ServletContainerInitializer 也是 Servlet 3.0 新增的一个接口,容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer 的实现类,并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给该类的 onStartup() 方法处理,我们通常需要在该实现类上使用 @HandlesTypes 注解来指定希望被处理的类,过滤掉不希望给 onStartup() 处理的类。

    HttpServletRequest 对文件上传的支持

    之前上次文件必须借助第三方jar来实现,比如Apache的IO包
    Servlet 3.0 已经提供了这个功能,而且使用也非常简单。

    • Part getPart(String name)
    • Collection getParts()

    前者用于获取请求中给定 name 的文件,后者用于获取所有的文件。每一个文件用一个 javax.servlet.http.Part 对象来表示。该接口提供了处理文件的简易方法,比如 write()、delete() 等。至此,结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单,如下所示:

    Part photo = request.getPart("photo"); 
    photo.write("/tmp/photo.jpg"); 
    // 可以将两行代码简化为 request.getPart("photo").write("/tmp/photo.jpg") 一行。
    

    开发者可以配合前面提到的 @MultipartConfig 注解来对上传操作进行一些自定义的配置,比如限制上传文件的大小,以及保存文件的路径等。

    Servlet4

    Servlet 4.0 的主要新功能为服务器推送和全新 API,该 API 可在运行时发现 servlet 的 URL 映射。

    服务器推送是最直观的 HTTP/2 强化功能,通过 PushBuilder 接口在 servlet 中公开。服务器推送功能还在 JavaServer Faces API 中实现,并在 RenderResponsePhase 生命周期内调用,以便 JSF 页面可以利用其增强性能。

    全新 servlet 映射发现接口 HttpServletMapping 使框架能够获取有关激活给定 servlet 请求的 URL 信息。这可能对框架尤为有用,这些框架需要这一信息来运行内部工作。

    在接下来的部分,我将概述服务器推送及其如何在 Java servlet 中运行,包括 JSF 2.3 中的服务器推送。我还将展示一个交换示例,重点介绍全新 servlet 映射发现功能。

    服务器推送

    服务器推送使服务器能预测客户端请求的资源需求。然后,在完成请求处理之前,它可以将这些资源发送到客户端。

    要了解服务器推送的好处,可以考虑一个包含图像和其他依赖项(比如 CSS 和 JavaScript 文件)的网页。客户端发出一个针对该网页的请求。服务器然后分析所请求的页面,确定呈现它所需的资源,并主动将这些资源发送到客户端的缓存。

    在执行所有这些操作的同时,服务器仍在处理原始网页请求。客户端收到响应时,它需要的资源已经位于缓存中。

    PushBuilder

    多数来自原始 HttpServletRequest 实例的请求标头,只添加到 PushBuilder 实例中。由于正确运行服务器推送并不需要某些标头,因此不包括以下标头:

    • 条件标头
    • Range 标头
    • Expect 标头
    • Authorization 标头
    • Referrer 标头
    @Override
    protected void doGet(HttpServletRequest request, 
                         HttpServletResponse response) 
                         throws ServletException, IOException {
     
       PushBuilder pushBuilder = request.newPushBuilder();
     
    }
    

    设置推送资源并推送

    PushBuilder pushBuilder = request.newPushBuilder();
     
    if (pushBuilder != null) {
       pushBuilder.path("images/hero-banner.jpg").push();
       pushBuilder.path("css/menu.css").push();
       pushBuilder.path("js/marquee.js").push();
    }
    

    HttpServletMapping 接口

    Servlet 4.0 的全新 servlet 映射发现 API 使服务器能够对 URL(可调用 servlet)执行运行时检查。例如,对 file.ext, /path 和 /path/file.ext 的请求将通过 URL 模式 /path/* 和 *.ext 激活 servlet。

    • getMatchValue() 返回部分 URI 路径,该路径会导致请求匹配。
    • getPattern() 返回 URL 模式的 String 表示形式。
    • getServletName() 返回 servlet 名称的 String 表示形式。
    • getMappingMatch() 返回匹配的类型,表示为 MappingMatch 枚举值,该枚举值将为以下值之一CONTEXT_ROOTDEFAULT、EXACTEXTENSIONPATH

    运行时映射发现:

    @WebServlet({"/path/*", "*.ext"})
    public class ServletMapping extends HttpServlet {
     
        protected void doGet(HttpServletRequest request,
                             HttpServletResponse response) 
                             throws IOException {
     
            HttpServletMapping mapping = request.getHttpServletMapping();
            String mapping = mapping.getMappingMatch().name();
            String value = mapping.getMatchValue();
            String pattern = mapping.getPattern();
            String servletName = mapping.getServletName();
       }
     
    }
    

    细微重构变化

    • Trailer 响应标头支持发送方在分块消息的末尾包含额外字段。这用于提供在发送消息主体时可能会动态生成的元数据,例如,消息完整性检查、数字签名或后期处理状态。
    • Servlet 4.0 添加了 GenericFilter 和 HttpFilter 抽象类,这些抽象类通过最低限度地实现生命周期方法 init() 和 destroy(),简化了编写过滤器。
    • Servlet 4.0 还集成了全新的 HTTP Trailer,支持发送方在分块消息的末尾包含额外的字段。

    ServletContext 接口采用了一些新方法:
    addJspFile() 可将带有给定 JSP 文件的 servlet 添加到 servlet 上下文中。
    getSessionTimeout() 和 setSessionTimeout() 可提供对会话超时的访问权限。
    getRequestCharacterEncoding() 和 setRequestCharacterEncoding() 可为当前的 servlet 上下文提供访问权限,并改变默认的请求字符编码。

    • HttpServletRequest 接口上的 isRequestedSessionIdFromUrl() 方法已被弃用。
      由于升级到 Java SE 8,默认方法已被添加到侦听器接口中。
    展开全文
  • JSP提供了八个内部对象,而其中的五个内部对象对应Servlet API中的七个对象,这也就使得我们正常理解并熟练使用Servlet中的这七个对象显得尤其重要。这五个JSP的内部对象和Servlet API中的对象的对应关系是: ...
    JSP提供了八个内部对象,而其中的五个内部对象对应于Servlet API中的七个对象,这也就使得我们正常理解并熟练使用Servlet中的这七个对象显得尤其重要。这五个JSP的内部对象和Servlet API中的对象的对应关系是:
    


    ◆request对象对应于:javax.servlet.http.HttpServletRequest和javax.servlet.ServletRequest


    ◆response对象对应于:javax.servlet.http.HttpServletResponse和javax.servlet.ServletResponse


    ◆session对象对应于:javax.servlet.http.HttpSession


    ◆application对象对应于:javax.servlet.ServletContext


    ◆config对象对应于:javax.servlet.ServletConfig


    javax.servlet.http.HttpServletRequest


    这是一个接口,在我们提到接口之前,还是让我们来复习一下Java中接口的一个初步的解释:接口在语法上与类相似,但是接口没有实例,使用接口,只是指定类必须做什么而不是如何做。HttpServletRequest接口用来处理一个对Servlet API的HTTP格式的请求信息。


    javax.servlet.ServletRequest


    这也是一个接口,这个接口定义一个Servlet引擎产生的对象,通过这个对象,Servlet可以获得客户端请求的数据。这个对象通过读取请求体的数据提供包括参数的名称、值和属性以及输入流的所有数据。而javax.servlet.http.HttpServletRequest也只是该接口的一个扩展,也就是说,该接口的所有方法也可以被Servlet API中javax.servlet.http.HttpServletRequest所使用。


    javax.servlet.http.HttpServletResponse接口


    该接口用来描述一个返回到客户端的HTTP回应。


    javax.servlet.ServletResponse接口


    该接口用来定义一个Servlet API产生的对象,通过这个对象,Servlet对客户端的请求作出响应。这个响应应该是一个MIME实体,可能是一个HTML页、图象数据或其他MIME的格式。javax.servlet.http.HttpServletResponse接口是该接口的扩展。


    javax.servlet.http.HttpSession接口


    该接口用来描述一个session,至于什么是session我想在这里就没必要说了吧。


    javax.servlet.ServletContext接口


    该接口用来定义了一个Servlet API的环境对象。也可是认为这是多个客户端共享的信息,它与session的区别在于应用范围的不同,session只对应于一个用户。


    javax.servlet.ServletConfig接口


    该接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet API。每一个ServletConfig对象对应着一个唯一的Servlet。


    javax.servlet.http.Cookie类


    这个类描述了一个cookie,cookie的作用其实与session很类似,只是cookie保存在客户端,session保存在服务器端。
    展开全文
  • Servlet

    2015-06-14 02:44:26
    Servlet的概念①Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。...

    Servlet的概念

    ①Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。Servlet与Web服务器的关系类似于Applet与Web浏览器的关系(这也是为什么Servlet技术被称为Servlet的原因),我们可以将Servlet想象成没有前端界面(faceless)的Applet。
    ②服务器端动态处理常见技术
    CGI(common gateway interface)公共网关接口
    PHP(HyperText PreProcessor)超文本预处理器
    ASP(Active server page)活动服务器页面
    Servlet(JSP-java server page)java服务器页面
    ③在Servlet中,修改web.xml、servlet类都要重新启动tomcat服务器才能生效

    Servlet 的对象创建和生命周期

    Servlet 是一个Java 类,该类要运行必须创建对象。
    问题:
    ①由谁创建?
    答:由读取web.xml 文件的服务器软件来进行创建。
    ②何时创建Servlet 对象?
    (1)web程序,服务器端只有一个,但是访问的客户端数量没有办法控制
    (2)客户端访问的时间没有办法限制。
    在Tomcat服务器端,一个Servlet类一次只创建一个Servlet对象,该对象通过线程(对用户使用该Servlet的时间进行分段)使用

    浏览器端服务器端
    www.taobao.com/searchs = new SearchServlet()

    ③该Servlet 对象创建的时间有两个:
    (1)服务器启动时创建,多出现在项目运行阶段,会检查所有当前服务器上的项目,检测项目中web.xml文件,在检测的同时,看到,就会自动的创建对象,并且保持在内存中。
    (2)当用户第一次访问服务器上一个新的Servlet时,在开发过程中。
    ④生命周期:
    Servlet生命周期:指Servlet对象在服务器内存中从创建到调用,到销毁的整个过程,主要研究该过程中哪些方法对我们的开发有用。
    (1)实例化:当客户端通过URL请求的时候,web容器根据web.xml配置自动调用该Servlet的构造方法,实例化对象。
    (2)初始化:通过该servlet对象调用init()方法,读取web.xml中该servlet的配置信息,为service方法提供相关数据。
    (3)服务:通过该对象调用service()方法,如果是继承HttpServlet,则根据请求头信息中的请求方法,调用对应的doGet()/doPost()
    (4)销毁:不是在service()方法调用完后,立即调用,而是由JVM来决定。当JVM需要销毁一些对象、释放内存空间的时候,才会去调用该实例的destroy()方法。


    图片名称

    3. Servlet 中的常用对象

    Interface:
        javax.servlet.Servlet
    Mothd:
        init(ServletConfig config)
        service(ServletRequest req, ServletResponse res)
        destroy()
    public ServletConfig getServletConfig();//得到 web.xml 中的配置信息

    ②abstract Class:
    ⑴javax.servlet.GenericServlet
    //重写父接口中的所有方法
    //从web.xml文件中得到初始化参数的值
    String getInitParameter(String name)
    //代表web.xml配置文件
    public ServletConfig getServletConfig()
    //代表服务器中该项目的访问路径(上下文对象即项目名)
    public ServletContext getServletContext()
    Servlet学习笔记 - 廖润明 - 异次元蓝客
    ⑵javax.servlet.http.HttpServlet
    doXXXX()
    //返回上次修改 HttpServletRequest 对象的时间,该时间是自格林威治标准时间1970年 1月1日午夜起经过的毫秒数
    protected long getLastModified(HttpServletRequest req)
    ③HttpServletRequest(interface) 实现了ServletRequest接口,为 HttpServlet提供请求信息.在 HTTP 协议中,规定了很多信息:请求头信息、请求内容。

        http://localhost:8080/servlet/index.jsp
    
        http:         request.getScheme();
    
        localhost:     request.getServerName();
    
        8080:          request.getServerPort();
    
        /servlet:      request.getContextPath();
    
        /index.jsp     request.getServletPath();
    
        /servlet/index.jsp: request.getRequestURI();
    
        完整请求路径: request.getRequestURL();
    
        IP 地址:      request.getLocalAddr();

    ④HttpServletResponse(interface):代表服务器向浏览器返回的响应直接输出内容到浏览器,使用Servlet输出HTML页面
    PrintWriter out = response.getWriter();
    out.print(“Hello :”);
    设置响应的内容类型:
    response.setContentType(“text/html; charset=UTF-8”);













    注意:使用response对象跳转,可以跳到项目外的一个URL资源上
    如:response.sendRedirect(“http://www.csdn.net”);
    使用request对象跳转,只能在本项目资源中跳转
    如:request.getRequestDispatcher(“url”).forward(request,response);
    告诉浏览器不要缓存页面:

    转自:
    http://blog.163.com/magicc_love/blog/static/1858536622012983519998/

    展开全文
  • servlet

    千次阅读 2012-12-06 20:51:32
    我们Servlet解析(一)讨论了ServletServlet容器以及一个Servlet容器-Tomcat(包括安装与配置,目录结构,运行,启动分析,体系结构和如何管理程序)。而本篇,我们继续论述Servlet技术包括Servlet UML 类图结构...
  • Servlet入门总结及第一个Servlet程序

    万次阅读 多人点赞 2015-04-20 17:26:08
    Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互.
  • 所有Servlet响应都实现ServletResponse接口。ServletResponse接口主要有以下方法:  (1)从Servlet中可以通过getWriter方法取得PrintWriter对象,来输出字符数据。从Servlet中可以通过getOutputStream方法取得...
  • Servlet再度学习

    千次阅读 2016-02-28 10:44:26
    虽然Servlet已经使用很多了,但是一直都仅局限在其使用操作上。最近有空想对它进行一个相对全面的了解。下面是博主整理的一篇博文。一、Servlet简介Servlet(Server Applet),全称Java Servlet,未有中文译文。是用...
  • Servlet技术

    2016-11-16 19:19:52
    与传统的CGI(计算机图形接口)和许多其他类似CGI技术相比,Servlet具有更好的可移植性、更强大的功能,更少的投资,更高的效率,更好的安全性等特点。  Servlet是使用Java Servlet应用程序设计接口(API)及相关...
  • Servlet容器与Servlet的关系
  • Servlet 简介

    2017-03-09 15:01:03
    Servlet 简介Servlet 是用Java编写的服务器端程序。Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。...
  • Servlet编程

    千次阅读 2016-04-05 13:41:00
    Servlet学习的大纲: 1. servlet概念及相关接口简介 2. servet 执行过程 3. servlet路径映射 4. 缺省servlet --应用 5. servlet生命周期(重点) --理解(重点) 6. Servlet自动加载 7. Servl
  • Servlet学习

    2008-03-16 20:25:00
    摘录:《深入体验Java Web开发内幕...一个Servlet程序负责处理它对应的一个或一组URL地址的访问请求,并用于接受客户端发出的请求信息和产生响应内容。一个Servlet程序就是一个在Web服务器端运行的调用了Servlet API的J
  • Servlet——了解Java Servlet技术什么是ServletServlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现...
  • Spring MVC 与 Servlet

    千次阅读 2017-08-05 19:13:52
    相信大家都能够在上网上看到Spring MVC的核心...其实核心分发器几乎是所有MVC框架设计中的核心概念,像在Struts2也有类似的分发器FilterDispatcher。只不过Spring MVC中的是一个Servlet,而Struts2里面的是一个Filter.
  • Tomcat、ServletServlet容器

    千次阅读 2020-07-02 22:10:24
    Servlet是什么,就是一个(按照Servlet规范写的一个)java类。 这个“装”怎么理解:*实现了Servlet、JSP规范,同时提供http服务。*其实,就像社会与人的关系:社会制定能够规范,人按照规范做事。然后社会保证你和...
  • servlet2和servlet3

    千次阅读 2018-04-30 20:59:29
    servlet是用java编写的服务端程序,主要功能在于交互式的浏览和修改程序,生成动态Web内容。...服务器将请求信息发送至servlet 3.servlet生成响应内容并将其传给服务器,响应内容动态生成,通常取决...
  • Servlet规范

    千次阅读 2011-06-02 22:11:00
    也可以说,Servlet是Java组件,部署在Web服务器上,能在请求/响应通信模式下有效地工作。 GenericServlet是独立于协议的Servlet。因此按照需要扩展GenericServlet后也可以实现与协议相关的Se
  • servlet和Jsp生命周期解读

    千次阅读 2015-06-28 21:35:57
    Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。常用的tomcat、jboss、weblogic...
  • Servlet简介

    万次阅读 2014-05-25 14:01:13
    开发servlet程序步骤: step1. 写一个java类,实现Servelt接口或者继承Httpservlet类,一般 继承Httpservlet类(实现了Servelt接口). step2.编译(servlet-api.jar). step3.打包 appname(目录,程序名) WEB-INF...
  • Servlet Note

    千次阅读 2016-08-17 23:50:29
    Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。  使用 Servlet,您可以收集来自...
  • ava Servlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。Servlet可完成以下功能: ...
  • Servlet API

    千次阅读 2016-06-07 18:50:08
    Java Servlet API中文说明文档 译者前言:  近来在整理有关Servlet资料时发现,在网上竟然找不到一份中文的Java Servlet API的说明文档,而在有一本有关JSP的书后面附的Java Servlet API说明竟然不全,而这份文档...
  • ServletRequest,HttpServletRequest  ServletResponse,...响应都实现 ServletResponse 接口。 ServletResponse 接口 主要有以下方法:       ( 1 )从 Servlet 中可以通过 getWriter
  • 我们清楚的知道servlet容器提供了接收来自client端的请求,然后根据请求进行处理(如:执行对应servlet生成动态内容,或读取静态资源等),最后将client请求的资源响应给client端。在以上过程中,有一点需要注意,...
  • Servlet3教程

    千次阅读 2017-03-01 00:19:54
    Servlet容器是web server或application server 的一部分,提供基于请求/响应发送模型的网络服务,解码基于 MIME 的请求,并且格式化基于 MIME 的响应Servlet 容器也包含了管理 Servlet 生命周期。Servlet有三大...
  • servlet入门笔记

    千次阅读 2012-10-18 19:34:10
    2、servlet就是一个在服务器端运行以处理客户端请求的java文件(request请求response响应) Servlet/jsp 运行环境:浏览器/服务器/数据库 Tomcat是一个免费的开源的Servlet容器,它是apache基金会的jakarta项目中的一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,310
精华内容 17,324
关键字:

响应对应的servlet类似