Servlet--Request&Response

1、Path总结【★★★★】
  1、java项目
    1 File file = new File("");
      * 使用java命令,输出路径是,当前java命令停留的盘符
        * F:\workspaces\20120909\day06_java\bin
      * 使用myeclipse或eclipse运行时
        * F:\workspaces\20120909\day06_java
  2 File file = new File("/");
      * 获得当前盘符
        * F:\
  3 URL url = Hello.class.getClassLoader().getResource("");
      * 获得路径,使用类加载器
        * F:/workspaces/20120909/day06_java/bin/
        * 当前类被加载时,所在的文件根目录
  4 URL url = Hello.class.getClassLoader().getResource("/");
      * 不能使用
        * null
2、web项目
    1、通过servletcontext获得文件
      * 获得实际路径
        * sc.getRealPath("/1.html");
      * 获得URL
        * URL url = sc.getResource("/1.html");
      * 获得流【**】
        * InputStream is = sc.getResourceAsStream("/1.html");
        * WebRoot/page/abc/2.html -- path:/page/abc/2.html
    2、web的相对路径
      * 前提:相对当前的页面1.html
      * 使用分类:
        1、abc:与当前页面同级的目录或servlet的名称
          * <a href="c/c.html">c.html</a><br>
        2、/abc:相对于web站点,%tomcat%/webapps/
          * <a href="/day06_web/b/c/c.html">c.html</a><br>
        3、./abc:当前目录,与第一种情况相同
          * <a href="./c/c.html">c.html</a><br>
        4、../abc:上一次目录
          * <a href="../b/c/c.html">c.html</a><br>
        总结:操作过程
          当前页面:http://localhost:8080/day06_web/b/b.html
          目标页面:http://localhost:8080/day06_web/b/c/c.html
          / -- webapps -- http://localhost:8080

   2、ServletContext
      * 对当前web项目上下文的描述(对当前web项目所有内容的描述),有tomcat在启动时创建,tomcat关闭时销毁。
        * servlet -- > init(ServletConfig) --> config.getServletContext();
        * 当前servlet的所在的项目
      * tomcat,为每一个web项目单独创建一个区域,用来管理整个项目。此区域成为ServletContext
  * 管理当前项目【*****】
    * 获得实际路径,要求必须/开头
      * sc.getRealPath("/1.html");
    * 操作数据
      * add set get remove delete
      * setAttribute/getAttribute/removeAttribute
      * ServletContext对象对所有的servlet共享数据
    * 给当前web项目配置内容【**】
      * 配置文件的位置:web.xml
      * 配置内容
      <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
      </context-param>
      * 如何读取 ServletContext.getInitParameter(string);
    * context root
        * 当前ServletContext所指web项目的根
          * tomcat --> webapps/webName/
          * myeclipse -->webName/WebRoot/
