响应对象和请求对象
void service(ServletRequest var1,ServletResponse var2)
在Servlet的service()方法上,有两个形参,请求对象和响应对象
ServletRequest请求对象,定义将客户端请求信息提供给某个servlet的对象,servlet容器创建ServletRequest对象,并将该对象作为参数传递给该servlet的service方法
ServletResponse响应对象,定义辅助servlet将响应发送到客户端的对象,servlet容器创建ServletResponse对象,并将它作为参数传递给servlet的service方法
request和response都是由服务器创建 管理和销毁,作为形参传递给 service()方法
请求对象,用来封装请求的数据,我们可以从请求对象,获取请求数据
响应对象,我们要返回给浏览器的数据,可以封装在响应对象
一次请求和响应结束后 服务器就会销毁请求对象和响应对象,下一次在请求,服务器又会创建一对新的请求对象和响应对象
继承体系结构:
ServletRequest(接口)<--继承<--HttpServletRequest(接口)<--实现 org.apache.catalina.connector.RequestFacade@6049a827
ServletResponse(接口)<--继承--HttpServletResponse(接口)<--实现org.apache.catalina.connector.ResponseFacade@3bec9d4
响应对象–响应行(重定向)
设置响应行:
HTTP/1.1 200 ok
setStatus(int code);设置响应状态码
重定向可以进行资源(图片 servlet 页面 文件)的跳转
跳转页面
重定向 设置响应状态码
response.setStatus(302);
在设置响应头
response.setHeader("location","https://www.163.com");
response.setHeader("location","/项目路径/页面");
---------------------
以上两步可以简化成一个方法
response.sendRedirect("https://www.163.com");
重定向的特点:
1.两次请求 两次响应
2.地址栏会发生变化
3.重定向 就可以跳转外部资源 也可以跳转自己服务器资源
但是不能访问WEB-INF下的资源
响应对象–响应头(响应中文乱码问题)
设置响应头: 例如:content-type:text/html;charset=utf-8
设置响应头的名称和值
setHeader(String headName,String headValue);
设置日期头
setDateHeader(String name,long date);
设置数字头
setIntHeader(String name,int count);
response 响应对象
响应一些数据给浏览器
响应中文时,为什么会乱码???
解码表不一致
web项目来说就是服务器和浏览器使用的码表不一致
Tomcat服务器默认使用的编码是ISO-8859-1
浏览器在解码时,浏览器没有ISO-8859-1码表
解决响应中文时乱码问题???
在服务端来设置编码
response.setCharacterEncoding("UTF-8");
还得告诉浏览器,服务端用的是utf-8编码,浏览器切换成utf-8来解码,通过响应头来告诉浏览器用utf-8解码
response.setHeader("content-type","text/html;charset=utf-8");
-----------------------
以上两行代码 综合成一行代码
response.setContentType("text/html;charset=utf-8");
响应对象–响应体(响应数据)
设置响应体:
响应体响应的是数据,得通过流的方式,获取输出流写出数据
发送字符数据的对象
PrintWriter getWriter();
发送字节数据的对象
ServletOutputStream getOutputStream();
响应文本数据
其实就是响应HTML代码
也就是响应了一个HTML页面
PrintWriter writer = response.getWriter();
writer.write("<h1 style='color:red'>");
writer.write("Welcome 欢迎光临我的首页");
writer.write("</h1>");
响应字节数据
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/0.jpg");
FileInputStream in = new FileInputStream(realPath);
ServletOutputStream out = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int readLen = 0;
while ((readLen=in.read(bytes))!=-1){
out.write(bytes,0,readLen);
out.flush();
}
in.close();
out.close();
请求对象–请求参数
请求行
request请求对象
request.getMethod();
request.getContextPath();
request.getServletPath()
request.getRequestURI();
request.getRequestURL();
request.getRemoteAddr();
request.getProtocol();
request.getQueryString();
BufferedReader reader = request.getReader();
reader.readLine();
请求头
request.getHeader("请求头名");
request.getDateHeader(name);
request.getIntHeader(name);
请求体
专门用于封装post请求的请求参数
获取字符数据: getReader()
获取字节数据: getInputStream()
获取请求参数
request.getParameter(参数名);
request.getParameterValues("hobby");
request.getParameterMap();
request.getParameterNames();
请求对象–请求中文乱码问题
Tomcat8.0以上
get请求 中文不会乱码
post请求 中文会乱码
post请求特有的方式 处理中文乱码
request.setCharacterEncoding("utf-8");
请求对象–内部转发
请求转发 内部转发
内部转发的特点:
1.一次请求一次响应
2.地址栏不发生变化
3.只能访问内部站点资源
不需要写项目路径 相对路径
request.getRequestDisPatcher("/demo").forward(request,response);
重定向与内部转发的区别
重定向
response.sendRedirect("https://www.163.com");
内部转发
request.getRequestDisPatcher("/demo").forward(request,response)
共同点
都能进行资源的跳转问题
不同点
重定向是两次请求,两次响应
内部转发是一次请求,一次响应
重定向既能跳转自己站点内的资源,也可以跳转外部资源
内部转发只能跳转自己站点内的资源,不能跳转外部资源,只能跳转WEB-INF下的资源/WEB-INF/home.jsp
重定向的地址栏会发生变化
内部转发的地址栏不发生变化
重定向的内部资源需要写项目路径,外部资源需要写一个完整的URL
内部转发不需要写项目路径
什么时候使用重定向?什么时候使用转发?
1.如果需要在请求的多个资源中共享数据,则使用转发
2.如一次性的数据存入请求域中,不要使用重定向来跳转资源,使用请求转发
3.如果说你使用了重定向来跳转资源,还想要在多个资源间共享数据,那么这个数据存在请求域中,就共享不到
请求对象–域对象
request请求对象,也是一个域对象
代表的范围是一次请求和响应间数据的共享
request.setAttribute("键",值); 存
request.getAttribute("键"); 取
request.removeAttritbute("键"); 删