Servlet 学习笔记②
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>