response作用:
1.可以操作状态码 setStatus()
2.可以操作响应头 setHeader()
3.可以操作响应正文 通过流 getOutputStream() getWriter()
1、通过response实现重定向
重定时,可以访问站内资源,也可以访问站外资源。
开发中要想重定向 respons.sendRedirect(String location);
2、设置缓存
发送http头,控制浏览器禁止缓存当前文档内容,只需要在服务器端设置这三项就可能,控制缓存。
在开发中要想禁用缓存,都是在显示页面上操作.也就是jsp上。
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="-1">
如果要在servlet上禁用缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", -1);
3、设置相应正文
响应正文是在浏览器上真正显示的内容。
在servlet中要想操作响应正文,需要通过response对象获取输出流来操作。
getWriter() 字符流 --ServletOutputStream
getOutputStream(); 字节流. --PrintWriter
如果是纯文本使用字符流,如果二进制文件,使用字节流。
如果只是得到信息,原样不动,不进行修改操作,这时就使用字节流。
如果要操作的是自定义信息,这时使用字符流。
关于响应信息乱码问题:
response.setCharacterEncoding(String code);它不能通知浏览器解析时使用什么编码。只能设置响应正文编码。response.setCharacterEncoding("utf-8");
response.setContentType(String mimeType);它不仅设置响应编码,也通知浏览器怎样解析。
建议使用:response.setContentType("text/html;charset=utf-8");
request
1 get方法
1. //传输协议
2. //请求的地址
3. //没有主机名的地址 ---/day8_2/login
4. //获取协议
5. String add = request.getRemoteAddr();//客户端IP
6. //客户端主机名
7. "";//客户端端口号
8. //客户端的请求方式
9. //获取服务器地址
10. "username");//地址后面?请求的参数
11. "";//服务器端口号
12. //服务器名
13. String msg = request.getQueryString();
14. request.getContextPath(); 获取虚拟目录名称.(就是工程名)
15. String userAgent = request.getHeader("User-Agent"); 获取浏览器信息
2 获取客户端请求头
String getHeader(String name); 获取一个请求头信息
Enumeration getHeaders(); 获取多个请求头信息
3 获取请求参数
public String getParameter(String name);
public String[] getParameterValues(String name);
public Enumeration getParameterNames();
它获取的是表单中所有的name值.值可能不是一个public Map<String,String[]> getParameterMap();
它将请求参数的name做为了key,以输入的值或选定的值做为value。// 获取所有的name值
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
System.out.println(names.nextElement());
} // getParameterMap
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
System.out.println(key + "------ " + Arrays.toString(map.get(key)));
}
4 解决请求参数的中文乱码
乱码出现的原因:页面上使用的是utf-8进行编码,而tomcat使用了iso8859-1进行了解码。
get方式:先按照原编码得到原始字节码,然后再重新编码。如:name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
处理方式是:先进行iso8859-1编码,然后在进行utf-8解码
post方式:我们可以通过 request.setCharacterEncoding(String charsetname); 来解决乱码问题.
请求转发与重定向区别
1.请求转发它是服务器内部跳转,只有一次请求,一次响应。
重定向它是两次请求,两次响应。
2.请求转发,是服务器内部操作,它不会影响到地址的路径。
重定向是两次请求,地址栏会变化。
3.请求转发只能在当前站点内跳转。
重定向可以跳出站内。
4.请求转发是由request发起的。 request.getRequestDispatcher("").forward();
重定向 response.sendRedirect();
5.请求转发时,它的路径 "/" 代表的是当前工程. 服务器端路径
重定向 它的路径 "/" 代表的是服务器要目录。 客户端路径.
request.getRequestDispatcher("/").forward();
这时的/相当于当前虚拟目录名称 http://localhost:8080/day8_2
response.sendRedirect("/");它相当于是 http://localhost:8080
6.请求转发中存在request域.
重定向它不存在request域。
路径的写法
a、绝对路径写法:ServeltContext都必须用绝对路径。“/”开始 (如ServletContext.getRequestDispatcher("path") path必须是绝对路径)
b、相对路径:其他情况都可以使用相对路径,也可以使用绝对路径
c、在使用绝对路径时,要不要加"/"或者是项目名:如果是服务器调用的,不用加项目名,用“/”就可以代表了当前应用根目录。如果是客户端调用的,必须加上项目名
1、转发:request.getRequestDispather(String url) -----------------绝对路径:url /servlet/ServletDemo
2、重定向:response.sendRedirect(String url)--------------绝对路径:url /day05/servlet/ServletDemo<br>
3、超链接:<a href="url"/> ------- -------------绝对路径:url /day05/servlet/ServletDemo<br>
4、类加载文件的路径----------------web应用中只能用相对路径,相对于classes目录的
5、<fomr action="url"/> ------------------------绝对路径:/day05/servlet/ServletDemo
6、ServletContext.getRealPath(url) --------------绝对路径:url /servlet/ServletDemo