1 HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
1.1 获取请求行信息
getMethod() | 获取请求方式
getRequestURL() | 获取完整路径
getRequestURI() | 获取除了域名或者IP部分的路径
getServletPath() | 获取Servlet路径。
getContextPath() | 获取虚拟目录
getQueryString() |获取参数,键=值,即?号后面的部分。 |name=%E5%BC%A0%E4%B8%89&age=18
getProtocol() | 获取协议及版本。
getRemoteAddr() | 返回IP地址。
public class Main extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//获取请求方式
System.out.println(req.getMethod());
//获取完整路径
System.out.println(req.getRequestURL());
//获取除了域名或者IP部分的路径(接口路径+根路径)
System.out.println(req.getRequestURI());
//获取虚拟目录(根路径)
System.out.println(req.getContextPath());
//获取参数
System.out.println(req.getQueryString());
//返回IP地址
System.out.println(req.getRemoteAddr());
}
获取参数的方法
//获取参数的方法
String name1 = req.getParameter("name");
System.out.println(name1);
String age1 = req.getParameter("age");
System.out.println(age1);
1.2 获取请求头信息
req.getHeader()
//获取请求头信息
String cookie = req.getHeader("Cookie");
System.out.println(cookie);
String accept = req.getHeader("Accept");
System.out.println(accept);
迭代器
Enumeration<String> headerNames = req.getHeaderNames();
//判断迭代器是否还有元素
while(headerNames.hasMoreElements()){
//拿到元素并且下标往后移动一位
String name = headerNames.nextElement();
String value = req.getHeader("name");
System.out.println(name + "," + value);
}
1.3 获取请求体信息
请求体主要包含前端发送给后端的数据(参数)。
对于GET请求, 一般不需要请求体, 因为GET参数直接体现在URL上。
对于POST请求, 需要请求体, 请求体里保存POST参数。
方法名:
BufferedReader getReader() | 获取字符输入流,只能操作字符数据。
//字符输入流
BufferedReader reader = req.getReader();
//传参类型:x-www-from-urienxoded 可以把请求体里的参数拼接在一起,形成一个字符串
System.out.println(reader.readLine());
//传参类型 from-data reader 不是很适用,因为他是用来获取字符流的
ServletInputStream getInputStream() | 获取字节输入流,可以操作所有类型的数据(文件上传)。
ServletInputStream inputStream = req.getInputStream();
byte[] bytes = new byte[1024];
int num = -1;
String str = "";
//可以使用OutPutStream把字节数组保存到本地上,形成上传文件的接口
while ((num = inputStream.read(bytes)) != -1){
str += new String(bytes,0,num);
}
System.out.println(str);
String getParameter(String name) | 根据参数名获取参数值,get、post通用。
1.4 请求转发
一种服务器内部资源跳转的方法,servlet之间的跳转。(可以理解为函数之间的互相调用)
//设置目标+转发
req.getRequestDispatcher("/s05").forward(req,resp);
1.4.1 使用步骤
通过request请求对象获取请求转发器对象。
通过RequestDispatcher对象进行转发。
request.getRequestDispatcher("转发路径").forward(request, response)
1.4.2 特点
浏览器地址路径不发生变化。
转发是一次请求。
只能转发到服务器内部资源。
1.4.3 共享数据
请求转发中涉及到的多个servlet,可以共享数据。
setAttribute(String name, Object object) // 存储数据
getAttribute(String name) // 通过键获取数据
removeAttribute(String name) // 通过键移除数据
2.HttpServletResponse
当客户端通过HTTP协议访问服务器时,如果服务器要给客户端一些相响应的信息,就可以使用HttpServletResponse提供的方法进行设置。
2.1方法
1. void setStatus(int sc) //设置响应状态码
2. void setHeader(String name,String value) // 设置一个带有给定的名称和值的Header
resp.setHeader("nanme","zhangsan");//张三不能是中文
resp.setHeader("age","18");
3. void setContentType(String type) // 设置被发送到客户端的响应的内容类型
4. PrintWriter getWriter() // 用于往 `body` 中写入文本格式数据响应状态码:服务器告诉客户端浏览器本次请求响应的一个状态,都是三位数。
响应状态码:
服务器告诉客户端浏览器本次请求响应的一个状态,都是三位数。
1. 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后,发送1xx状态码
2. 2xx:成功,200
3. 3xx:重定向。302重定向,304访问缓存
4. 4xx:客户端错误。404找不到后端地址,401缺少权限,403权限认证失败
5. 5xx:服务器端错误。500服务器内部错误
2.2 重定向
特点:
1. 地址栏发生变化。
2. 重定向是两次请求,不能使用request对象来共享数据。
3. 重定向可以访问其他站点的资源。
resp.sendRedirect("http://www.baidu.com");
3. ServletContext
ServletContext官方叫Servlet上下文。服务器会为每一个工程创建一个ServletContext对象。这个对象全局唯一,工程内所有的servlet都共享这个对象。所以叫全局应用程序共享对象。
3.1 获取方式
1. req.getServletContext()
ServletContext ctx = req.getServletContext();
2. this.getServletContext()
3.2 核心方法
setAttribute(name, value) // 添加数据
getArrtibute(name) // 获取数据
removeAttribute(name) // 删除数据
3.3 获取MIME类型
String filename = "a.jpg";
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);