您的位置:首页 > 产品设计 > UI/UE

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

2014-05-13 22:59 691 查看

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表单<form action="127.0.0.1:8888" method="GET和POST">和以下代码共同使用打印:

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<String> 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("<html><body>这是我的网站正确内容</body></html>");
} else {
response.getWriter().write(
"<html><body>小子,你盗用我网站的东西,赶紧去自首!</body></html>");
}

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

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

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

Enumeration<String> 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
*
* <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
* redirectPort="8443" URIEncoding="utf-8"/>
*
* 在这里追加 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、这个编码要和页面上的<meta charset="UTF-8">编码保持一致
// 3、这个方法只能设置实体内容的编码,所以对Post方法提交的参数编码问题是有效的,但是对Get方法提交的参数无效!

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

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

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

Enumeration<String> enums2 = request.getParameterNames();

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: