HttpSevletResponse
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口。
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体
response:
响应行:
//1.响应行 - 状态码200 404 304 302 500
response.setStatus(304);
302 -> 重定向: 当前Servlet做完了,继续下一次任务,使用重定向
//response.setStatus(302);
// location:url地址
//response.setHeader("location", "/web02/Servlet1Demo");
// 重定向最终代码,路径:绝对路径,从应用名开始
response.sendRedirect("/web02/Servlet1Demo");
response.getWriter().write("hello Bonnie...");
响应头:
response.addHeader(String name,String value);
response.setHeader(String name,String value);
//add与set的区别:add是新增一个值,不论之前有没有
set是设置,如果之前有数据了,就覆盖原来的数据
响应体:
response.sendRediect("/web02/ServletDemo");// /应用名/资源名
网页打印:
response.getWriter().write("hello Bonnie...");
注意:1.字节流和字符流不能同时使用
2.通过response打开的流,不能手动关闭,tomcat会负责关闭
3.在创建字符流之前 设置response缓冲区编码//不普遍,否则中文会乱码
// OutputStream os = response.getOutputStream();
// 设置response缓冲区编码 ISO8859-1
// response.setCharacterEncoding("utf-8");
// 设置响应类型 - 方式、编码
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
// 写出到客户端 -> 页面
writer.println("哈哈");
writer.println("<br/>");
writer.println("hello");
HttpServletRequest
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,所以我们学习HttpServletRequest。
因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行、请求头和请求体。
request:
HttpServletRequest -> ServletRequest
请求行:uri method
请求头:客户端信息 Map referer、user-agent
请求体:post参数
-----------------------post参数:form method = post
-----------------------get参数:其他情况下都是get,直接访问、超链接、重定向、form method=“get”
get/post 提交方式区别:
1.参数位置:
—get参数在url上
—post参数在请求体中
2.参数大小:
—get参数有大小限制
—post参数没有大小限制
3.参数格式:
—get参数格式只能是字符串
—post支持多种类型 - 文件
4.编码:
------------get 和tomcat编码一致 utf8
------------post ISO8859-1 - 不能改
请求行:
// 1.获得request行信息 method uri?get参数
// GET/POST
String method = request.getMethod();
//2.URI/URL post/get获得内容一样
String requestURI = request.getRequestURI();
String requestURL = request.getRequestURL().toString();
//3.get提交方式的参数?后面部分 - 了解
// post方式得到的是null
String queryString = request.getQueryString();
请求头:
// 1.获得request头信息 cookie referer
String agent = request.getHeader("user-agent");
// request.getLocalAddr();
// 获得客户端地址
String addr = request.getRemoteAddr();
// referer:资源来源 - 通过哪里访问的
String referer = request.getHeader("referer");
请求体:
// 接收请求参数
// 1.一个name对应一个value
// radio 不选,获得null
String gendar = request.getParameter("gendar");
System.out.println("gendar: " + gendar);
// text/password/textarea/date 不填,获得 ""
String name = request.getParameter("name");
// ---- 解决乱码 get编码设置为ISO8859-1
name = new String(name.getBytes("ISO8859-1"),"UTF-8");
System.out.println("新name: " + name);
// 2.一个name对应多个value [ check select ]
String[] hobbies = request.getParameterValues("hobby");
System.out.println("hobby: " + Arrays.toString(hobbies));
注意:get请求方式的请求参数,上述的方法一样可以获得。
解决post提交方式的乱码:
request.setCharacterEncoding("UTF-8");
解决get提交的方式的乱码:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
request域对象
request作为域对象使用:get/set/removeAttribute
域对象:ServletContext :服务器开始到结束
------------request:一次请求
应用:转发->同一次请求的跳转 forward
得到请求转发器,通过request转发,路径没有应用名,中间转发数次也只算同一次请求
getRequestDispatcher("/Servlet..").forward(request,response);
转发:通过request转发,我们可以认为转发的过程是同一个请求和响应,共用同一个request的map域,但是,本质而言是不同的对象
结论:直接接收请求的资源才可以使用getParameterXX方法;
--------转发的请求要获得参数,只能通过getAttribute方法
如果从前端得到id=1的值
在servlet1中可以得到getParameter(“id”)但是servlet2中不可以通过该方法获得此id
//Servlet1
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
list.add("hi");
//将数据存到request域中
request.setAttribute("name","zld");
request.setAttribute("list", list);
//通过request转发
request.getRequestDispatcher("/servlet2Demo").forward(request, response);
//Servlet2
//得到Demo1中存到request域中的内容
response.getWriter().write(request.getAttribute("name").toString());
response.getWriter().write(request.getAttribute("list").toString());
路径
客户端路径:
ip:port/appName/资源名
/appName/资源名 - 在同一个服务器中
服务器路径:
转发,应用内部转发 - 只能在同一个应用转发
在服务器端内部访问
默认当前同一个应用
/资源名 - 同一个应用中