Servlet个人学习笔记(二)

Servlet的类继承体系

HTTP协议

客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。

请求又分为GET请求,和POST请求两种。

GET请求

请求行

  • 请求的方式:GET
  • 请求的资源路径(+?+请求参数)
  • 请求的协议的版本号:HTTP/1.1
    请求头:由 key:value 组成,不同的键值对,表示不同的含义。

GET请求的HTTP协议内容


请求头内容:
Accept:告诉服务器,客户端可以接收的数据类型
Accept-Language:告诉服务器客户端可以接收的语言类型
zh_CN 中文中国
en_US 英文美国
User-Agent:浏览器的信息
Accept-Encoding:告诉服务器,客户端可以接收的数据编码格式
Host:表示请求的服务器ip和端口号
Connection:告诉服务器请求连接如何处理
Keep-Alive 告诉服务器回传数据不要马上关闭,保持一小段时间的连接
Closed 马上关闭

POST请求

请求行

  • 请求的方式:POST
  • 请求的资源路径(+?+请求参数)
  • 请求的协议的版本号:HTTP/1.1
    请求头
  • key:value
  • 空行
    请求体===>>>就是发送给服务器的数据

POST请求HTTP协议内容


请求头内容:
Accept:告诉服务器,客户端可以接收的数据类型
Accept-Language:告诉服务器客户端可以接收的语言类型
Referer:表示请求发起时,浏览器地址栏中的地址(从哪来)
User-Agent:浏览器的信息
Content-Type:表示发送的数据的类型
application/x-www-form-urlencoded
表示提交的数据格式是:name=value&name=value,然后对其进行url编码,url编码是把非英文内容转换为:%xx%xx
multipart/form-data
表示以多段的形式提交数据给服务器(以流的形式提交,用于上传)
Content-Length:表示发送的数据的长度
Cache-Control:表示如何控制缓存 no-cache不缓存

常用的请求头的说明

Accept:表示客户端可以接收的数据类型
Accept-Language:表示客户端可以接收的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求的服务器ip和端口号

响应的HTTP协议格式

响应行

  • 响应的协议和版本号
  • 响应的状态码
  • 响应的状态描述符
    响应头
  • key:value
  • 空行
    响应体===>>>就是回传给客户端的数据

常见的响应码说明

200 表示请求成功
302 表示重定向
404 表示服务器已收到请求,但是访问数据不存在,或者请求地址错误
500 表示服务器已收到请求,但是服务器内部错误(代码错误)

HttpServletRequest接口

在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口。HttpServletRequest对象专门用于封装HTTP请求消息,简称request对象。

HTTP请求消息分为请求行、请求消息头和请求消息体三部分,所以HttpServletRequest接口定义了一系列获取请求信息的方法,如下表:

返回值类型 方法声明 描述
String getMethod() 该方法用于获取HTTP请求方式(如GET、POST等
String getRequstURI() 该方法用于获取请求行中的资源名称部分,即位于URL的主机和端口之后,参数部分之前的部分
String getQueryString() 该方法用于获取请求行中的参数部分,也就是URL中“?”以后的所有内容
String getContextPath() 返回当前Servlet所在的应用的名字(上下文)。对于默认(ROOT)上下文中的Servlet,此方法返回空字符串""
String getServletPath() 该方法用于获取Servlet所映射的路径
String getRemoteAddr() 该方法用于获取客户端的IP地址
String getRemoteHost() 该方法用于获取客户端的完整主机名,如果无法解析出完整主机名,则会返回客户端的IP地址

示例1
创建一个名为RequestLine的Servlet类,代码如下:

package com.servletlearning.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "RequestLine")
public class RequestLine extends HttpServlet {
    private static final long serialVersionUID=1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer=response.getWriter();
        writer.println("请求方式:"+request.getMethod()+"<br/>"+
                "客户端的IP地址:"+request.getRemoteAddr()+"<br/>"+
                "应用名字(上下文):"+request.getContextPath()+"<br/>"+
                "URI:"+request.getRequestURI()+"<br/>"+
                "请求字符串:"+request.getQueryString()+"<br/>"+
                "Servlet所映射的路径:"+request.getServletPath()+"<br/>"+
                "客户端的完整主机名:"+request.getRemoteHost()+"<br/>");
    }
}

