.Net转Java自学之路—基础巩固篇二十五(Response、Request)

时间:2022-12-13 19:57:29

服务器处理请求流程:

  服务器每次收到请求时,都会为这个请求开辟一个新的线程;服务器会把客户端的请求数据都封装到request对象中,request就是请求数据的载体;服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应。

Response:

  其类型为:HttpServletResponse

  常见状态吗:200 成功;302 重定向;404 客户端错误,资源不存在;500 服务器端错误

sendError(int sc);//发送错误状态码
sendError(int sc,String msg);//发送错误状态码
setStatus(int sc);//发送成功状态码,可以用来发送302

  响应头:Content-Type、Refresh、Location等

setHeader(String,String);//单值响应头
addHeader(String,String);//多值响应头
setIntHeader(String,int);//单值的int类型的响应头
addIntHeader(String,int);//多值的int类型的响应头
setDateHeader(String,long);//单值的毫秒类型的响应头
addDateHeader(String,long);//多值的毫秒类型的响应头

/******************************************/

//例:
response.setHeader("aaa","AAA");
response.setIntHeader("Content-Length",123);
response.setDateHeader("expires",1000*60*60);//过期时间

//禁用浏览器缓存
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");
response.setHeader("expires",-1);

  响应体:通常是http、也可以是图片

    response的俩个流:ServletOutStream、PrintWriter。俩个流不能同时使用。

    ServletOutStream:向客户端发送字节数据。response.getOutputStream();

    PrintWriter:向客户端发送字符数据,需要设置编码。response.getWriter();

  重定向:

    sendRedirect(String);

Request:

  其类型为:HttpServletRequest 。封装了所有的请求数据。

  获取常用信息:

    客户端IP地址:request.getRemoteAddr();

    请求方式:request.getMethod();

  获取请求头:

String getHeader(String);//单值头
int getIntHeader(String);//单值int类型的请求头
long getDateHeader(String);//单值毫秒值类型的请求头
Enumeration<String> getHeaders(String);//多值请求头

  获取请求URL:

getScheme();//获取协议
getServerName();//服务器名
getServerPort();//服务器端口号
getContextPath();//获取项目名
getServletPath();//获取Servlet路径
getQueryString();//获取参数部分
getRequestURI();//获取请求URI,项目名 + Servlet路径
getRequestURL();//获取请求URL,不包含参数的整个请求路径

  获取请求参数:

String getParameter(String);//获取指定名称的请求参数值,适用于单值请求参数。
String[] getParameterValues(String);//获取指定名称的请求参数值,适用于多值请求参数
Enumeration<String> getParameterNames();//获取所有请求参数名称
Map<String,String[]> getParameterMap();//获取所有请求参数,key 参数名称,value 参数值

  请求转发和请求包含:是一个请求

RequestDispatcher rd=request.getRequestDispatcher("被转发/被包含的Servlet的路径");
rd.forward(request,response);//请求转发
rd.include(request,response);//请求包含

    有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳转到另一个Servlet。所以一个请求跨多个Servlet需要使用转发和包含。

    请求转发:有下一个Servlet完成响应体,当前Servlet可以设置响应头(留头不留体)

    请求包含:有俩个Servlet共同来完成响应体(都留)

    无论是请求转发还是请求包含,都在一个请求范围内,使用同一个request和response

  request域:

    Servlet中有三大域对象:request、session、application

    三大域对象都有如下三个方法:

setAttribute(str,obj);//设置属性
Object getAttribute(str);//获取属性
removeAttribute(str);//移除

    属性:是Servlet在转发或包含时用来传递值

    同一请求范围内使用request.setAttribute()、request.getAttribute()来传值。前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

  请求转发和重定向的区别:

    1、请求转发时一个请求一个响应;而重定向时俩次请求俩次响应。

    2、请求转发地址栏不变化;而重定向会显示后一个请求的地址。

    3、请求转发只能转发到本项目其他Servlet,而重定向不止能重定向到项目的其他Servlet,还能重定向到其他项目。

    4、请求转发时服务端行为,只需给出转发的Servlet路径;而重定向需要给出requestURI,即包含项目名称。