您的位置:首页 > 理论基础 > 计算机网络

Servlet程序获取http协议提交的信息

2016-06-07 17:27 531 查看

Servlet程序获取http协议提交的信息

Servlet程序获取http协议提交的信息
实现过程以及存在的问题

编码问题

实现过程以及存在的问题

下面是其Java Servlet代码:

package com.jpzhutech.servlet;

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

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

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

/**
* @see HttpServlet#HttpServlet()
*/
public TestHtmlProtocol() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

/*//获得请求行信息,在web项目的编程过程中获得请求行信息也是一种需求,请求行包括获得http协议版本、URI地址、URL地址、请求的方法
String protocol = request.getProtocol();
System.out.println(protocol);
String method = request.getMethod();
System.out.println(method);
String requestURI = request.getRequestURI();
System.out.println(requestURI);*/

/*
//获得请求头信息,请求头是整个http请求中第二个关键的部分
//String header = request.getHeader("Accept-Encoding");  //根据请求头常见key,求得其对应的value,前提是你得知道key
//System.out.println(header);

Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String nextElement = headerNames.nextElement();
String header = request.getHeader(nextElement);
System.out.println(nextElement+":"+header);
}*/

/* 方法一
//这段代码可以的得到整个表单提交的全部数据,以key-value的形式呈现,但是存在的问题是:如果我们想获取其中一个数据,那么我们还需要对得到的
//字符串进行分割的操作,这样无疑增加了整个处理的难度,那么是否有好的办法解决呢?回答是有

System.out.println("GET提交方式");
String value = request.getQueryString();  //得到GET方式提交的全部数据
System.out.println(value);
*/

/* 方法二,获得想要的单个信息
该段代码对于GET方式和POST方式都是成立的,也就是说这是一段通用的代码,但是很明显该段代码存在一个很大的问题,就是在checkbox(多选框中)时,我们是
选了多个爱好,但是实际上只给我显示了一个爱好,这个是一个bug,后续的方法会解决

//对于我们想要得到的任何属性,只要使用下面的方法就能得到正确的值
String name = request.getParameter("name");  //在这里的"name"参数是在表单中使用的name属性规定的
//String name = request.getParameter("name1");   //如果在表单中没有这个属性
//System.out.println(name="+name);               //则输出为null
System.out.println("name="+name);

//如果我们想要获取所有表单属性中的值呢?
Enumeration<String> parameterNames = request.getParameterNames(); //获取表单中所有的属性名
while(parameterNames.hasMoreElements()){
String nextElement = parameterNames.nextElement();   //遍历迭代器得到所有的属性名
String parameter = request.getParameter(nextElement); //根据属性名获得全部的属性值
System.out.println(nextElement+":"+parameter);
}
*/

/* 方法三 解决方法二中出现的问题,对于多选框中的值不能全部输出的问题

//如果我们想要获取所有表单属性中的值呢?
Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名
while (parameterNames.hasMoreElements()) {
String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名
if("hobits".equals(nextElement)){
String[] parameterValues = request.getParameterValues(nextElement);
for(String string : parameterValues){
System.out.print(nextElement+"="+string+",");
}
System.out.println();
}else{
String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值
System.out.println(nextElement + ":" + parameter);
}

}
*/

/* 方法四 实际上方法四还是存在一个很大的问题,看我们输出可以知道,实际上我们在输出籍贯等这些信息时,使用的全部都是字母输出,不是汉字,并且当你使用汉字对
表单中的value属性进行赋值时,显示出来的全部是乱码,这是中国人经常会遇到的所谓乱码问题,各种乱码问题都会经常在我们编程的过程中出现,要想解决问题必须要知道为什么会发生这样的问题呢?
我们的浏览器客户端使用的是UTF-8编码,但是在tamcat服务器端在解码时使用的是ISO-8859-1编码,这样的话就会发生编码不一致,导致不能正确的解码,
下面将会提出两种方法去解决这个问题
*/

/*
//手动设置字符串的编码,由于在服务器端得到的字符串都是使用iso-8859-1编码,所以需要将得到的字符串进行手动的解码工作,下面是手动解码的代码
//request.setCharacterEncoding("utf-8"); //该方法只对请求实体内容的编码起作用,POST提交的内容在实体内容中,所以该方法只对POST方法有效
System.out.println("GET提交方式");
Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名
while (parameterNames.hasMoreElements()) {
String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名
String str = new String(nextElement.getBytes("ISO-8859-1"),"utf-8"); //首先用iso-8859-1将字符串解码成字节,接着再使用utf-8编码生成新的字符串
if("爱好".equals(str)){
String[] parameterValues = request.getParameterValues(nextElement);
for(String string : parameterValues){
String string2 = new String(string.getBytes("ISO-8859-1"),"utf-8");
System.out.print(str+"="+string2+",");
}
System.out.println();
}else{
String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值
String string3 = new String(parameter.getBytes("ISO-8859-1"),"utf-8");
System.out.println(str + ":" + string3);
}

}*/

}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

