一、概念
request对象和response对象是通过Servlet容器(如Tomcat)自动创建并传递给Servlet的。
Servlet容器负责接收客户端的请求,并将请求信息封装到request对象中,然后将request对象传
递给相应的Servlet进行处理。类似地,Servlet容器会创建一个response对象,并将其传递给
Servlet,用于生成响应并发送给客户端。
总的来说,request对象是来获取请求消息,response对象是来设置响应消息
二、Request
在Servlet的service()方法被调用时,Servlet容器会创建一个包含请求信息的HttpServletRequest对象,并将其作为参数传递给Servlet的service()方法。类似地,Servlet容器还会创建一个HttpServletResponse对象,并将其作为参数传递给Servlet的service()方法。
1、Request功能
(1)获取请求行数据
请求行的数据有:请求方式 请求url 请求协议/协议版本号
①获取请求方式:getMethod()
②获取虚拟目录:getContextPath()
③获取servlet路径:getServletPath()
④获取get方式请求参数:getQueryString()
⑤获取请求URI:统一资源定位符:getRequestURI()
统一资源标识符:getRequestURL()
⑥获取协议及版本: getProtocol()
⑦获取客户机的IP地址:getRemoteAddr()
代码示例:
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1获取请求方式String method=request.getMethod();System.out.println(method);//2获取虚拟目录String contextPath = request.getContextPath();System.out.println(contextPath);//3获取servlet路径String servletPath = request.getServletPath();System.out.println(servletPath);//4获取请求参数String queryString = request.getQueryString();System.out.println(queryString);//5获取请求URIString requestURI = request.getRequestURI();System.out.println(requestURI);StringBuffer requestURL = request.getRequestURL();System.out.println(requestURL);//6获取请求协议及版本号String protocol = request.getProtocol();System.out.println(protocol);//7获取客户机的ip地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
(2)获取请求头数据
方法:getHeader(String name):通过请求头的名称获取请求头的值
getHeaderNames():获取所有的请求头名称
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据//获取所以请求头数据Enumeration<String> headerNames = request.getHeaderNames();//遍历while(headerNames.hasMoreElements()){String s = headerNames.nextElement();//根据名称获取请求头的值String header = request.getHeader(s);System.out.println(s+"......"+header);}//演示获取请求头数据:user-AgentString header = request.getHeader("user-agent");//判断agent的浏览器版本System.out.println(header);}
(3)获取请求体数据
只有post请求有请求体
步骤:①获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
② 再从流对象中拿数据
@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求消息体--请求参数//1、获取字符流BufferedReader reader = request.getReader();//2、读取数据String line=null;while((line=reader.readLine())!=null){System.out.println(line);}System.out.println("-------------------------------------");}
2、其他功能
(1)获取请求参数(不区分post和get方法)
①根据参数名称获取参数值:getParameter(String name)
②根据参数名称获取参数值数组:getParameterValues(String name)
③获取所有请求的参数名称:getParameterNames()
④获取所有参数的map集合:getParameterMap()
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决中文乱码问题request.setCharacterEncoding("utf-8");//根据请求参数的名称获取请求参数值String username = request.getParameter("username");System.out.println(username);System.out.println("post");System.out.println();//根据参数名称获取请求参数数组String[] parameterValues = request.getParameterValues("hobby");for (String hobby:parameterValues) {System.out.println(hobby);}System.out.println();//根据所以请求参数名称Enumeration<String> parameterNames = request.getParameterNames();while(parameterNames.hasMoreElements()){String s = parameterNames.nextElement();System.out.print(s);String parameter = request.getParameter(s);System.out.println(parameter);}System.out.println();//获取所以参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();Set<String> strings = parameterMap.keySet();for(String name:strings){String[] strings1 = parameterMap.get(name);System.out.print(name);for(String value:strings1){System.out.println(value);}}}
}
(2)请求转发
在服务器内部的资源跳转方式
步骤:
通过request对象获取请求转发器对象:getRequestDispatcher(String path)。
使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 。
特点:
浏览器地址栏不发生改变
只能转发到当前服务器内部资源中
转发是一次请求
(3)共享数据
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
①setAttribute(String name,Object obj):存储数据
②getAttitude(String name):通过键获取值
③ void removeAttribute(String name):通过键移除键值对
注意:这个放于forward方法的上面,不然响应太快会导致无法获取信息!
代码示例:
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo5被访问了");request.setAttribute("ttt","hhhh");//转发到demo6request.getRequestDispatcher("/requestDemo6").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Object ttt = request.getAttribute("ttt");System.out.println(ttt);System.out.println("demo6被访问了");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
(4)获取ServletContext对象 :getServletContext()
三、Response
response:设置响应消息
1、设置响应行方法
(1)设置响应行状态码方法:setStatus();
(2)设置响应头:setHeader(String name,String value)
(3)设置响应体:
使用步骤:
①获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
② 使用输出流,将数据输出到客户端浏览器
2、重定向: 一种资源跳转的方式
(1)方法:sendRedirect()
(2) 重定向的特点:redirect
① 地址栏发生变化
② 重定向可以访问其他站点(服务器)的资源
③ 重定向是两次请求。不能使用request对象来共享数据
@WebServlet( "/responseDemo1")
public class responseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo1");//设置状态码为302response.setStatus(302);/* //设置响应头locationresponse.setHeader("location","/servlet/responseDemo2");*///获取当前应用程序的上下文路径String contextPath = request.getContextPath();//简单的重定向方法response.sendRedirect(contextPath+"/responseDemo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}@WebServlet("/responseDemo2")
public class responseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(3)服务器输出字符数据到浏览器
步骤:
获取字符输出流
输出数据
@WebServlet("/responseDemo3")
public class responseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*//获取流对象之前,设置流的默认编码:ISO-8859-1设置为:浏览器默认编码response.setCharacterEncoding("utf-8");//告诉浏览器服务器发送的消息体数据的编码,建议浏览器使用改编码解码response.setHeader("content-type","text/html;charset=utf-8");*/response.setContentType("text/html;charset=utf-8");//解决乱码问题//获取字符输出流PrintWriter writer = response.getWriter();//输出数据writer.write("牛牛牛");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(4)服务器输出字节数据到浏览器
步骤:
获取字节输出流
输出数据
@WebServlet("/responseDemo4")
public class responseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取字节输出流ServletOutputStream outputStream = response.getOutputStream();//输出数据outputStream.write("你好".getBytes());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
三、ServletContext对象
1、概念
ServletContext 实例代表了整个 Web 应用程序的上下文环境,可以在整个应用程序中访问和共享,可以和服务器来通信。
2、获取
方式一:
通过request对象获取:request.getServletContext();
方式二:
通过HttpServlet获取:this.getServletContext();
3、功能
(1)获取MIME类
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 text/html image/jpeg
获取方法:getMimeType(String file)
代码示例:
@WebServlet("/ContextDemo1")
public class ContextDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取Context对象的方式// ServletContext servletContext = request.getServletContext();ServletContext servletContext1 = this.getServletContext();//定义文件名称String filename="a.jpg";//获取MIME类型String mimeType = servletContext1.getMimeType(filename);System.out.println(mimeType );}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(2)域对象:共享数据
① setAttribute(String name,Object value)
② getAttribute(String name)
③removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext1 = this.getServletContext();servletContext1.setAttribute("n","hello");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext1 = this.getServletContext();Object n = servletContext1.getAttribute("n");System.out.println(n);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(3) 获取文件的真实(服务器)路径
方法:String getRealPath(String path)