request对象:
在Servlet中用来处理客户端请求需要用doGet()或doPost()方法的request。 客户端发送请求给服务端,请求的内容(数据)全在request对象中。
Get请求:
- get提交的数据会放在URL之后,以 ? 分割URL和传输数据,参数之间以 & 相连。
- get方式明文传递,数据量小(URL最大长度为2KB),不安全。
- 效率高,浏览器默认请求方式为Get请求。
- 对应的Servlet方法是 doGet。
Post请求:
- Post方法是把提交的数据放在HTTP包的Body中。
- 密文传递数据,数据量大,安全。
- 效率相对没有Get高。
- 对应的Servlet方法是 doPost。
request主要方法:
String getParameter(String name) | 根据表单组件名称获取提交数据。 |
void setCharacterEncoding(String charset) | 指定每个请求的编码。 |
范例:
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 |
|
response对象:
response主要方法:
方法名称 | 作用 |
---|---|
setHeader(name,value) | 设置响应信息头 |
setContentType(String) | 设置响应文件类型,响应式的编码格式 |
setCharacterEncoding(String) | 设置服务器端响应内容编码格式 |
getWriter() | 获取字符输出流 |
如果输出内容包含中文,则出现乱码,因为服务器端默认采用ISO8859-1编码响应内容。
解决输出中文乱码:
方法一(不推荐):
- 设置服务器端响应的编码格式。
- 设置客户端相应内容的头内容的文件类型和编码格式。
response.setCharacterEncoding("utf-8"); //设置服务端响应编码格式为utf-8。
response.setHeader("Content-type" , "text/html;charset=UTF-8"); //设置响应的头信息
方法二(推荐):
同时设置服务端的编码格式和客户端响应的文件类型和响应时的编码格式。(注:要在获取字符输出流之前进行设置)
response.setContentType("text/html;charset=utf-8);
请求转发:
转发是作用在服务器端,将请求(客户端发送的)发送给服务器上的其他资源,以共同完成一次请求的处理。
页面跳转:
request.getRequestDispatcher("/目标URL-pattern").forward(request, response);
- forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据。
传递数据:
- request作用域:使用键值对形式存储数据,作用范围是一次请求有效(一次请求可以多次转发 A转发给B、B再转发给C...);可传递任何类型数据。
- 存数据:request.setAttribute(key, value); key为String类型,value为Object类型。
- 取数据:request.getAttribute(key);
转发特点:
- 转发是服务器行为。
- 转发是浏览器只做了一次访问请求。
- 转发浏览器地址栏不变。
- 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递。
- 转发只能将请求转发给同一个Web应用中的组件。(同一个Web项目下进行转发)
重定向:
重定向作用在客户端,客户端将请求发送给服务器端后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。
页面跳转:
response.sendRedirect("/目标URI");
- URI:统一资源标识符,用来表示服务器中定位一个资源,资源在web项目中的路径(/project/source)。
- sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求,属于两次请求。
数据传递:
- response没有作用域,两次request请求中的数据无法共享。
- 传递数据:通过URI的拼接进行数据传递response.sendRedirect("/WebProject/B?username=tom");
- /WebProject/B:URI路径拼接
- username=tom:数据传递
- 获取数据:request.getParameter("username");
重定向特点:
- 重定向是客户端行为。
- 重定向是浏览器做了至少两次的访问请求。
- 重定向浏览器地址发生改变。
- 重定向两次跳转之间数据会丢失(request作用域中数据)。
- 重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序资源、其他站点资源。
总结:当两个servlet需要传递数据时,选择forward转发,不建议用sendRedirect进行传递。