A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© x531661 初级黑马   /  2019-6-30 10:31  /  883 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

HTTP协议
概念:Hyper Text Transfer Protocol 超文本传输协议
       *传输协议:定义了,客户端和服务器端通信时,发送数据的格式
       *特点:
              1.基于TCP/IP的高级协议
              2. 默认端口号:80
              3.基于请求/响应模型的:一次请求对应一次响应。
              
请求信息
  
1. 请求行
  
              请求方式  请求url 请求协议/版本
  
              GET  /login.html  HTTP/1.1
  
  
              *  请求方式:
  
                     *  HTTP协议有7中请求方式,常用的有2种
  
                            *  GET:
  
                                   1.  请求参数在请求行中,在url后。
  
                                   2.  请求的url长度有限制的
  
                                   3.  不太安全
  
                            *  POST:
  
                                   1.  请求参数在请求体中
  
                                   2.  请求的url长度没有限制的
  
                                   3.  相对安全
  
       2. 请求头:客户端浏览器告诉服务器一些信息
  
              请求头名称: 请求头值
  
              *  常见的请求头:
  
                     1.  User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
  
                            *  可以在服务器端获取该头的信息,解决浏览器的兼容性问题
  
  
                     2.  Referer:http://localhost/login.html
  
                            *  告诉服务器,我(当前请求)从哪里来?
  
                                   *  作用:
  
                                          1.  防盗链:
  
                                          2.  统计工作:
  
       3. 请求空行
  
              空行,就是用于分割POST请求的请求头,和请求体的。
  
       4. 请求体(正文)
  
              *  封装POST请求消息的请求参数的
  
请求信息的字符串表示形式;//将来这一对字符串会变成request对象
  
POST /login.html?user=lisi    HTTP/1.1
  
                  Host: localhost
  
                  User-Agent: Mozilla/5.0  (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
  
                  Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  
                  Accept-Language:  zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  
                  Accept-Encoding:  gzip, deflate
  
                  Referer:  http://localhost/login.html
  
                  Connection: keep-alive
  
                  Upgrade-Insecure-Requests: 1
  
                  
  
                  username=zhangsan        
  
响应信息
  
1. 响应行
  
                     1.  组成:协议/版本 响应状态码 状态码描述
  
                     2.  响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
  
                            1.  状态码都是3位数字
  
                            2.  分类:
  
                                   1.  1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
  
                                   2.  2xx:成功。代表:200
  
                                   3.  3xx:重定向。代表:302(重定向),304(访问缓存)
  
                                   4.  4xx:客户端错误。
  
                                          *  代表:
  
                                                 *  404(请求路径没有对应的资源)
  
                                                 *  405:请求方式没有对应的doXxx方法
  
                                   5.  5xx:服务器端错误。代表:500(服务器内部出现异常)
  
  
2响应头:
  
格式:头名称: 值
  
常见的响应头:
  
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
  
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
  
值:
  
in-line:默认值,在当前页面内打开
  
attachment;filename=xxx:以附件形式打开响应体。文件下载
  
3.响应空行
  
4.响应体:传输的数据
  
  
响应信息的字符串表示形式:将来这个信息由Response对象设置。
  
HTTP/1.1 200 OK
  
              Content-Type:  text/html;charset=UTF-8
  
              Content-Length:  101
  
              Date:  Wed, 06 Jun 2018 07:08:42 GMT
  
  
              <html>
  
                <head>
  
                  <title>$Title$</title>
  
                </head>
  
                <body>
  
                hello , response
  
                </body>
  
              </html>
  
Servlet中的Request对象功能。
  
1. 获取请求行数据
  
(***)获取虚拟目录:/day14
  
        String getContextPath()
  
  
(***)获取请求URI:/day14/demo1
  
              *  String getRequestURI():              /day14/demo1
  
              StringBuffer  getRequestURL()   :http://localhost/day14/demo1
  
  
              *  URL:统一资源定位符 : http://localhost/day14/demo1     中华人民共和国
  
              *  URI:统一资源标识符 : /day14/demo1                                 共和国
  
  
2. 获取请求头数据
  
              *  方法:
  
              *  (***)String getHeader(String name):通过请求头的名称获取请求头的值
  
              
  
3. 获取请求体数据:
  
String  getParameter(String name):根据参数名称获取参数值  username=zs&password=123
  
  
Map<String,String[]>  getParameterMap():获取所有参数的map集合
  
  
4.解决获取时候的中文乱码
  
***** 中文乱码问题:
  
       * get方式:tomcat 8 已经将get方式乱码问题解决了
  
       * post方式:会乱码
  
       * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
  
Reuest的请求转发
  
5.请求转发。
  
*2. 请求转发:一种在服务器内部的资源跳转方式
  
1.      步骤:
  
1.      1.通过request对象获取请求转发器对象:RequestDispatcher  getRequestDispatcher(String path)
  
2.      
  
2.      2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request,  ServletResponse response)
  
