java Web Servlet学习笔记-1 HttpServletQequest对象的学习



HttpServletQequest对象的学习

HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。HttpServletRequest的对象时域对象。

常用方法:

获得客户机信息

getRequestURL方法返回客户端发出请求时的完整URL。

getRequestURI方法返回请求行中的资源名部分。

getQueryString 方法返回请求行中的参数部分。就是地址栏中?后面的内容

getRemoteAddr方法返回发出请求的客户机的IP地址

getRemoteHost方法返回发出请求的客户机的完整主机名

getRemotePort方法返回客户机所使用的网络端口号

getLocalAddr方法返回WEB服务器的IP地址。

getLocalName方法返回WEB服务器的主机名

getMethod得到客户机请求方式

获得客户机请求头

getHeader(name)方法

根据一个请求头的名称回去这个请求头的内容。获取的是单一的请求头内容

例:request.getHeader(“Accept-Encoding”)

getHeaders(String name)方法

getHeaderNames方法

代码演示:

//获取单一的请求头内容,根据请求头名称

String value = request.getHeader("Accept-Encoding");

System.out.println(value);//gzip, deflate

//获取所有请求头名称的枚举

System.out.println("所有请求头");

Enumeration en = request.getHeaderNames();

while(en.hasMoreElements()){

String headerName = (String) en.nextElement();

System.out.println(headerName+": "+request.getHeader(headerName));

}

System.out.println("=========================");

//获取重名的请求头内容,一个请求头名称可能对应多个不同的请求头内容

en = request.getHeaders("Accept-Encoding");

while(en.hasMoreElements()){

String headerValue = (String) en.nextElement();

System.out.println(headerValue);

}

获得客户机请求参数(客户端提交的数据)

getParameter(name)方法

getParameterValues(String name)方法

getParameterNames方法

getParameterMap方法  //做框架用,非常实用

getInputStream

代码演示:

//获取客户端请求参数---->例如:客户端提交的数据

//以客户端的表单form.html提交上来的数据就是请求参数

public class HttpServletRequestDemo2 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

test1(request);

}

//获取只单一名称输入域的参数

private void test1(HttpServletRequest request) {

//这里客服端输入的数据都是String类型的数据

String username = request.getParameter("usename");

String password = request.getParameter("password");

String code = request.getParameter("code");

System.out.println(username+"\t"+password+"\t"+code);

}

//获取具有重名的输入域参数

public void test2(HttpServletRequest request){

String username = request.getParameter("username");

//表单中有密码确认一项,所以对应的参数名称相同,获取所有参数值的数组

String[]  passwords = request.getParameterValues("password");

if(passwords != null&&passwords.length>0){

for (String password : passwords) {

System.out.println(password);

}

}

String code = request.getParameter("code");

System.out.println(username+"\t"+code);

}

//做框架使用,获取客户端请求参数的Map集合,其中key:是参数名称,value:是参数值数组

public void test3(HttpServletRequest request){

Map<String,String[]> map = request.getParameterMap();

//遍历map集合

Set<Map.Entry<String,String[]>> en = map.entrySet();

for (Map.Entry<String,String[]> entry : en) {

System.out.println(entry.getKey()+": "+Arrays.toString(entry.getValue()));

}

}

//做框架使用,获取客户端请求参数的Map集合,其中key:是参数名称,value:是参数值数组

public void test4(HttpServletRequest request) throws Exception{

Map<String,String[]> map = request.getParameterMap();

//创建一个默认初始化值的JavaBean

User user = new User();

System.out.println("封装前:"+user);

//遍历map集合

Set<Map.Entry<String,String[]>> en = map.entrySet();

for (Map.Entry<String,String[]> entry : en) {

String paraName = entry.getKey();

String[] paraValues = entry.getValue();

//将得到的参数数据存储到JavaBean中:内省的过程

PropertyDescriptor pd = new PropertyDescriptor(paraName, User.class);

Method methodSet = pd.getWriteMethod();

//这里是为了兼容invoke方法JDK1.4版本,1.4版本:invoke(Objet,Object[])

//当传入的是的参数值有多个时,应将这个数组强转成一个Object对象使用1.5版本

//也可以将这个数组当成一个Object[]对象也可以

//如果参数值只有一个,1.4版本和1.5版本都可以使用

if(paraValues.length==1){

methodSet.invoke(user, paraValues);

}else{

//如果参数值不止一个时,要强转

methodSet.invoke(user,(Object)paraValues);

//或者创建一个新的Object[]

//methodSet.invoke(user, new Object[]{paraValues});

}

}

System.out.println("封装后:"+user);

}

//使用第三方工具类BeanUtils,可以大大减少代码

public void test5(HttpServletRequest request) throws Exception{

Map<String,String[]> map = request.getParameterMap();

//创建一个默认初始化值的JavaBean

User user = new User();

System.out.println("封装前:"+user);

//内省:通过BeanUtils的populate方法将map的数据存储到user中

BeanUtils.populate(user, map);

System.out.println("封装前:"+user);

}

//获取正文的内容:通过getInputStream()方法,只有当客户端的请求方式是post方式才可以

public voidtest6(HttpServletRequest request) throws IOException{

InputStream in = request.getInputStream();

byte[] buf = new byte[1024];

int len = 0;

while((len = in.read(buf))!=-1){

System.out.println(new String(buf,0,len));

}

}

注意:客服端请求参数的中文乱码问题,当请求的参数中有中文,反馈给服务器程序可能会出现乱码

public class HttpServletRequestDemo3 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//post请求方式使用的编码方式是根据客户端使用的编码表,通过setCharactetEncoding("UTF-8"),通常默认都是UTF-8码表,但只能在

request.setCharacterEncoding("UTF-8");

//得到的字符串就是通过UTF-8进行查表得到的

String value = request.getParameter("username");

//get方式默认使用的是ISO-8859-1编码表进行编码

String paraValue = request.getParameter("username");

byte[] vbuf = paraValue.getBytes("ISO-8859-1");

String result = new String(vbuf,"UTF-8");

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

上一篇:原型设计工具—Axure


下一篇:【2016.3.22】作业 Word count 小程序