1.1 HttpServletRequest对象
在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。HTTP请求消息分为请求行、请求头和请求消息体三部分。
1.1.1获取请求行信息的相关方法:
方法声明 | 功能描述 |
String getMethod() | 获取请求方式(get/post) |
String getContextPath() | 获取当前项目名 |
String getRemoteAddr() | 获取请求者的IP |
String getProtocol() | 获取请求协议和版本 |
String getRequestURI() | 获取请求行的资源名称 |
String getQueryString | 获取请求行的参数 (资源路径后面?后的所有内容) |
String getServletPath() | 获取Servlet的名称或所映射路径 |
String getRemoteHost() | 获取请求者完整主机名,无法解析则返回IP |
int getRemotePort() | 获取请求者网络连接的端口号 |
String getLocalAddr() | 获取web服务器接收当前请求者的IP |
String getLocalName() | 获取服务器接收当前请求者IP对应的主机名 |
int getLocalPort() | 获取web服务器接收当前请求者的端口号 |
String getServerName() | 获取当前请求指向的主机名, Host头字段对应的主机名 |
int getServerPort() | 获取当前请求所连接的服务器端口号, Host头字段对应的端口号 |
String getScheme() | 获取请求的协议名,例如http、https或ftp |
StringBuffer getRequestURL() | 获取客户端发出请求的完整URL,包括协议、服务器名、端口号、资源路径,不包括后面的参数 |
1.1.2获取请求消息头的相关方法
方法声明 | 功能描述 |
String getHeader(String name) | 获取指定头字段的值,如果没有头字段则返回null,如果有多个头字段则返回第一个 |
Enumeration getHeaders(String name) | 返回Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。一般一个头字段名出现一次。 |
Enumeration getHeaderNames() | 获取一个包含所有请求头字段的Enumeration集合对象 |
int getIntHeader(String name) | 获取指定名称的头字段,将其值转成int类型。不存在指定头字段返回 -1,不能转成int型将发生NumberFormatException异常 |
Long getDateHeader(String name) | 获取指定头字段的值,将其按GMT时间格式转成代表日期/时间的长整数,毫秒单位 |
常见的请求头:
user-agent:获取浏览器的内核信息
Referer:获取网页来源(若地址是直接在地址栏上敲的,返回null)
1.1.3操作请求体(获取post请求参数)(get没有请求体)
String getParameter(String name)
获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,返回null;如果指定名称的参数存在但没有设置值,返回空字符串;如果请求消息中包含多个该指定名称的参数,返回第一个出现的参数值。
String[] getParameterValues(String name)
HTTP请求消息中可以有多个相同名称的参数(通常由一个包含有多个同名的字段元素(复选框,下拉列表)的form表单生成),如果要获得HTTP请求消息的同一个参数名所对应的所有参数值,就使用此方法。
Map getParameterMap()
将请求消息中的所有参数名和值装入一个Map对象中返回。
Enumeration getParameterNames()
返回一个包含请求消息中所有参数名的Enumeration对象,在此基础上,可以对请求消息中的所有参数进行遍历处理。
1.1.4 post请求参数的乱码解决
解决方式一:通用方法(针对get请求和post请求)
new String(数据.getBytes(“iso8859-1”),”utf-8”);
解决方式二:(只针对post请求)
request.setCharacterEncoding(“utf-8”);
通过指定的编码方式编码
URLEncoder的encode(String s, String charset);
通过指定的编码方式解码
URLDecoder的decode(String s, String charset);
1.2 BeanUtils
BeanUtils是Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。
需要导入的jar包:
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
BeanUtils工具常用工具类有两个:BeanUtils、ConvertUtils。BeanUtils用于封装数据,ConvertUtils用于处理类型转换。
BeanUtils的常用方法:
populate(Object bean, Map<String, String[]> properties)
将Map数据封装到指定JavaBean中,一般用于将表单的所有数据封装到JavaBean中。
ConvertUtils的常用方法:
register(Converter converter, Class clazz)
注册类型转换器。
1.3通过Request对象传递数据
Request对象不仅可以获取一系列数据,还可以通过属性传递数据。
void setAttribute()方法
将一个对象与一个名称关联后存储到ServletRequest对象中。
如果ServletRequest对象中已经存在指定名称的属性,此方法会先删除原先的属性,再添加新的属性。如果传递给此方法的属性值为null,则删除指定名称的属性,效果等同于removeAttribute()方法。
String getAttribute()方法
用于从ServletRequest对象中返回指定名称的属性对象。
void removeAttribute()方法
用于从ServletRequest对象中删除指定名称的属性。
Enumeration getAttributeNames()方法
用于返回一个包含ServletRequest对象中的所有属性名的Enumeration对象,在此基础上可以对ServletRequest对象中的所有属性进行遍历处理。
注意:只有属于同一个请求中的数据才可以通过ServletRequest对象传递数据。
1.4请求转发
在Servlet中,如果当前Web资源不想处理请求时,可以通过forward()方法将当前请求传递给其它Web资源处理,这种方式称为请求转发。
请求转发和重定向的区别:
(1)重定向的地址栏会发生变化,请求转发的地址栏不发生变化。
(2)重定向两次请求两次响应,请求转发一次请求一次响应。
(3)重定向的路径需要加工程名,请求转发的路径不能加工程名。
(4)重定向可以跳转到任意网站,请求转发只能在服务器内部进行转发。
(5)重定向不能用request的方法,请求转发可以用request的方法。