3.      
  
request. getRequestDispatcher(“/index.html”). forward(request,  response);
  
Request域对象。
作用: 共享数据:
       *域对象:一个有作用范围的对象,可以在范围内共享数据
       *request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
       *方法:
              1.void setAttribute(String name,Object obj):存储数据
              2.Object getAttribute(String name):通过键获取值
              3.void removeAttribute(String name):通过键移除键值对
Servlet中的Response对象功能。
  
* 功能:设置响应消息
  
       1.  设置响应行
  
              1.  格式:HTTP/1.1 200 ok
  
              2. 设置状态码:setStatus(int sc)
  
       2. 设置响应头:setHeader(String name, String value)
  
              
  
       3.  设置响应体:
  
              *  使用步骤:
  
                     1.  获取输出流
  
                            * 字符输出流:PrintWriter getWriter()
  
  
                            * 字节输出流:ServletOutputStream getOutputStream()
  
  
                     2.  使用输出流,将数据输出到客户端浏览器
  
Response的重定向功能
  
* 重定向:资源跳转的方式
  
              *  代码实现:
  
                     //1.  设置状态码为302
  
               response.setStatus(302);
  
               //2.设置响应头location
  
                response.setHeader("location","/day15/responseDemo2");
  
       //简单的重定向方法-以后用的技术
  
         response.sendRedirect("/day15/responseDemo2");
  
重定向和转发的区别
  
* forward 和  redirect 区别
  
重定向的特点:redirect   
  
                     1.  地址栏发生变化
  
                     2.  重定向可以访问其他站点(服务器)的资源
  
                     3.  重定向是两次请求。不能使用request对象来共享数据
  
* 转发的特点:forward
  
                     1.  转发地址栏路径不变
  
                     2.  转发只能访问当前服务器下的资源
  
                     3.  转发是一次请求,可以使用request对象来共享数据
  
响应乱码的解决:
  
* 乱码问题:
  
              1.  PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
  
              2.  设置该流的默认编码
           resp.setCharacterEncoding("utf-8");  
              3.  告诉浏览器响应体使用的编码
         resp.setHeader("Content-type","text/html;charset=utf-8");  
  
  
//简单的形式,设置编码,是在获取流之前设置《我们以后用的》
  
response.setContentType("text/html;charset=utf-8");
  
ServletContext对象
获取方式:
1. 通过request对象获取
              request.getServletContext();
       2.通过HttpServlet获取
              this.getServletContext();//this是servlet对象
作用:
  
1. 获取MIME类型:
  
              * MIME类型:在互联网通信过程中定义的一种文件数据类型
  
                     * 格式: 大类型/小类型   text/html         image/jpeg
  
  
              * 获取:String getMimeType(String  file)  //a.txt
  
         * 作用:response.setHeader(mimetype);  设置响应头
  
2. 域对象:共享数据
  
              1. setAttribute(String  name,Object value)
  
              2. getAttribute(String name)
  
              3. removeAttribute(String name)
  
* ServletContext对象范围:整个web应用。
  
  
3. 获取文件的真实(服务器)路径 -- / 代表web文件夹
  
              1. 方法:String  getRealPath(String path)  
  
                     String b =  context.getRealPath("/b.txt");//web目录下资源访问
  
                 System.out.println(b);
  
      
  
                String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
  
                System.out.println(c);
  
  
                String a =  context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
  
                System.out.println(a);
  