3、ServletResponse
    * 服务器对浏览器做出的响应,将需要发送给浏览器的所有数据全部存放在此对象上。
    * 发送数据,使用流操作,将所需要的数据,存放在指定的流中,数据将显示到浏览器中
      * 字符流
        * response.getWriter();
      * 字节流
        * response.getOutputStream();
      * 当使用getOutputStream时,不能使用getWriter
         * getOutputStream() has already been called for this response
      * 当使用getWriter时,不能使用getOutputStream
        * getWriter() has already been called for this response
      * 总结:两个流同时只能使用一个
    * 字节流:getOutputStream,一般在程序中使用具有拷贝功能等
      * 发送中文
        * 不能发送
          * out.print(data); 不能发送中文数据
          * 异常信息:java.io.CharConversionException Not an ISO 8859-1 character: 中
        * 可以发送
          * out.write(data.getBytes("UTF-8"));
    * 字符流:getWriter,一般在程序中发送数据内容
      * 发送中文
        * out.println("中文");
    * 乱码【****】
      * response.setContentType("text/html;charset=utf-8");
        * 通知tomcat和浏览器发送数据的编码
    * 注意:
      * 设置编码时,必须放置在需要输出语句之前,建议放置在doGet或doPost第一行
        * 实例:cn.itcast.response.FormServlet
  4、ServletRequest
      * 浏览器向服务器的请求(浏览器将数据发送给服务器时,数据存放的地方)
        * 请求方式:GET和POST
          * GET:发送的数据,追加在请求的URL之上
          * POST:发送的数据在HTTP请求体中
      * 浏览器发送数据
        * 表单form,
        * method属性:指定的请求方式
        * action属性:接收数据的程序路径
        * 服务器获得浏览器发送的数据
        * 获得单个数据
          * request.getParameter("username");
        * 获得一组数据
          * request.getParameterValues("love");
        * 处理中文乱码
          * request.setCharacterEncoding("UTF-8");
          * 注意:
            * 此方法只对POST请求有效,GET需要单独处理
            * 需要放置在获得数据之前,建议放在第一个行
  5、扩展:查看API
      * Request --> javax.servlet.ServletRequest ,javax.servlet.http.HttpServletRequest
      * Response
      1、转发与重定向【****】
      * 重定向:重新确定请求方向
        * 发送者:服务器 --> 响应(response)浏览器
        * 执行者:浏览器 --> 重新请求
      * 转发:当前请求未完成,服务器调用另一个程序继续完成整个请求
        * 服务器:当前程序需要获得请求调度器 RequestDispatcher
        * forward:当调度器,协调多个servlet时,此方法返回最后一个servlet的页面输出内容。
      * 对比
        * 何时使用
          * 重定向:可以指定当前web项目的URL,也可以指定其他web资源
          * 转发:只能指定当前的web项目URL
        * 确定使用
          * 重定向:在第一次请求中设置值,在重定向后不能获取。两次请求,tomcat创建了两个request
              * 完成跳转功能,选重定向
              * 转发:设置的值可以在其他servlet或资源中使用。
                * 多个servlet需要传递数据时,现在转发。
      * 总结:
        * 请求次数
          * 重定向:请求2次,tomcat创建了两个request对象
          * 转发:请求1次,tomcat创建了2个request对象
            * request --> org.apache.catalina.connector.RequestFacade -- HttpServletRequest --ServletRequest
            * request --> org.apache.catalina.core.ApplicationHttpRequest
            * class ApplicationHttpRequest extends HttpServletRequestWrapper {
              * public class HttpServletRequestWrapper implements HttpServletRequest {
            * ApplicationHttpRequest -- HttpServletRequestWrapper -- HttpServletRequest
      * 将第一个request中的内容,拷贝给第二个request。值相同
    * 浏览器地址栏是否修改
        * 重定向:修改,看到跳转后页面的内容
        * 转发:没有修改,看到的转发后最后一个servlet响应的内容
    * request设置的值,是否共享
      * 重定向:数据不共享
      * 转发:数据共享


2、会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。
    * 会话技术:cookie、session
    * cookie:将服务器的数据保存到浏览器端的技术
      * 要求保存数据:服务器
      * 保存数据:浏览器
        * IE;将cookie保存到指定目录中,以文件的形式存储
        * 火狐或谷歌:将cookie保存到指定的文件中
      * 使用HTTP协议进行通信
      * 会话级cookie:当整个会话结束后,cookie信息将被删除(cookie在内存中)
      * 持久化cookie:将cookie保存到硬盘中
        * setMaxAge
          * 单位:秒
          * 如果设置的值为零,则进行删除操作。
      * request.getCookies();获得当前web项目的所有的cookie信息
          * 获得当前浏览器中的cookie
          * 获得当前servlet所在目录,以及之上的所有目录下的cookie信息
          * 通过setPath可以设置cookie的访问路径
      * 在cookie中存放中文
        * 编码:String returnData = URLEncoder.encode(data, "UTF-8");
        * 解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");

     * cookie的value可以设置多少个字符:4kb
      * 作业:完成用户登录(账号、密码,复选框(保存两星期),登录按钮)
* session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。
    * 前提:必须使用cookie
    * session:
      * tomcat创建
      * 销毁:30分钟
    * URL重写
      * 一般情况选择encodeURL
      * 两个方法区别在于,如果参数为空字符串,返回结果不同。
      public String encodeURL(String url) {
        String absolute = toAbsolute(url);
        if (isEncodeable(absolute)) {
          // W3c spec clearly said
          if (url.equalsIgnoreCase("")){ //****
            url = absolute;
          }
          return (toEncoded(url, request.getSessionInternal().getIdInternal()));
        } else {
          return (url);
        }

      }

      public String encodeRedirectURL(String url) {

          if (isEncodeable(toAbsolute(url))) {
            return (toEncoded(url, request.getSessionInternal().getIdInternal()));
          } else {
            return (url);
          }

       }
  * 注意:参数url必须有效,否则返回没有改变的URL
    * 当使用"/"开头,相对于web站点
      * response.encodeURL("/day07/urlSessionServlet2")
      * /day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC
    * 获得Web的绝对路径
      String absolute = toAbsolute(url);
      * http://localhost:8080/day07/
  * 总结:
  * 需要考虑用户的Cookie是否禁用了
    * 将所有的链接全部进行URL重写(过滤器)
    * 作业:1、理解一次性验证码 2、尝试编写







posted on 2016-05-04 18:50  yeatschen  阅读(116)  评论(0)    收藏  举报

导航