1. HTTP 简介
- WEB 浏览器和WEB 服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP 协议。
- HTTP 是 hypertext transefer protocal(超文本传输协议)的简写, 它是TCP/IP协议集中的的一个应用层协议,用于定义WEB浏览器与WEB 服务器之间交换数据的过程以及数据本身的格式。
- HTTP 协议的版本HTTP/1.0, HTTP/1.1, HTTP-NG
2. HTTP 的会话方式
- 浏览器与WEB 服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB 服务器都要建立一次单独的连接。
- 浏览器到WEB 服务器之间的所有通讯都是完全独立分开的请求和响应对。
- 四个步骤:
- 浏览器访问多图网页的过程:如果一个网页文档里面有三张图片,则会有4个请求响应对。
3. HTTP 请求消息, 请求消息的结构:一个请求行,多个消息头,以及实体内容。其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
POST 请求和GET 请求方式传递参数:
- POST 特点:
- POST 请求方式主要用于向WEB 服务器端程序提交FORM 表单中的数据: form 表单的method 设置为POST
- POST 方式将各个表单的字段元素以及数据作为HTTP 消息的实体内容发送给WEB 服务器, 传送的数据量比使用GET 方式传送的数据量大的多。
- POST 方式保密性好,不会像GET 方式那样把用户名密码之类的信息显示在请求URL 中, 作为表单的请求,一般都采用这种方法。
- POST 请求实例:
- GET 特点:
- 在浏览器的地址栏中输入某个URL 地址或者单击网页的一个超链接时,浏览器翻出的HTTP 请求消息的请求方式为GET
- 如果网页中的 <form> 表单元素的method 值被设置为“GET,浏览器提交这个FROM表单时生成的HTTP 请求消息的请求方式也为GET。
- 使用GET请求方式给WEB 服务传递参数的形式:
-
- 传递的数量是有限制的,一般在1kb 以下;
- 用户数据保密性差
- Get 请求实例:
4. 如何在Servlet 中获取请求信息
① Servlet 中的service() 方法用于应答请求: 因为每次请求都会调用service() 方法.
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException
- ServletRequest: 封装了请求信息,可以从中获取到任何的请求信息
- ServletResponse: 封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现
这两个接口的实现类都是服务器给予实现的,并在服务器调用service 方法时传入。
②. ServletRequest (这里只列举了部分的方法,所有和请求有关的信息都可以查阅ServletRequest(一般我们使用其子接口HttpServletRequest) 的文档)
- 获取请求参数
- String getParameter(String name) 根据参数名称,返回参数值。若请求参数有多个值(比如复选框),则只能返回参数的第一个值。
- String[] getParameterValues(String name): 根据参数名称,返回参数值数组。
- Enumeration<String> result = request.getParameterNames(); 返回参数名称对应的Enumeration 对象,类似于ServletConfig (或者ServletContext) 对应的getInitParameterNames() 方法
- Map getParameterMap(): 返回请求参数的键值对: key: 参数名 value: 参数值(String 数组类型)
- 获取请求的URI
String requestUri = httpRequest.getRequestURI();
System.out.println(requestUri);
- 获取请求的Method:
String requestMethod = httpRequest.getMethod();
System.out.println(requestMethod);
- 若是一个GET 请求,获取请求参数对应的字符串,即“?” 后面的字符串
String queryString = httpRequest.getQueryString();
System.out.println(queryString);
- 获取请求Servlet 的映射路径:
String servletPath = httpRequest.getServletPath();
System.out.println(servletPath);
- 和attribute 相关的几个方法:
。。。。。待续
③ HttpServletRequest: 是ServletRequest 的子接口,针对HTTP 请求所定义,里面包含了大量的获取HTTP 请求的相关方法。
④ ServletResponse 中的常用方法
- getWriter()
PrintWriter out = response.getWriter();
out.write("hellowolrd");
- 设置响应的内容类型
response.setContentType("applocation/msword");
- 获取输出流:
getOutputStream()
- void senRedirect(String location): 请求的重定向,这是一个非常重要的方法
代码:
package servlettest;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class HttpServletTest implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("This is service");
String user = request.getParameter("user");
String password = request.getParameter("password");
System.out.println(user);
System.out.println(password);
String[] interesting = request.getParameterValues("interesting");
System.out.println(interesting.length);
for (int i = 0; i < interesting.length; i++) {
System.out.println(interesting[i]);
}
System.out.println("===============================");
Enumeration<String> result = request.getParameterNames();
while (result.hasMoreElements()) {
System.out.println(result.nextElement());
}
System.out.println("===============================");
Map<String, String[]> resultMap = (Map<String, String[]>) request.getParameterMap();
Set<String> resultMapKey = resultMap.keySet();
for (Object key : resultMapKey) {
for (int i = 0; i < resultMap.get(key).length; i++) {
System.out.println(resultMap.get(key)[i]);
}
}
System.out.println("===============================");
for (Map.Entry<String, String[]> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + Arrays.asList(entry.getValue()));
}
System.out.println("===============================");
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestUri = httpRequest.getRequestURI();
System.out.println(requestUri);
String requestMethod = httpRequest.getMethod();
System.out.println(requestMethod);
String queryString = httpRequest.getQueryString();
System.out.println(queryString);
String servletPath = httpRequest.getServletPath();
System.out.println(servletPath);
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>httpServletTest</servlet-name>
<servlet-class>servlettest.HttpServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>httpServletTest</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
</web-app>
HTML 文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="loginServlet" method="get">
user: <input type="text" name="user">
password: <input type="text" name="password">
<br><br>
interesting:
<input type="checkbox" name="interesting" value="reading">reading
<input type="checkbox" name="interesting" value="palyboy">palyboy
<input type="checkbox" name="interesting" value="playgirl">playgirl
<input type="checkbox" name="interesting" value="football">football
<input type="checkbox" name="interesting" value="basketball">basketball
<input type="checkbox" name="interesting" value="swiming">swiming
<input type="checkbox" name="interesting" value="eating">eating
<input type="submit" value="Submit"/>
</form>
</body>
</html>