服务器处理请求流程:
服务器每次收到请求时,都会为这个请求开辟一个新的线程;服务器会把客户端的请求数据都封装到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,即包含项目名称。