基本概念:
在调用service之前,服务器(tomcat)会将用户的请求封装到request对象里面,同时也会创建一个response对象,通过service方法传递到我们的Servlet中。我们做一定的处理,将处理的结果,封装到response中,再将response对象返回给服务器,服务器响应到客户端。
response:
1.设置响应体
(1) 向客户端响应文本
PrintWriter response.getWriter();
writer.write("文本") --- 向response的缓冲区中去写
注:向客户端回写中文数据时 乱码
乱码的原因:response缓冲区的编码方式是iso8859-1(西欧编码方式)
解决方式:response.setContentType("text/html;charset=UTF-8");
上面的代码完成两个设置:(1) 设置response缓冲区的编码---response.setCharacterEncoding("UTF-8");
(2) 设置浏览器的解码方式----response.setHeader("Content-Type", "text/html;charset=UTF-8")
(2) 向客户端响应字节
ServletOutputStream out = response.getOutputStream();
2.response的一些细节:
(1) response.getOutputStream()获得的流不用手动关闭 --- web容器帮我们关闭
(2) 重定向:302+Location
response有一个重定向的方法:sendRedirect(url)
(3) response有两个获取流的方法 getWriter和getOutputStream 不能一起使用
(4) response缓存区有大小 默认是8k 通过setBufferSize设置大小 只能向大设置
(5) resposse缓冲区的内容被真正的刷出 不能再进行转发和重定向
什么情况下 缓冲区的内容被刷出?
response.flushBuffer();
缓冲区的内容写满了
转发或重定向也会刷出缓冲区的内容
(6) 当进行转发或重定向时 之前写到response缓冲区的内容会被清空 但是写入的头仍然有效
servlet01.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class servlet01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应头
response.setHeader("vw", "v6");
// 追加响应头
response.addHeader("mu", "77");
// 字符流响应正文,浏览器显示信息
/*
* PrintWriter writer = response.getWriter(); writer.print("thanks");
*/
// 字节流响应正文(字节流和字符流不能同时使用)
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("hello".getBytes());
}
}
request:
get提交方式有哪些?
直接输入网址 、超链接<a href=""> 、<from method="get"> 、重定向 、定时跳转 、 js的location.href
post提交方式哪些?
<form method="post">
URI与URL?
URI:全球资源标识符 可以是绝对的,也可以是相对的。相对的都是uri /day10_205/request1 C:\\
URL: 全球资源定位符 URL是一种具体的URI http://
1、获取请求行的数据
获得请求方式:getMethod();
获得访问资源:getRequestURI/getRequestURL
获取访问的资源后面参数的字符串:getRequestQuery()
获取客户机的ip:getRemoteAddr()
获取web应用的名称:getContextPath()
2、获取请求头的信息
getHeader(头的名称)根据指定头名称获取值
getHeaderNames()获取所有的请求头的名字
getHeaders()获取指定的头的所有值
getIntHeader()
getDateHeader()
Referer:该资源的访问来源 ----- 防盗链
3、获取请求体的数据
(1) request.getParameter(name的属性值);
(2)request.getParameterNames(); 可以得到所有的要提交标签的name的属性值。
(3)request.getParameterValues("hobby"); 多个属性值 。例如checkbox 。
注:
request乱码问题
原因:
我们提交信息 =====》浏览器会按照utf-8的形式给我们传递的信息 进行编码======》
服务器按照iso-8859-1的的形式给我们解码。
解决:
乱码中文 ==== 》按照iso-8859-1编码===》 按照utf-8的格式进行解码===》我们提交信息
post请求的乱码解决方案
request.setCharacterEncoding("utf-8");
get,post请求通用解决方式
String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");
4. request对象是一个域对象
可见范围:一次请求链中
setAttribute(String name,Object value)
getAttrbute(String name)
removeAttrbute(String name)
5. 请求转发
request.getRequestDispatcher().forward(request,response);
转发和重定向的区别?
(1) 转发地址不变 客户端一次请求 重定向地址变化 两次请求
(2) 转发是web应用内部的行为 重定向是客户端重新访问的
(3) 转发的性能高一些
6.请求包含:
request.getRequestDispatcher().include(request,response);
RequestServlet01.java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestServlet01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决request请求乱码问题(post提交数据)
request.setCharacterEncoding("utf-8");
/*乱码原因:
* 我们提交信息 =====》浏览器会按照utf-8的形式给我们传递的信息 进行编码======》
服务器按照iso-8859-1的的形式给我们解码。
* get请求方式解决乱码方法
String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");
*/
//得到用户的请求方式
String method = request.getMethod();
//得到协议
String protocol = request.getProtocol();
//得到资源路径
String requestURI = request.getRequestURI();
System.out.println(method+"--"+protocol+"--"+requestURI);
System.out.println("------------------------------------------------------");
/*
* POST--HTTP/1.1--/Response_Request_test/RequestServlet01
*/
//协议的请求资源路径
StringBuffer requestURL = request.getRequestURL();
//得到用户的地址
String remoteAddr = request.getRemoteAddr();
//得到资源名或者项目名
String contextPath = request.getContextPath();
System.out.println(requestURL+"--"+remoteAddr+"--"+contextPath);
/*
* http://localhost:8080/Response_Request_test/RequestServlet01
* --0:0:0:0:0:0:0:1
* --/Response_Request_test
*/
System.out.println("--------------------------------------");
//根据请求头中相应的name获得相应的请求值
String header = request.getHeader("Host");
System.out.println(header);
/*
* localhost:8080
*/
//得到所有请求头的name值
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String nextElement = (String)headerNames.nextElement();
System.out.println(nextElement);
}
/*
accept
referer
accept-language
user-agent
content-type
accept-encoding
host
content-length
connection
cache-control
*/
//根据用户表单的name获得相应的值
String username = request.getParameter("username");
System.out.println("username:"+username);
/*username:123*/
//得到我们提交表单的标签name的属性值
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String key = names.nextElement();
System.out.println(key);
}
/*
username
userpass
*/
//将用户的请求的信息放到map里面
Map<String,String[]> map = request.getParameterMap();
String usrname = map.get("username")[0];
System.out.println(usrname);
/* 123*/
//得到一个属性值对应多个的值(checkbox)
String[] values = request.getParameterValues("hobby");
for(String value:values){
System.out.println(value);
}
/*
soccer
basketball
table tennis
*/
}
}
来源:oschina
链接:https://my.oschina.net/u/1393804/blog/636463