启动Tomcat服务器,输入对应虚拟路径访问后结果如下:

获取请求头信息
当浏览器发送请求时,需要通过请求头向服务器传递一些附加信息,HttpServletRequest接口定义了一系列用于获取HTTP请求头字段的方法,如下表所示:

返回值类型 方法声明 描述
String getHeader(String name) 该方法用于获取一个指定头字段的值,如果请求消息中包含多个指定名称的头字段,则返回第一个的值
Enumeration getHeaders(string name) 该方法返回指定头字段所有值的枚举集合,在多数情况下,一个头字段名在请求消息中只出现一次,有时会出现多次
Enumeration getHeaderNames() 该方法返回请求头中所有字段的枚举集合
String getContentType() 该方法用于获取Content-Type头字段的信息
int getContentLength() 该方法用于获取Content-Length头字段的值
String getCharacterEncoding() 该方法用于返回请求消息的字符集编码

示例2
创建一个名为RequestHeader的Servlet类,代码如下:

package com.servletlearning.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet(name = "RequestHeader")
public class RequestHeader extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer=response.getWriter();
        // 获得所有请求头字段的枚举集合
        Enumeration<String> headers=request.getHeaderNames();
        while(headers.hasMoreElements()){
            // 获得请求头字段的值
            String value=request.getHeader(headers.nextElement());
            writer.write(headers.nextElement()+":"+value+"<br/>");
        }
    }
}

启动Tomcat服务器,输入地址后显示如下图:

获取form表单的数据
在实际开发中,我们经常需要获取用户提交的表单数据,例如用户名和密码,为了方便获取表单中的请求参数,ServletRequest定义了一系列获取请求参数的方法,如下表所示:

返回值类型 方法声明 描述
String getParameter(String name) 返回指定参数名的参数值
String [] getParameterValues(String name) 以字符串数组的形式返回参数名的所有参数值(HTTP请求中可以有多个相同参数名的参数)
Enumeration 个体ParameterNames() 以枚举集合的形式返回请求中所有的参数名
Map getParameterMap() 用于将请求中的参数名和参数值装入一个Map对象中返回

示例3
创建form.html,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/httpServletRequestDemo/RequestParam" method="post">
        <table border="1" width="50%">
            <tr>
                <td colspan="2" align="center">编程帮wwww.biancheng.net</td>
            </tr>
            <tr>
                <td>输入姓名</td>
                <td><input type="text" name="username" /></td>
            </tr>
            <tr>
                <td>输入密码</td>
                <td><input type="password" name="password" /></td>
            </tr>
            <tr>
                <td>选择性别</td>
                <td><input type="radio" name="sex" value="male" /><input
                    type="radio" name="sex" value="female" /></td>
            </tr>
            <tr>
                <td>选择使用的语言</td>
                <td><input type="checkbox" name="language" value="JAVA" />JAVA
                    <input type="checkbox" name="language" value="C" />C语言 <input
                    type="checkbox" name="language" value="PHP" />PHP <input
                    type="checkbox" name="language" value="Python" />Python</td>
            </tr>
            <tr>
                <td>选择城市</td>
                <td><select name="city">
                        <option value="none">--请选择--</option>
                        <option value="beijing">北京</option>
                        <option value="shanghai">上海</option>
                        <option value="guangzhou">广州</option>
                </select></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交" /></td>
            </tr>
        </table>
    </form>
</body>
</html>

再创建一个名为RequestParam的Servlet类,代码如下:

package com.servletlearning.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

@WebServlet(name = "RequestParam")
public class RequestParam extends HttpServlet {
    private static final long serialVersionUID =1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer=response.getWriter();
        // 获取内容,做其他操作
        // 获取姓名
        String username=request.getParameter("username");
        // 获取密码
        String password =request.getParameter("password");
        // 获取性别
        String sex=request.getParameter("sex");
        // 获取城市
        String city=request.getParameter("city");
        // 获取语言
        String[] languages=request.getParameterValues("language");
        writer.write("用户名:" + username + "<br/>" + "密码:" + password + "<br/>" + "性别:" + sex + "<br/>" + "城市:" + city
                + "<br/>" + "使用过的语言:" + Arrays.toString(languages) + "<br/>");
    }
}

访问form.html并填写信息,结果如下:

点击提交:

posted @   Logic·G  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示