(WEB学习笔记 二)
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。简而言之,Request对象是用来获取服务器端发送的各种数据。
一、Request常用方法
1、获得客户机信息
getRequestURL方法:返回客户端发出请求时的完整URL
getRequestURI方法:返回请求行中的资源名部分
getQueryString 方法:返回请求行中的参数部分
getPathInfo方法:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头
getRemoteAddr方法:返回发出请求的客户机的IP地址
getRemoteHost方法:返回发出请求的客户机的完整主机名
getRemotePort方法:返回客户机所使用的网络端口号
getLocalAddr方法:返回WEB服务器的IP地址
getLocalName方法:返回WEB服务器的主机名
具体函数使用以及运行后得到的结果示例如下:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//getRequestURL方法:返回客户端发出请求时的完整URL
System.out.println(request.getRequestURL());//http://localhost:8080/JavaServlet/RequestDemo3
//getRequestURI方法返回请求行中的资源名部分 System.out.println(request.getRequestURI()); //JavaServlet2/RequestDemo3
//getQueryString 方法返回请求行中的参数部分
//http://localhost:8080/JavaServlet/RequestDemo3?username=zhangsan
System.out.println(request.getQueryString()); //username=zhangsan
//getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
//System.out.println(request.getPathInfo()); //null
//getRemoteAddr方法返回发出请求的客户机的IP地址
System.out.println(request.getRemoteAddr()); //127.0.0.1
//getRemoteHost方法返回发出请求的客户机的完整主机名 如果对应的ip地址有在dns注册那么返回的是地址www.163.com,如果没有则返回对应的ip的地址
System.out.println(request.getRemoteHost());
//getRemotePort方法返回客户机所使用的网络端口号
System.out.println(request.getRemotePort());//远程端口号,不是服务器的端口号 57480
System.out.println(request.getServerPort());//获取的服务器的端口号 8080
//获取客户端请求的方法 GET POST方式
System.out.println(request.getMethod());//GET
//获取当前资源
System.out.println(request.getServletPath()); // /RequestDemo3
//获取WEB服务器的主机名
System.out.println(request.getLocalName()); //MS-20160306KAOF
}
2、获得客户机请求头信息
getHeader方法(String):获取单个请求头信息
getHeaders方法 (枚举):获取所有的请求头中指定的某个头信息的全部内容
getHeaderNames方法 :获取全部的请求头信息
请求头信息示例:
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding
gzip, deflate
Accept-Language
zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cache-Control
max-age=0
Connection
keep-alive
Cookie
JSESSIONID=8CCB5ACFDC24ABD3374D5E6F1BF396A5
Host
localhost:8080
User-Agent
Mozilla/5.0 (Windows NT 5.1; rv:46.0) Gecko/20100101 Firefox/46.0
具体示例代码:
public class RequestDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取单个请求头信息
String headValue=request.getHeader("Accept-Encoding");
System.out.println(headValue);
//获取所有的请求头指定的某个头信息的全部内容,Enumeration装的是指定的属性的全部的value值
Enumeration<String> en=request.getHeaders("Accept-Encoding");
while(en.hasMoreElements()){
String value=en.nextElement();
System.out.println(value);
}
//获取全部的头信息 Enumeration装的是所有的key值
en=request.getHeaderNames();
while(en.hasMoreElements()){
String name=en.nextElement();//所有的key值
String value =request.getHeader(name);//根据key值获取value值
System.out.println("name="+name+"-----value="+value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3、获得客户机请求参数(客户端提交的数据)
getParameter方法:获取一个值
getParameterValues(String name)方法:获取一个数组
getParameterNames方法:枚举
getParameterMap方法:map集合
http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan ,?后即为请求参数
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取单个的请求参数信息
//http://localhost:8080/JavaServlet/RequestDemo2?name=123
String name = request.getParameter("name");
System.out.println(name);
//获取多个同名的参数
//http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan
String [] names = request.getParameterValues("name");
for(String sname : names){
System.out.println(sname);
}
//获取所有的请求参数
//http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan
Enumeration<String> en =request.getParameterNames();
while(en.hasMoreElements()){
String key = en.nextElement();
String vale=request.getParameter(key);
System.out.println(key+"----"+vale); //name----123 因为key值唯一,所以只有一个值
}
//获取请求参数 以map的形式保存
//http://localhost:8080/JavaServlet/RequestDemo2?name=123&name=zhangsan&password=123456
Map<String,Object> map = request.getParameterMap();
//对map迭代 获取所有的key 和value值
for(Map.Entry<String, Object> me : map.entrySet()){
String name = me.getKey();
String [] value = (String []) me.getValue();
System.out.println(name+"---"+value[0]); //name---123 password---123456
}
}
(注:浏览器访问网址http://localhost:8080/JavaServlet/RequestDemo2?name=123 ,?代表设置参数)
二、request常见应用
1、各种表单输入项数据的获取
各种类型的表单信息都可以获取,text、password、radio、checkbox、file、select、textarea、 hidden、image、button
如果我们建立了一个注册表单,则需要把先获取用户填写的注册信息,再保存到数据库以备调用
表单示例:
<!DOCTYPE html>
<html>
<head>
<title>form.html</title>
</head>
<body>
<!-- action是指定提交表单的位置 method是指提交的方式 有 get方式 和post方法 -->
<form action="/JavaServlet/RequestDemo4" method="post">
<!-- name属性,提交表单的时候,根据name属性获取值 -->
用户名:<input type = "text" name="username"> <br/>
密码:<input type="password" name="password"><br/>
性别:<input type = "radio" name="gender" value = "male">男
<input type="radio" name="gender" value="femal">女<br/>
所在地:<select name="city">
<option value="beijing">北京</option>
<option value="hangzhou">杭州</option>
<option value="shanghai">上海</option>
</select><br/>
爱好:<input type="checkbox" name="likes" value="single"/>唱歌
<input type="checkbox" name="likes" value="dance"/>跳舞
<input type="checkbox" name="likes" value="sleep"/>睡觉
<input type="checkbox" name="likes" value="football"/>足球
<br/>
备注:<textarea rows="5" cols="60" name="description"></textarea><br/>
大头照:<input type="file" name="image">
<input type = "hidden" name = "id" value = "123456">
<input type = "submit" value = "提交">
</form>
</body>
</html>
利用Request对象获取表单数据:
表单的数据都是请求参数,可以以请求参数的方式获取
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//表单的数据都是请求参数,可以以请求参数的方式获取
String username =request.getParameter("username");
String password = request.getParameter("password");
String gender =request.getParameter("gender");
String city =request.getParameter("city");
String [] likes =request.getParameterValues("likes");
String description=request.getParameter("description");
String id=request.getParameter("id");
//得到的数据封装到领域对象中传递到业务层 完成相关的操作
System.out.println("用户名是"+username+"密码是:"+password+"性别是:"+gender+"所在城市是:"+city+"描述是:"+description+"隐藏的id是:"+id);
for (String ss : likes) {
System.out.println("爱好是:"+ss);
}
}
2、请求参数的中文乱码问题 (以表单输入为例)
这里分为post方式和get方式,两种提交方式的解决方法不一样
示例表单:
<!DOCTYPE html>
<html>
<head>
<title>form2.html</title>
</head>
<body>
<form action="/JavaServlet/RequestDemo5" method="post">
用户名:<input type="text" name="username">
<input type="submit" value="提交">
</form>
<form action="/JavaServlet/RequestDemo5" method="get">
用户名:<input type="text" name="username2">
<input type="submit" value="提交">
</form>
</body>
</html>
1)解决post方式乱码 问题
解决post方式乱码,直接设置编码集即可
request.setCharacterEncoding("UTF-8");
2)解决get方式乱码
用户只能通过手动转换,把默认的编码集”ISO-8859-1”转换为我们所需要的编码集就可以了
String uname=new String(username.getBytes("ISO-8859-1"),"UTF-8");
public void test1(HttpServletRequest request) throws IOException{
// 解决post方式乱码 直接设置编码集即可
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
System.out.println(username);
}
//解决get方式的乱码
public void test2(HttpServletRequest request) throws IOException{
String username = request.getParameter("username2");
String uname= new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(uname);
}
3)如果是get方式乱码 ,还可以直接改变服务器的配置实现(不推荐使用)
打开 tomcat 安装目录 –> conf –> server.xml :
在下面代码中加入 URIEncoding=”UTF-8” 即可
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
/>