Servlet及Servlet处理HTTP请求和响应的方法

JavaWeb 专栏收录该内容
34 篇文章 0 订阅

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 文档内部自动格式化并发送到客户端的短消息。

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

长不大的大灰狼

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值