/*// 获得请求行信息,在web项目的编程过程中获得请求行信息也是一种需求,请求行包括获得http协议版本、URI地址、URL地址、请求的方法
String protocol = request.getProtocol();
System.out.println(protocol);
String method = request.getMethod();
System.out.println(method);
String requestURI = request.getRequestURI();
System.out.println(requestURI);*/

/*// 获得请求头信息,请求头是整个http请求中第二个关键的部分
// String header = request.getHeader("Accept-Encoding");
// //根据请求头常见key,求得其对应的value,前提是你得知道key
// System.out.println(header);

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String nextElement = headerNames.nextElement();
String header = request.getHeader(nextElement);
System.out.println(nextElement + ":" + header);
}*/
/* 方法一
//这段代码和doGet方法中的第一种方法一样都是一次性的获取到全部的提交数据,这样同样会导致当我们想要使用其中的某些数据时,必须将得到的字符串进行
//分割,然后得到其中想要的值,这无疑增加了整个处理的难度。是否有好的办法解决呢?回答是有
InputStream inputStream = request.getInputStream();
byte[] buf = new byte[1024];   //使用缓冲数组获取输入流中的数据,数组的大小以1024的倍数为单位进行增长
int length = 0;   //缓冲数组实际的大小
System.out.println("POST提交方式");
while((length = inputStream.read(buf)) != -1){   //当输入流中没有数据时,会返回-1,此时终止程序的执行
System.out.println(new String(buf,0,length));  //用得到的缓冲数组重新构建字符串并输出到控制台
}
*/

/* 方法二,获得想要的单个信息
该段代码对于GET方式和POST方式都是成立的,也就是说这是一段通用的代码,但是很明显该段代码存在一个很大的问题,就是在checkbox(多选框中)时,我们是
选了多个爱好,但是实际上只给我显示了一个爱好,这个是一个bug,后续的方法会解决

//对于我们想要得到的任何属性,只要使用下面的方法就能得到正确的值
String name = request.getParameter("name");  //在这里的"name"参数是在表单中使用的name属性规定的
//String name = request.getParameter("name1");   //如果在表单中没有这个属性
//System.out.println(name="+name);               //则输出为null
System.out.println("name="+name);

//如果我们想要获取所有表单属性中的值呢?
Enumeration<String> parameterNames = request.getParameterNames(); //获取表单中所有的属性名
while(parameterNames.hasMoreElements()){
String nextElement = parameterNames.nextElement();   //遍历迭代器得到所有的属性名
String parameter = request.getParameter(nextElement); //根据属性名获得全部的属性值
System.out.println(nextElement+":"+parameter);
}
*/

/* 方法三 解决方法二中出现的问题,对于多选框中的值不能全部输出的问题

//如果我们想要获取所有表单属性中的值呢?
System.out.println("POST提交方式");
Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名
while (parameterNames.hasMoreElements()) {
String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名
if("hobits".equals(nextElement)){
String[] parameterValues = request.getParameterValues(nextElement);
for(String string : parameterValues){
System.out.print(nextElement+"="+string+",");
}
System.out.println();
}else{
String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值
System.out.println(nextElement + ":" + parameter);
}

}
*/

/*//手动设置字符串的编码,由于在服务器端得到的字符串都是使用iso-8859-1编码,所以需要将得到的字符串进行手动的解码工作,下面是手动解码的代码
System.out.println("POST提交方式");
Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名
while (parameterNames.hasMoreElements()) {
String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名
String str = new String(nextElement.getBytes("ISO-8859-1"),"utf-8"); //首先用iso-8859-1将字符串解码成字节,接着再使用utf-8编码生成新的字符串
if("爱好".equals(str)){
String[] parameterValues = request.getParameterValues(nextElement);
for(String string : parameterValues){
String string2 = new String(string.getBytes("ISO-8859-1"),"utf-8");
System.out.print(str+"="+string2+",");
}
System.out.println();
}else{
String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值
String string3 = new String(parameter.getBytes("ISO-8859-1"),"utf-8");
System.out.println(str + ":" + string3);
}

}*/
}

}


对应使用的html表单代码如下:

<!DOCTYPE html>
<html>
<head>
<!--这里要遵循html5的规范对整个文件的编码进行规范说明 -->
<meta charset="utf-8" />
<title>TestHtml.html</title>

<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
<form action="/httpprotocol/TestHtmlProtocol" method="GET">
用户名<input type="text" name="name"  /><br />
密码<input type="password" name="password" /> <br />

<!-- 性别采用单选框 -->
性别
<input type="radio" name="gender" value="male" />男
<input type="radio" name="gender" value="female" />女

