HttpServletRequest:
消息行:getMethod(),getRequestURL(),getRequestURI(),getContextPath(), getQueryString()的方法
消息头:getHeader(),getHeaderNames(),getHeaders()
消息体:
getParameter(String name) getParameterValues(String name),getParameterNames(),
Map<String,String[]>getParameterMap() PropertyDiscriptor
ServletInputStream in = getInputStream()--URLDecoder.decode()
上面的这些方法我们挨个使用一下
消息行中的信息df
//获取请求消息行中的信息的方法
System.out.println(request.getMethod());//获取请求方式
System.out.println(request.getRequestURL());//获取请求的路径
System.out.println(request.getRequestURI());//获取请求的资源路径
System.out.println(request.getContextPath());//获取当前应用的目录 /day34_request
System.out.println(request.getQueryString());//获取地址后跟的参数
消息头的方法:
String value = request.getHeader("User-Agent");
获取的是浏览器的信息
//getHeaderNames()方法的使用
Enumeration enu = request.getHeaderNames();
while(enu.hasMoreElements())
{
String name = (String) enu.nextElement();
String v = request.getHeader(name);
System.out.println(name+":"+v);
}
获取头信息中的所以信息
处理消息体的方法
//告诉服务器客户端使用的编码,以post方式提交表单数据的乱码问题
request.setCharacterEncoding("utf-8");
//得到用户名--表单中的数据默认都是字符串的
String username = request.getParameter("username");
//得到密码
String psw = request.getParameter("pwd");
//得到性别
String sex = request.getParameter("sex");
//得到爱好
String[] hobbys = request.getParameterValues("hobby");
//得到所在城市
String city = request.getParameter("city");
System.out.println(username+" "+psw+" "+sex+" "+city);
for(String ss:hobbys)
{
System.out.print(ss+" ");
}
上面说了以post方式提交数据解决乱码的方式,就是告诉服务器客户端使用的编码方式。
request.setCharacterEncoding(“utf-8”);
下面我们看一下getParameterNames(),获得所有属性的名字
request.setCharacterEncoding("utf-8");
Enumeration en = request.getParameterNames();//得到所有的name
while(en.hasMoreElements())
{
String name = (String) en.nextElement();//得到一个参数名
//根据名字获取值
String[] values = request.getParameterValues(name);
System.out.print(name);
for(int i=0;values!=null && i<values.length;i++)
{
System.out.print(values[i]+" ");
}
System.out.println();
}
下面我们将获取来的数据封装起来,然后展示
try {
request.setCharacterEncoding("utf-8");
//getParameterMap的使用
Map<String,String[]> maps = request.getParameterMap();//一次性得到表单上提交过来的所有名称值对儿
User user = new User();
//遍历Map集合
for(Map.Entry<String, String[]> en:maps.entrySet())// username=冬冬
{
String name = en.getKey();//得到键 username
String[] value = en.getValue();//得到值
//属性描述器 getUsername() setUsername()---Method
PropertyDescriptor des = new PropertyDescriptor(name, User.class);
//从属性描述器中得到set方法
Method m = des.getWriteMethod();
//执行 set方法
if(value.length==1)
m.invoke(user, value[0]);
else
m.invoke(user, (Object)value);
}
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
这是我们自己写的方法来实现这个功能,User类就不展示了。
当然,也有封装好的类实现了这个功能。
try {
request.setCharacterEncoding("utf-8");
User user = new User();
BeanUtils.populate(user, request.getParameterMap());
System.out.println(user);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
需要用到两个包
使用commons-beanutils.jar和commons-logging.jar实现上边的功能
包去我的资源里下载。
ServletInputStream
//使用getInputStream()获取表单提交的数据
ServletInputStream in = request.getInputStream();
int len = 0;
byte[] arr = new byte[1024];
while((len = in.read(arr))!=-1)
{
//System.out.println(new String(arr,0,len));
System.out.println(URLDecoder.decode(new String(arr,0,len,"utf-8"), "utf-8"));
}
in.close();
以get方式提交表单时,乱码问题的解决,之前说了post提交时乱码问题。
get方式解决乱码需要先解码,然后再编码。
//再编码,再解码功能的函数
public String fun(String str)
{
String result = "";
try {
result = new String(str.getBytes("ISO8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//以get方式提交表单数据的乱码处理---tomcat默认用iso8859-1进行解码,所以乱码
//获取用户名
String name = request.getParameter("username");
// //再编码
// byte[] arr = name.getBytes("ISO8859-1");
// //再解码
// String ss = new String(arr,"utf-8");
String ss = fun(name);
System.out.println(ss);
}
这里我们将编码解码的过程封装到了一个函数里。
其他的看代码注释把。