HttpServletRequest与HttpServletResponse作为Servlet中doGet、doPost等方法中传递的参数,承接了Http请求与响应中的大部分功能,请求的解析与响应的返回都需要靠这两个对象进行,他们中的所有方法及功能在下边总结了一下,希望能对学习Java Web开发有所帮助。
1、HttpServletRequest:
/* * 记录各个request.get的值 * request.getAsyncContext();AsyncContext * 获取异步传输的文本内容 * request.getAttribute(String);Object * Attribute与Parameter不同,Attr是在程序里用SetA设置进去的,而Par是接收网页的参数 * 多用于session的设值,session.setA,可以设置自己的类型,getP只能接收String,而getA可以为object * request.getAttributeNames();Enumeration<String> * 获取一个枚举类型,hasmoreelement,nextelement * request.getAuthType();String * 返回身份验证方法的名称,basic,SSL,form,client_cert和digest,若没有身份验证则为null * AuthType可在web.xml中配置,使用<login-config><auth-method>xx<real-name>xxx来配置 * 一般用于远程网页链接,即输入网页地址,弹出一个登陆界面,那里的时候才会用 * 读取文件头中的Authorization信息 * request.getCharacterEncoding();String * 返回网页使用的编码,在网页的charset中的值 * request.getContentLength();int * 只用于POST请求,表示所发送数据的字节数 * request.getContentLengthLong();long * 同上,用于数据量非常大时,long八个字节 * request.getContentType();String * 获取content-type,包括编码。<meta content="text/html; charset=gb2312" http-equiv="Content-Type"/> * Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件 * request.getContextPath();String * 获取项目的根目录名,如本项目应该是/MyTestWeb。返回指定servlet上下文(web应用)的URL的前缀。 * 用绝对路径时,可以使用getRealPath()(不推荐),request.getSession().getServletContext().getRealPath("/") * request.getCookies();Cookie[] * 很明显,返回网页的cookies,数组形式cookie是名称+值的形式保存的 * request.getDateHeader("String");long * 用于将指定头信息的部分转换成方便转换为时间类型的长整数型,简化getHeaders * request.getDispatcherType();DispatcherType * 未知... * request.getHeader("headname");String * 获取指定头信息 * request.getHeaderNames();Enumeration<String> * 获取名字的枚举,用于遍历 * request.getHeaders("headersname");Enumeration<String> * 获取一个name的多个值序列,返回请求给出的指定类型的所有HTTP头标的名称的枚举值,它对具有多取值的头标非常有用。 * request.getInputStream();ServletInputStream继承自io.InputStream * 获取请求内容,可以获取post方法在网页中通过send传递的内容,但是要通过InputStreamReader实例化 * 同时InputStreamReader也不能直接被读取为字符串,要使用BufferedReader实例化InputStreamReader * 之后就可以使用BufferedReader的readline来获取中间的数据了。 * 或者直接使用InputStream的read方法写给read的参数,byte数组 * 该方法只能读取一次,因为是流,所以读完就没了 * request.getIntHeader("head");int * 从头内容获取数值 * request.getLocalAddr();String * 获取本地地址,根据访问方法不同而不同,为127.0.0.1或者公网ip * request.getLocale();Locale(util中) * 获取本地位置信息,若ZHCN等等 * request.getLocales();Enumeration<Locale> * 有多个位置信息时获取枚举 * request.getLocalName();String * 获取本地IP的名称,如127.0.0.1就是localhost * request.getLocalPort();int * 获取端口号,本应用就是8081 * request.getMethod();String * 获取Http方法,有get,head,put,delete,post,options * request.getParameter("code");String * 获取提交参数,即网址?后面的内容,一一对应关系。即便是POST,这个也只能获取?后面的参数 * POST与GET的不同是可以send里面写内容,网址里面传递的参数还是一样的 * request.getParameterMap();Map<String,String[]> * 返回类型是String[]的原因是参数名称有可能相同,如果用getPara返回同名参数多个值的会把各个值结合起来 * PS:遍历Map的方法,Set<Entry<String, String[]>> set = map.entrySet();先获取EntrySet * 然后获取EntrySet的迭代器Iterator<Entry<String, String[]>> it = set.iterator(); * 接着使用迭代的getNext来获取各个元素Entry<String, String[]> entry = it.next(); * 最后使用Entry.getvalue获取字符串数组 * request.getParameterNames();Enumeration<String> * 获取参数名的枚举 * request.getParameterValues("code");String[] * 获取同名参数的多个值 * request.getPart("file");Part * 用于上传文件,一个Part为一个文件,mime类型为multipart/form-data * 程序中需要添加@MultipartConfig注解 * request.getParts();Collection<Part> * 获取一个Part的集合,用于上传多个文件 * request.getPathInfo();String * 返回在URL中指定的任意附加路径信息。不带参数,一般是相对于Servlet的路径 * pathinfo返回的字符串是经过Servlet服务器URL Decode过的。 * 输出:URL中Servlet路径之后、查询字符串之前的那部分。 * request.getPathTranslated();String * 映射到服务器实际路径之后的路径信息。 * request.getProtocol();String * 获取协议信息和版本号,即HTTP/1.1 * request.getQueryString();String * 这是字符串形式的附加到URL后面的查询字符串,数据仍旧是URL编码的。 * 在Servlet中很少需要用到未经解码的数据,一般使用getParameter访问各个参数。 * request.getReader();BufferedReader * 获取BufferedReader,和inputStream那一大堆获取的内容一样。。。 * request.getRealPath("/");String * 获取绝对路径,被废弃了,请使用request.getSession().getServletContext().getRealPath("/") * request.getRemoteAddr();String * 客户端的IP * request.getRemoteHost();String * 客户端的主机名 * request.getRemotePort();int * 客户端的端口号 * request.getRemoteUser();String * 客户端的用户名 * request.getRequestDispatcher("");RequestDispatcher * 请求转发,获取请求过来的地址,与该地址共享一个Request * request.getRequestedSessionId();String * 返回这个请求相应的session id * request.getRequestURI();String * 获得请求URL,不包含请求内容,不包含域名 * request.getRequestURL();StringBuffer * 获取URL,包含域名,不包含请求内容 * 未被Servlet服务器URL Decode过。 * request.getScheme();String * 返回协议名称,http * request.getServerName();String * 获得服务器名,本地IP * request.getServerPort();int * 获取服务器端口号 * request.getServletContext();ServletContext * 获取该Servlet的相关信息,getServletConfig().getServletContext().getServerInfo() * request.getServletPath();String * URL中调用Servlet的那一部分,不包含附加路径信息和查询字符串。 * request.getSession();HttpSession * 获取Session对话,用于与网页通信,很有用 * equest.getSession(boolean);HttpSession * request.getSession(true):若存在会话则返回该会话,否则新建一个会话。 * request.getSession(false):若存在会话则返回该会话,否则返回NULL * request.getUserPrincipal();Principal * 返回一个java.security.Principal 对象,该对象包含当前授权用户的名称 * 使用request.getUserPrincipal().getName()得到用户名 * 没有通过认证就没有返回值,是用户登录后才有值的,通过了JAAS认证,也就是登录 * * request.authenticate(HttpServletResponse response);boolean * 证明是真实的、可靠的或有效的;鉴定,使生效 * request.changeSessionId();String * Change the session id of the current session associated with this request and return the new session id. * request.isAsyncStarted();boolean * 异步传输是否开始 * request.isAsyncSupported();boolean * 是否支持异步传输 * isRequestedSessionIdFromCookie();boolean * SessionId是否是从cookies中获得的 * request.isRequestedSessionIdFromUrl();boolean * SessionId是否是从URL中获取的,已废弃 * request.isRequestedSessionIdFromURL();boolean * 同上,这个没废弃 * request.isRequestedSessionIdValid();boolean * 检查SessionId是否是有效的 * request.isSecure();boolean * 是否是安全的,即是否使用了安全协议,如https * request.isUserInRole("role");boolean * 判断用户是否是某个种类的角色,类型可以在web.xml中配置(tomcat-users.xml) * request.login("user", "password");void * 使用用户名和密码进行登录 * request.logout();void * 用户登出 * request.notify();request.notifyAll();void * 用于线程操作,详细见教材 * request.removeAttribute("at");void * 删除某个属性值,对应set * request.setAttribute("at", request);void * 设置某个属性值 * request.setCharacterEncoding("utf-8");void * 设置获取各个字符时使用的编码方式,应与网页的编码方式一样 * 仅仅只适用于设置post提交的request body的编码而不是设置get方法提交的queryString的编码。 * 该方法告诉应用服务器应该采用什么编码解析post传过来的内容。 * request.startAsync(request, response);void * 开始异步传输,可以不带参数 * request.upgrade();void * 开始更新? * request.wait(12); * 实现了线程的类都有该方法,用于等待 */
2、HttpServletResponse
/* * response对象 * response.addCookie(new Cookie("a","aa"));void * 增加cookie * response.addDateHeader("date", 23456789l);void * 在头部增加日期 * response.addHeader("asf", "sff");void * 增加头部信息 * response.addIntHeader("fsf", 12);void * 在头部增加数值类型 * response.encodeRedirectUrl("utf-8");废弃 * response.encodeRedirectURL("utf-8");String * 通过指定的编码对URL进项编码,并携带sessionid,跨应用 * response.encodeUrl("utf-8");废弃 * response.encodeURL("utf-8");String * 通过指定的编码对URL进项编码,并携带sessionid,本应用 * 假如有sessionId,且不是从cookie中获得的,就放到url尾部,否则直接返回原url。 * response.flushBuffer();vodi * 立即发送缓冲区字符给客户端即浏览器 * response.getBufferSize();int * 获取缓冲区大小 * response.getCharacterEncoding();String * 获取编码类型 * response.getContentType();String * 获取Content的MIME类型和编码 * response.getHeaderNames();Collection<String> * 获取所有Header的name列表 * response.getHeaders("aa");Collection<String> * 获取所有aa的头的值列表 * response.getLocale();Locale * 获取本地信息,如zhcn * response.getOutputStream();ServletOutputStream继承自OutputStream * 获取输出流,和inputStream对应,bufferedReader和printWriter对应 * response.getStatus();int * 获取response的状态码,有200,301,404,500 * response.getWriter();PrintWriter * 获取一个PrintWriter,用于向response返回数据,从而向客户端返回数据,比Stream使用方便 * response.isCommitted();boolean * 调用PrintWriter对象的close()方法关闭底层输出流,方法在关闭输出流之前会先把缓冲区内的数据提交到客户端。 * 因此在调用PrintWriter 对象的 close()方法之前,response.isCommitted()方法返回 false; * 而在调用PrintWriter对象的close()方法之后,response.isCommitted()方法返回true。 * response.reset();void * 清除buffer,设置页面不缓存,同时清除状态码和头,如果已经发送数据则跑出异常 * response.resetBuffer();void * 只清除buffer * response.sendError(1,"123");void * response.sendError(123); * response.sendError(1,"123"); * setStatus方法用来设置Servlet向客户端返回的状态码,它用来设置没有出错的状态。 * 如果Servlet运行出错,Servlet可以使用sendError方法设置状态码, * 如sendError(int sc)方法设置错误状态代码。sendError(int sc,String msg)方法除了设置状态码 * 还向客户发出一条错误信息。 * response.sendRedirect("xx.html"); * 返回一个重定向,并把新的request与response交给重定向的页面进行处理 * sendRedirect方法向客户发出临时重新导向的响应。它生成的响应状态码为302。 * 该响应给了客户一个新的URL分区。如果缓冲器已经被清空,这个方法会弹出一个IllegalStateException例外。 * response.setBufferSize(123); * 设置缓冲区大小 * response.setCharacterEncoding("utf-8"); * 设置字符编码 * response.setContentLength(123); * 设置返回内容的长度,在header中也有 * response.setContentLengthLong(1345l); * 长度非常长是使用 * response.setContentType("dfd"); * 设置ContentType,包括编码和类型信息 * 网页的Http头中ContentType("text/html; charset=GBK")的作用: * 告诉浏览器网页中数据是什么编码 * 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。 * 这里需要注意的是:这里所说的ContentType是指http头的ContentType,而不是在网页中meta中的ContentType。 * response.setDateHeader("asd", 123l); * 修改日期头 * response.setHeader("sfds", "sdfsdf"); * 修改头 * response.setIntHeader("sf", 3123); * 设置数值头 * response.setLocale(locale ); * 设置本地环境 * response.setStatus(1); * 设置Http状态码,为出错的情况用 * response.setStatus(12, "dasd"); * 设置状态码并带一条消息 * * * */
3、用于测试的代码
AsyncContext async = request.getAsyncContext(); String attribute = (String) request.getAttribute("code"); Enumeration<String> enumer = request.getAttributeNames(); String authtype = request.getAuthType(); String character = request.getCharacterEncoding(); int len = request.getContentLength(); long lenl = request.getContentLengthLong(); String contenttype = request.getContentType(); String contextpath = request.getContextPath(); Cookie[] cook = request.getCookies(); long dataHeader = request.getDateHeader(""); DispatcherType dispatcher = request.getDispatcherType(); String header = request.getHeader("headname"); Enumeration<String> headernames = request.getHeaderNames(); Enumeration<String> headersname = request.getHeaders("headersname"); ServletInputStream ins = request.getInputStream(); int i = request.getIntHeader("head"); String add = request.getLocalAddr(); Locale locale = request.getLocale(); Enumeration<Locale> locales = request.getLocales(); String localname = request.getLocalName(); int port = request.getLocalPort(); String method = request.getMethod(); String codep = request.getParameter("code"); Map<String,String[]> map = request.getParameterMap(); Enumeration<String> Pnames = request.getParameterNames(); String[] values = request.getParameterValues("code"); Part pa = request.getPart("file"); Collection<Part> pas = request.getParts(); String pathin = request.getPathInfo(); String trans = request.getPathTranslated(); String protoc = request.getProtocol(); String query = request.getQueryString(); BufferedReader br = request.getReader(); String rp = request.getRealPath("/"); String ra = request.getRemoteAddr(); String rh = request.getRemoteHost(); int rport = request.getRemotePort(); String ru = request.getRemoteUser(); RequestDispatcher rd = request.getRequestDispatcher(""); String rsi = request.getRequestedSessionId(); String uri = request.getRequestURI(); String scheme = request.getScheme(); String servern = request.getServerName(); int sport = request.getServerPort(); ServletContext scon = request.getServletContext(); String spath = request.getServletPath(); HttpSession session1 = request.getSession(); HttpSession session2 = request.getSession(true); Principal prc = request.getUserPrincipal(); boolean authe = request.authenticate(response);//证明是真实的、可靠的或有效的;鉴定,使生效 String cs = request.changeSessionId(); boolean iss = request.isAsyncStarted(); boolean isss = request.isAsyncSupported(); boolean issr = request.isRequestedSessionIdFromCookie(); boolean irsi = request.isRequestedSessionIdFromUrl(); boolean irss = request.isRequestedSessionIdFromURL(); boolean isiv = request.isRequestedSessionIdValid(); boolean isivs = request.isSecure(); boolean isr = request.isUserInRole("role"); request.login("user", "password"); request.logout(); request.notify(); request.notifyAll(); request.removeAttribute("at"); request.setAttribute("at", request); request.setCharacterEncoding("utf-8"); request.startAsync(); request.startAsync(request, response); //request.upgrade(); response.addCookie(new Cookie("a","aa")); response.addDateHeader("date", 23456789l); response.addHeader("asf", "sff"); response.addIntHeader("fsf", 12); boolean ch = response.containsHeader("asf"); String eru = response.encodeRedirectUrl("utf-8"); String eru1 = response.encodeRedirectURL("utf-8"); String eu = response.encodeUrl("utf-8"); String eu1 = response.encodeURL("utf-8"); response.flushBuffer(); int bs = response.getBufferSize(); String ge = response.getCharacterEncoding(); String cont = response.getContentType(); String se = response.getHeader("aa"); Collection<String> ghn = response.getHeaderNames(); Collection<String> ghn1 = response.getHeaders("aa"); Locale sss = response.getLocale(); ServletOutputStream ost = response.getOutputStream(); int rs = response.getStatus(); PrintWriter writer1 = response.getWriter(); boolean isc = response.isCommitted(); response.reset(); response.resetBuffer(); response.sendError(1,"123"); response.sendError(123); response.sendRedirect("xx.html"); response.setBufferSize(123); response.setCharacterEncoding("utf-8"); response.setContentLength(123); response.setContentLengthLong(1345l); response.setContentType("dfd"); response.setDateHeader("asd", 123l); response.setHeader("sfds", "sdfsdf"); response.setIntHeader("sf", 3123); response.setLocale(locale ); response.setStatus(1); response.setStatus(12, "dasd");
上面的内容只是作为总结,并没有说明各个方法的作用以及取出来的对象的作用,比如说Session,是一个很有用的对象,要知道他的用法,请看后面的博文。
关于Http客户端,即浏览器发送请求及接受响应的各部分内容,请参考后面的博文。