会话技术—cookie
会话:一次会话中包含多次请求和多次响应。
       * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
1. 客户端会话技术:Cookie  //数据存储到浏览器
2. 服务器端会话技术:Session //数据存储到服务器
  
1. 创建Cookie对象,绑定数据
  
                     * new Cookie(String name,  String value)
  
2. 存储到浏览器Cookie对象
  
                     * response.addCookie(Cookie cookie)
  
3. 获取Cookie,拿到数据
  
                   *  Cookie[]  request.getCookies()  
  
  
4. 持久化存储:
  
                     * setMaxAge(int seconds)
  
                            1. seconds正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
  
                            2. seconds负数:默认值
  
                            3. seconds:删除cookie信息
  
  
cookie共享问题
  
1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
  
* setPath(String  path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
  
如果要共享,则可以将path设置为"/"
  
共享范围: 同一个服务器下的多个项目。
  
  
2. 不同的tomcat服务器间cookie共享问题?
  
   * setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
  
   示例:*  setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
  
  
  
  
  
  
  
JSP概述
1. 概念:
       *Java Server Pages: java服务器端页面
              * 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
              *用于简化书写!!!
2. 原理
       * JSP本质上就是一个Servlet
3. JSP的脚本:JSP定义Java代码的方式
       1. <%  代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
       2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
       3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
jsp一共有9个内置对象。
  
       变量名                               真实类型                                          作用
  
* pageContext                         PageContext                     当前页面共享数据,还可以获取其他八个内置对象
  
* request                                  HttpServletRequest  一次请求访问的多个资源(转发)
  
* session                                  HttpSession                             一次会话的多个请求间
  
* application                            ServletContext                        所有用户间共享数据
  
* response                               HttpServletResponse                     响应对象
  
* page                                      Object                        当前页面(Servlet)的对象  this
  
* out                                         JspWriter                   输出对象,数据输出到页面上
  
* config                             ServletConfig                          Servlet的配置对象
  
* exception                              Throwable                               异常对象
  
Jsp的指令:
  
1. page         : 配置JSP页面的
  
                     *  contentType:等同于response.setContentType()
  
                            1.  设置响应体的mime类型以及字符集
  
                            2.  设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
  
                     * import:导包
  
             * session:true 可以使用session对象,false不可以使用session
  
                     *  errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
  
                     *  isErrorPage:标识当前也是是否是错误页面。
  
                            *  true:是,可以使用内置对象exception
  
                            *  false:否。默认值。不可以使用内置对象exception
  
2. include     : 页面包含的。导入页面的资源文件
  
                     *  <%@include file="top.jsp"%>
  
3. taglib : 导入资源
  
                     * <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
  
                            * prefix:前缀,自定义的
  
  
Session对象
  
1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
  
2. 快速入门:
  
       1.  获取HttpSession对象:
  
              HttpSession session = request.getSession();
  
       2.  使用HttpSession对象:
  
              Object  getAttribute(String name)  
  
              void  setAttribute(String name, Object value)
  
              void removeAttribute(String name)  
  
  
3. 原理
  
       *  Session的实现是依赖于Cookie的。
  
如何配置长时间的session:
  
* 如果需要延长session的生命周期,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
  
  
  Cookie c = new  Cookie("JSESSIONID",session.getId()); ​
  
  c.setMaxAge(60*60);
  
​ response.addCookie(c);
  
Session的创建与销毁?
  
session什么时候被创建?
  
1.       调用resquest的getSession()方法。
  
2.       访问jsp资源,会创建session对象。
  
  
session什么时候被销毁?
  
              1.  服务器异常关闭
  
              2.  session对象调用invalidate() 。
  
              3.  session默认失效时间 30分钟
  
                     选择性配置修改   
  
                     <session-config>
  
                      <session-timeout>30</session-timeout>
  
                  </session-config>
  
Session的特点:
  
5. session的特点
  
        1. session用于存储一次会话的多次请求的数据,存在服务器端
  
        2. session可以存储任意类型,任意大小的数据
  
  
       *  session与Cookie的区别:
  
              1.  session存储数据在服务器端,Cookie在客户端
  
              2.  session没有数据大小限制,Cookie有
  
              3.  session数据安全,Cookie相对于不安全
  
EL表达式
作用:替换和简化jsp页面中java代码的编写
语法:${表达式}
功能:
  
1. 运算:
  
* 运算符:
  
       1.  算数运算符: + - * /(div) %(mod)
  
       2.  比较运算符: > < >= <= == !=
  
       3.  逻辑运算符: &&(and) ||(or) !(not)
  
       4.  空运算符: empty
  
              *  功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
  
              *  ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
  
              *  ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
  
  
2. 获取值
  
              1. el表达式只能从域对象中获取值
  
              2.  语法:
  
                     1. ${域名称.键名}:从指定域中获取指定键的值
  
                            *  域名称:
  
                                   1.  pageScope             --> pageContext
  
                                   2.  requestScope       --> request
  
                                   3.  sessionScope        --> session
  
                                   4.  applicationScope --> application(ServletContext)
  
                            *  举例:在request域中存储了name=张三
  
                            *  获取:${requestScope.name}
  
  
2.${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
  
3. 获取对象、List集合、Map集合的值
  
1. 对象:${域名称.键名.属性名}
  
* 本质上会去调用对象的getter方法
  
  
2. List集合:${域名称.键名[索引]}
  
  
3. Map集合:
  
        * ${域名称.键名.key名称}
  
               *  ${域名称.键名["key名称"]}
  
  
3. 隐式对象:
  
        * el表达式中有11个隐式对象
  
        *  pageContext:
  
               * 获取jsp其他八个内置对象
  
                      * ${pageContext.request.contextPath}:动态获取虚拟目录
  
JSTL
  
1. 概念:JavaServer  Pages Tag Library  JSP标准标签库
  
       *  是由Apache组织提供的开源的免费的jsp标签             <标签>
  
  
2. 作用:用于简化和替换jsp页面上的java代码      
  
  
3. 使用步骤:
  
       1. 导入jstl相关jar包
  
       2. 引入标签库:taglib指令:   <%@ taglib %>
  
       3. 使用标签
  
  
4. 常用的JSTL标签
  
       1. if:相当于java代码的if语句
  
              1.  属性:
  
            * test 必须属性,接受boolean表达式
  
                * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
  
                * 一般情况下,test属性值会结合el表达式一起使用
  
              2. 注意:
  
                 * c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
  
       2. choose:相当于java代码的switch语句
  
              1.  使用choose标签声明                              相当于switch声明
  
         2. 使用when标签做判断                             相当于case
  
         3. 使用otherwise标签做其他情况的声明       相当于default
  
  
3.       foreach:相当于java代码的for语句
  
  
  
foreach:相当于java代码的for语句
      1.
完成重复的操作
          for(int i = 0; i < 10; i  ++){
  
          }
          *
属性:
              begin
:开始值
              end
:结束值
              var
:临时变量
              step
:步长
              varStatus:
循环状态对象
                  index:
容器中元素的索引,从0开始
                  count:
循环次数,从1开始
      2.
遍历容器
          List<User> list;
          for(User user : list){
  
          }
  
          *
属性:
              items:
容器对象
              var:
容器中元素的临时变量
              varStatus:
循环状态对象
                  index:
容器中元素的索引,从0开始
                  count:
循环次数,从1开始
  
  
MVC:开发模式
file:///C:/Users/PANJIA~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
  
MVC:
  
       1.  M:Model,模型。JavaBean
  
              *  完成具体的业务操作,如:查询数据库,封装对象
  
       2.  V:View,视图。JSP
  
              *  展示数据
  
       3.  C:Controller,控制器。Servlet
  
              *  获取用户的输入
  
              *  调用模型
  
              *  将数据交给视图进行展示
  
  
* 优缺点:
  
              1.  优点:
  
                     1.  耦合性低,方便维护,可以利于分工协作
  
                     2.  重用性高
  
  
              2.  缺点:
  
                     1.  使得项目架构变得复杂,对开发人员要求高
  
三层架构:软件设计架构
file:///C:/Users/PANJIA~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
  
1. 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
  
2. 业务逻辑层:处理业务逻辑的。
  
3. 数据访问层:操作数据存储文件。
  
Filter:过滤器
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
快速入门:
步骤:
              1.定义一个类,实现接口Filter
              2.复写方法
              3.配置拦截路径
                     1.web.xml
                     2.注解
代码示例:
  
@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
  
public class FilterDemo1 implements Filter {
      @Override
      public void init(FilterConfig  filterConfig) {
  
      }
  
      @Override
      public void doFilter(ServletRequest  servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,  ServletException {
          System.out.println("filterDemo1被执行了....");
  
          //放行
         
filterChain.doFilter(servletRequest,servletResponse);
  
  
          System.out.println("回来的拦截代码");
  
      }
  
      @Override
      public void destroy() {
  
      }
  }
  
  
在web.xml中的配置
  
1. web.xml配置  
  
              <filter>
  
               <filter-name>demo1</filter-name>
  
                <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
  
           </filter>
  
           <filter-mapping>
  
                <filter-name>demo1</filter-name>
  
                     <!--  拦截路径 -->
  
                <url-pattern>/*</url-pattern>
  
           </filter-mapping>
  
Filter的生命周期:
  
       1.  init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
  
       2.  doFilter:每一次请求被拦截资源时,会执行。执行多次
  
       3.  destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
  
Filter的配置详解:
  
* 拦截路径配置:
  
       1.  具体资源路径: /index.jsp    只有访问index.jsp资源时,过滤器才会被执行
  
       2.  拦截目录: /user/*      访问/user下的所有资源时,过滤器都会被执行
  
       3.  后缀名拦截: *.jsp              访问所有后缀名为jsp资源时,过滤器都会被执行
  
       4.  拦截所有资源:/*         访问所有资源时,过滤器都会被执行
  
              *  拦截方式配置:资源被访问的方式
  
                     *  注解配置:
  
                            *  设置dispatcherTypes属性
  
                                   1. REQUEST:默认值。浏览器直接请求资源
  
                                   2. FORWARD:转发访问资源
  
                                   3.  INCLUDE:包含访问资源
  
                                   4.  ERROR:错误跳转资源
  
                                   5.  ASYNC:异步访问资源
  
       *  web.xml配置
  
              *  设置<dispatcher>REQUES</dispatcher>标签即可
  
                   <dispatcher>FORWARD</dispatcher>
  
Filter的过滤器链:
  
5. 过滤器链(配置多个过滤器)
  
              *  执行顺序:如果有两个过滤器:过滤器1和过滤器2
  
                     1.  过滤器1
  
                     2.  过滤器2
  
                     3.  资源执行
  
                     4.  过滤器2
  
                     5.  过滤器1
  
  
              * 过滤器先后顺序问题:
  
                     1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
  
                            *  如: AFilter 和 BFilter,AFilter就先执行了。
  
                     2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行
  
Listener:监听器
Listener是web开发中的监听器,主要用来监听域容器的创建和销毁
可以监听的对象有:
ServletContextListener  :监听应用域创建和销毁
HttpSessionListener     :监听会话域创建和销毁
ServletRequestListener  :监听请求域创建和销毁
使用步骤:
  
用该方法
  
       *  步骤:
  
              1.  定义一个类,实现HttpSessionListener接口
  
              2.  复写方法
  
              3.  配置
  
1. web.xml
  
<listener>
  
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
  
</listener>
  
  
* 指定初始化参数<context-param>
  
       2. 注解:
  
              * @WebListener
  
代码示例:
  
@WebListener
  public class MySessionListener implements HttpSessionListener{
      @Override
      public void sessionCreated(HttpSessionEvent  httpSessionEvent) {
          System.out.println("sessionCreated");
      }
  
          @Override
       public void sessionDestroyed(HttpSessionEvent  httpSessionEvent) {
              System.out.println("sessionDestroyed");
      }
  }
  
  

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马