学习总结之 Servlet入门知识 处理Request

 l使用GET方式向服务器请求资源

 浏览器向服务器发送的信息:


GET /?username=213&psw=321HTTP/1.1         //请求行

Accept: */*                                //以下都是请求头

Accept-Language: zh-cn

User-Agent: Mozilla/4.0

Accept-Encoding: gzip, deflate

Host: 127.0.0.1:8888

Connection: Keep-Alive                    //请求头

                                           //一个空行

 

 

l使用POST方式向服务器请求资源

 

POST / HTTP/1.1                               //请求行

Accept: */*                                   //以下都是请求头

Accept-Language: zh-cn

User-Agent: Mozilla/4.0

Accept-Encoding: gzip, deflate

Host: 127.0.0.1:8888

Content-Length: 53

Connection: Keep-Alive

Cache-Control: no-cache                       //请求头

//一个空行

username=11111&psw=222                        //实体内容

 

 

以上信息为使用HTML表单

和以下代码共同使用打印:

public class StaticWebServer {
	public static void main(String[] args) {
		int port = 8888;
		try {
			// 开启服务器,等待客户端的链接
			ServerSocket ss = new ServerSocket(port);
			System.out.println("服务器已经启动,正在监听" + port + "端口...");
			// 不断地接收客户端的请求
			while (true) {
				final Socket socket = ss.accept();
				// 用多线程可以处理多个客户端的请求a
				new Thread() {
					public void run() {
						try {
							// 接收客户端发送过来的信息
							InputStream in2 = socket.getInputStream();
							for (int b = -1; (b = in2.read()) != -1;) {
								System.out.print((char) b);
							}
							socket.close();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}.start();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

l区别:GET vs  POST

 

1、GET方式

1)可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔(其数据容量不能超过1K。),例如:

       GET/mail/1.html?name=abc&password=xyz HTTP/1.1

2)提交加密敏感信息是最后不要用GET方法

3)GET可以使用缓存

 

2、POST方式

1)POST方式提交的参数会放在实体内容里面,多个参数之间以&分割, 传送的数据量无限制。

2)适合提交加密敏感信息

3)POST不能使用缓存


l用于HTTP请求中的常用头


Accept: text/html,image/*   客户端支持的数据类型

Accept-Charset: ISO-8859-1   客户端支持的编码

Accept-Encoding: gzip,compress  客户端的数据压缩格式

Accept-Language: en-us,zh-cn   客户端支持的语言

Host: www.it315.org:80   客户端访问的主机地址

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 客户端缓存的时间

Referer: http://www.it315.org/index.jsp  从哪个资源访问服务器(防盗链)

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT 5.0) 客户端软件环境(浏览器类型,版本)

Cookie:

Connection: close/Keep-Alive    是否维持连接

Date: Tue, 11 Jul 2000 18:23:51 GMT   发送请求的时间


l处理Request:

 

常用的两种doGet和doPost,所以只需要在子类overriding doGet()和doPost();

 

Servlet程序会自动使用service方法接收standardHTTP requests,然后调用doXXX methods

package cn.itcast.request;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestRequest
 */
public class TestRequest extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

		// request.setCharacterEncoding("utf-8");//在这里无效,其只对实体编码有效
		System.out.println("TestRequest.doGet()");

		/****************** 获取 请求行 信息 ***********************************/
		// 获取信息的方法详见 API--> HttpServletRequest
		System.out.println(request.getMethod());// 输出: GET
		System.out.println(request.getQueryString());//
		// 输出:username=1111&password=222222

		/****************** 获取 URI 信息 ***********************************/
		System.out.println(request.getRequestURI());
		// 输出:day10httpRequest/TestRequest.do

		/****************** 获取 请求头 信息 ***********************************/
		System.out.println(request.getHeader("Host"));// 输出: localhost:8080

		/****************** 遍历 请求头 信息 ***********************************/
		Enumeration enums = request.getHeaderNames();
		while (enums.hasMoreElements()) {
			String headerName = enums.nextElement();
			String headerValue = request.getHeader(headerName);
			System.out.println("参数:" + headerName + ":" + headerValue);
		}

		/************ 【案例一:查看用户浏览器的类型】 ***************************/

		String userAgent = request.getHeader("User-Agent");
		System.out.println("浏览器类型:" + userAgent);
		/*
		 * 输出:浏览器类型:Mozilla/5.0 (Windows NT 6.1; WOW64)
		 */

		if (userAgent.contains("Firefox")) {
			System.out.println("这是火狐浏览器");
		} else if (userAgent.contains("Chrome")) {
			System.out.println("这是谷歌浏览器");
		} else if (userAgent.contains("Trident")) {
			System.out.println("这是IE浏览器");
		} else {
			System.out.println("这是不认识的浏览器");
		}

		/***************** 【案例二:防盗链】 **************************/

		response.setContentType("text/html;charset=utf-8");
		String referer = request.getHeader("Referer");
		if (referer != null && (referer.contains("localhost"))) {
			response.getWriter().write("这是我的网站正确内容");
		} else {
			response.getWriter().write(
					"小子,你盗用我网站的东西,赶紧去自首!");
		}

		/*************** 根据参数的名称获取参数的值 ************************/

		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println("统一方式1:" + username + ":" + password);
		// 输出:统一方式1:111111111:22222222222

		/************** 遍历所有的参数名 并且获得参数值 *********************/

		Enumeration enums2 = request.getParameterNames();

		while (enums2.hasMoreElements()) {
			String paramName = enums2.nextElement();
			String paramValue = new String(request.getParameter(paramName)
					.getBytes("iso8859-1"), "utf-8");
			System.out.println("统一方式2" + paramName + ":" + paramValue);
		}
		/************************* 编码问题 ******************************/

		// tomcat默认会把所有URL的内容都按照ISO8859-1来编码
		// String paramValue = request.getParameter(paramName);这样出来的是 乱码

		/*
		 * 解决编码问题第二种方式: 修改tomcat/conf/server.xml
		 * 
		 * 
		 * 
		 * 在这里追加 URIEncoding="utf-8",作用是修改tomcat对URL内容的编码格式
		 */

	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TestRequest.doPost()");

		/****************** 编码问题 ****************************/

		request.setCharacterEncoding("utf-8");
		// 1、这个修改编码的方法一定要在所有获取参数的方法前面
		// 2、这个编码要和页面上的编码保持一致
		// 3、这个方法只能设置实体内容的编码,所以对Post方法提交的参数编码问题是有效的,但是对Get方法提交的参数无效!

		/**************** 根据参数的名称获取参数的值 ********************/

		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println("统一方式1:" + username + ":" + password);

		/************* 遍历所有的参数名 并且获得参数值 *****************/

		Enumeration enums2 = request.getParameterNames();

		while (enums2.hasMoreElements()) {
			String paramName = enums2.nextElement();
			String paramValue = request.getParameter(paramName);
			System.out.println("统一方式2" + paramName + ":" + paramValue);
		}

	}

}



你可能感兴趣的:(Servlet入门知识,JAVAEE,Servlet,Request,请求行)