• Servlet 常用类


    Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务。同时为了方便开发,servlet标准中也提供了许多常用的工具类,比如基本的Request 和Response对象以及其他要说到的常用的类。

    ServletRequest 对象

    Servlet接口中的service方法的定义如下:

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    

    从接口上来看,我们只能在service方法中使用这个对象。

    当用户请求到达服务器时,服务器会将标准的HTTP请求包封装为一个 ServletRequest对象,并调用service将该对象作为参数传入。也就是说这个对象是与HTTP协议息息相关的

    下面是它的一些常用方法

    //请求行相关方法
    public String getMethod(); //返回请求的方法
    public String getContextPath(); //获取请求的虚拟目录(或者项目所在目录)
    public String getServletPath(); //获取servlet路径
    public String getQueryString();// 获取查询字符串,也就是提交请求url中参数部分
    public String getRequestURI(); //获取请求的URI
    public StringBuffer getRequestURL(); //获取请求的URL
    public String getProtocol(); //获取协议版本
    public String getRemoteAddr(); //获取客户端的ip
    
    //请求头相关方法
    public String getHeader(String name); //以字符串的形式返回请求头
    public java.util.Enumeration<E> getHeaderNames(); //返回所有请求头名称的枚举
    public java.util.Enumeration<E> getHeaders(String name); //返回指定请求头中的所有值的枚举
    
    //请求体相关方法
    public java.io.BufferedReader getReader() throws java.io.IOException; //获取请求体的字符流
    public ServletInputStream getInputStream() throws java.io.IOException; //获取请求体中的字节流
    

    一般来说get方法会将请求参数放入到url中,而post则是将其放入到请求体中,根据上面的方法要获得请求参数,需要判断请求是get还是post,如果是get则采用 getQueryString, 如果是post则采用 getReader等方法。为了解决这个问题,Servlet提供了一些通用的方法。

    public String getParameter(String name); //获取请求参数,根据传入的键名获得请求的键值
    public java.util.Map<K, V> getParameterMap(); //获取所有请求参数,以map方式返回
    public String[] getParameterValues(String name); //如果请求中一个键对应多个值,可以使用这个方法获取所有的值
    

    请求中文乱码的问题

    一般HTML前端都使用utf-8编码,如果后台使用系统默认的编码则会可能造成乱码。我们可以先指定编码方式为utf-8,代码如下:

    request.setCharacterEncoding("UTF-8");
    

    请求转发

    为了保证程序模块的合理性,每个servlet 提供指定的功能,而有时候用户需要多个servlet来联合提供服务。这个时候需要使用请求转发。

    通过 request.getRequestDispatcher 方法来转发到其他servlet。

    它的特点如下:

    1. 浏览器地址栏不变
    2. 只能访问当前服务器的内部资源,也就是同一套web程序中的其他servlet
    3. 转发是一次HTTP请求

    域对象

    每个servlet都有一个service。不同的servlet通过不同的serivce来提供服务。由于是不同的类对象和方法,不同的servlet之间不能进行信息的传递。但是有的时候需要不同的servlet之间进行数据的共享。这个时候可以使用域对象

    域对象是一个有作用范围的对象,域对象中数据随着对象的消亡而消亡。servlet中有下列几种作用域:

    1. 一次请求, resquest
    2. 一次会话, cookie, session

    使用域对象的 setAttribute 来保存数据, 使用getAttribute 来获取数据。使用removeAtribute 来移除数据

    response 对象

    对HTTP 响应的封装,常用的方法如下:

    public void setStatus(int sc);//设置响应的状态码
    public void setHeader(String name, String value); //设置响应头
    public java.io.PrintWriter getWriter() throws java.io.IOException; //获取输出的字符流流
    public ServletOutputStream getOutputStream() throws java.io.IOException; //获取输出的字节流
    

    重定向

    重定向的原理是利用HTTP协议中的301和302 消息。在HTTP响应头中指定状态码为302,并指定Location字段,浏览器会根据响应再重新发送一次请求。servlet中,提供了专门的方法来实现重定向。

    public void sendRedirect(String location) throws java.io.IOException;
    

    重定向的特点如下:

    1. 重定向时,浏览器地址栏发生了变化
    2. 重定向可以访问互联网任意节点的资源
    3. 重定向是多次请求

  • 相关阅读:
    阅读《Android 从入门到精通》(29)——四大布局
    UISegmentedControl 修改字体大小 和 颜色
    UITableView Scroll to top 手动设置tableview 滚动到 顶部
    xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cycle” in ARC-enabled code
    iOS key value coding kvc在接收json数据与 model封装中的使用
    NSData 转 bytes 字节数据
    git commit 出现 changes not staged for commit 错误
    iOS exit(),abort(),assert()函数区别
    ios 程序发布使用xcode工具Application Loader 正在通过ITUNES STORE进行鉴定错误
    iOS mac添加证书 不能修改“System Roots”钥匙串错误
  • 原文地址:https://www.cnblogs.com/lanuage/p/11747105.html
Copyright © 2020-2023  润新知