<br />
<!-- 爱好使用多选框 -->
爱好
<input type="checkbox" name="hobits" value="lq" />篮球
<input type="checkbox" name="hobits" value="zq" />足球
<input type="checkbox" name="hobits" value="ymq" />羽毛球
<br />

<!-- 籍贯采用下拉菜单 -->
籍贯
<select name="jiguan">
<option value="gd">广东</option>
<option value="gx">广西</option>
<option value="sz">深圳</option>
<option value="sx">山西</option>
</select>
<br />
<!-- 个人简介使用文本域 -->
个人简介
<textarea rows="5" cols="10" name="info">
</textarea>

<!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 -->
<input type="hidden" name="id" value="001" /><br />

提交<input type="submit" value="提交" /><br />
</form>
<hr />
<hr />
<hr />
<form action="/httpprotocol/TestHtmlProtocol" method="POST">
用户名<input type="text" name="name"  /><br />
密码<input type="password" name="password" /> <br />

<!-- 性别采用单选框 -->
性别
<input type="radio" name="gender" value="male" />男
<input type="radio" name="gender" value="female" />女

<br />
<!-- 爱好使用多选框 -->
爱好
<input type="checkbox" name="hobits" value="lq" />篮球
<input type="checkbox" name="hobits" value="zq" />足球
<input type="checkbox" name="hobits" value="ymq" />羽毛球
<br />

<!-- 籍贯采用下拉菜单 -->
籍贯
<select name="jiguan">
<option value="gd">广东</option>
<option value="gx">广西</option>
<option value="sz">深圳</option>
<option value="sx">山西</option>
</select>
<br />
<!-- 个人简介使用文本域 -->
个人简介
<textarea rows="5" cols="10" name="info">
</textarea>

<!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 -->
<input type="hidden" name="id" value="001" /><br />

提交<input type="submit" value="提交" /><br />
</form>
<hr />
<hr />
<hr />

<!-- value是中文时的处理 -->
<form action="/httpprotocol/TestHtmlProtocol" method="GET">
用户名<input type="text" name="name"  /><br />
密码<input type="password" name="password" /> <br />

<!-- 性别采用单选框 -->
性别
<input type="radio" name="性别" value="男" />男
<input type="radio" name="性别" value="女" />女

<br />
<!-- 爱好使用多选框 -->
爱好
<input type="checkbox" name="爱好" value="篮球" />篮球
<input type="checkbox" name="爱好" value="足球" />足球
<input type="checkbox" name="爱好" value="羽毛球" />羽毛球
<br />

<!-- 籍贯采用下拉菜单 -->
籍贯
<select name="籍贯">
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="深圳">深圳</option>
<option value="山西">山西</option>
</select>
<br />
<!-- 个人简介使用文本域 -->
个人简介
<textarea rows="5" cols="10" name="个人简介">
</textarea>

<!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 -->
<input type="hidden" name="id" value="001" /><br />

提交<input type="submit" value="提交" /><br />
</form>
<hr />
<hr />
<hr />
<form action="/httpprotocol/TestHtmlProtocol" method="POST">
用户名<input type="text" name="name"  /><br />
密码<input type="password" name="password" /> <br />

<!-- 性别采用单选框 -->
性别
<input type="radio" name="性别" value="男" />男
<input type="radio" name="性别" value="女" />女

<br />
<!-- 爱好使用多选框 -->
爱好
<input type="checkbox" name="爱好" value="篮球" />篮球
<input type="checkbox" name="爱好" value="足球" />足球
<input type="checkbox" name="爱好" value="羽毛球" />羽毛球
<br />

<!-- 籍贯采用下拉菜单 -->
籍贯
<select name="籍贯">
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="深圳">深圳</option>
<option value="山西">山西</option>
</select>
<br />
<!-- 个人简介使用文本域 -->
个人简介
<textarea rows="5" cols="10" name="个人简介">
</textarea>

<!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 -->
<input type="hidden" name="id" value="001" /><br />

提交<input type="submit" value="提交" /><br />
</form>

</body>
</html>


编码问题

从上面的代码中可以看出,在涉及到中文问题时,最可能出现的问题就是编码问题,同样在Servlet编程过程中也存在这样的问题,总结一下本文涉及到的两种方式,另外附加一种方式,但是不建议使用该种方法去处理编码问题。

该种方法只限于POST提交方式中的实体内容,有限制

request.setCharacterEncoding(“utf-8”);

手动解码,推荐使用,目前采取该方法最好,之后可以采用过滤器重写其中的代码

修改tomcat服务器的配置文件,配置文件在/conf/server.xml,找到配置8080端口的xml行,在其中增加如下一行代码:

URIEncoding=”utf-8”;

本文对以上的三种方式都进行了测试,并且结果是正确的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: