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");  获取浏览器信息
  1.  

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