JSP 笔记

一、JSP
    1.jsp技术
        jsp是sun提供动态web资源开发技术。为了解决在Servlet中拼写html内容css、js内容十分不方便的问题,sun提供了这样一门技术。如果说Servlet是在java中嵌套HTML,则jsp就是在HTML中嵌套java代码,从而十分便于组织html页面
        
        jsp页面在第一次被访问到时会被jsp翻译引擎翻译成一个Servlet,从此对这个jsp页面的访问都是由这个Servlet执行后进行输出
        
    2.jsp语法
        (1)JSP模版元素 :jsp页面中书写的HTML内容称作JSP的模版元素,在翻译过来的Servlet中直接被out.write()输出到浏览器页面上了
            
        (2)JSP表达式 <%= java表达式 %> 在翻译过来的Servlet中,计算java表达式的值后,被out输出到浏览器上
        
        (3)JSP脚本片断 <% 若干java语句 %> 在翻译过来的Servlet中,直接被复制粘贴到了对应的位置执行.
            在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素
            多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况
            单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
        (4)JSP声明  <%! 若干java语句 %> 在翻译过来的Servlet中会被放置到和Service方法同级的位置,变成了类的一个成员
            
        (5)JSP注释
         <%-- 注释的内容 --%> 被jsp注释注释掉的内容,在jsp翻译引擎将jsp翻译成Servlet的过程中会被丢弃,在翻译过来的Servlet中没有这些信息
         <%//java注释%> java注释被当作jsp脚本片段被翻译到了Servlet中,在.java文件被翻译成.class文件的时候注释信息被丢弃
         <!-- HTML注释 --> html注释被当作模版元素输出到了浏览器上,浏览器认识html注释不予显示
       
        (6)JSP指令<%@ 指令名称 属性=... ...%>
           JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分
           
            page指令
            
            
            Include指令:
                include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet
                只有include指令进行的包含是静态包含,其他的包含都是动态包含
            
            taglib指令

        
        (7)JSP九大隐式对象:在翻译过来的Servlet中Service方法自动帮我们前置定义的九个对象,可以在jsp页面中直接使用
          page
          confing
          application
          response
          request
          session
          out
          exception
          pageContext
          
          
          out
            相当于是response.getWriter得到PrintWriter
            out和response.getWriter获取到的流不同在于,在于这个out对象本身就具有一个缓冲区.利用out写出的内容,会先缓冲在out缓冲区中,直到out缓冲区满了或者整个页面结束时out缓冲区中的内容才会被写出到response缓冲区中,最终可以带到浏览器页面进行展示
            page指令中的
             [buffer="none | 8kb | sizekb" ]可以用来禁用out缓冲区或设置out缓冲区的大小,默认8kb
             [ autoFlush="true | false"]用来设置当out缓冲区满了以后如果在写入数据时out如何处理,如果是true,则先将满了的数据写到response中后再接受新数据,如果是false,则满了再写入数据直接抛异常

            在jsp页面中需要进行数据输出时,不要自己获取response.getWriter,而是要使用out进行输出,防止即用out又用response.getWriter而导致输出顺序错乱的问题
          
          pageContext
            (1)可以作为入口对象获取其他八大隐式对象的引用
                getException方法返回exception隐式对象
                getPage方法返回page隐式对象
                getRequest方法返回request隐式对象
                getResponse方法返回response隐式对象
                getServletConfig方法返回config隐式对象
                getServletContext方法返回application隐式对象
                getSession方法返回session隐式对象
                getOut方法返回out隐式对象
            (2)域对象,四大作用域的入口,可以操作四大作用域中的域属性
                
                作用范围: 当前jsp页面
                生命周期: 当对jsp页面的访问开始时,创建代表当前jsp的PageContext,当对当前jsp页面访问结束时销毁代表当前jsp的pageContext
                作用:在当前jsp中共享数据
                
                    public void setAttribute(java.lang.String name,java.lang.Object value)
                    public java.lang.Object getAttribute(java.lang.String name)
                    public void removeAttribute(java.lang.String name)

                    public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
                    public java.lang.Object getAttribute(java.lang.String name,int scope)
                    public void removeAttribute(java.lang.String name,int scope)
                    
                    PageContext.APPLICATION_SCOPE
                    PageContext.SESSION_SCOPE
                    PageContext.REQUEST_SCOPE
                    PageContext.PAGE_SCOPE

                    findAttribute方法 -- 搜寻四大作用域中的属性,如果找到则返回该值,如果四大作用域中都找不到则返回一个null,搜寻的顺序是从最小的域开始向最大的域开始寻找
                    
            (3)提供了请求转发和请求包含的快捷方法
                pageContext.include("/index.jsp");
                  pageContext.forward("/index.jsp");    
    3.零散知识
        (1)jsp映射
            <servlet>
                <servlet-name>index</servlet-name>
                <jsp-file>/index.jsp</jsp-file>
            </servlet>
            <servlet-mapping>
                <servlet-name>index</servlet-name>
                <url-pattern>/jsp/*</url-pattern>
            </servlet-mapping>
         
        (2)JSP最佳实践
        
        (3)域的总结
            servletContext (application)
            session (session)
            request (request)
            pageContext
            
            如果一个数据只在当前jsp页面使用,可以使用pageContext域存储
            如果一个数据,除了在当前Servlet中使用,还要在请求转发时带到其他Servlet处理或jsp中显示,这个时候用request域
            如果一个数据,除了现在我自己要用,过一会我自己还要用,存在session域
            如果一个数据,除了现在我自己要用过一会其他人也要用,存在ServletContext域中
            
=================================================================================================================================       
jsp的标签技术:在jsp页面中最好不要出现java代码,这时我们可以使用标签技术将java代码替换成标签来表示
    
1.jsp标签:sun原生提供的标签直接在jsp页面中就可以使用
     <jsp:include> -- 实现页面包含,动态包含
     <jsp:forward> -- 实现请求转发
     <jsp:param> -- 配合上面的两个标签使用,在请求包含和请求转发时用来在路径后拼接一些请求参数
2.EL表达式:最初出现的目的是用来取代jsp页面中的jsp脚本表达式.但是随着el的发展el的功能已经不限于此了
    ${el表达式}
    
    (1)获取数据:
        使用中括号的地方都可以使用点号替代,除了中括号中是数字或者中括号中包含特殊字符(-.)的情况除外
        在中括号中如果不用双引号引起来则是变量,先找变量的值再拿变量的值使用.如果用双引号则是常量,直接使用常量的值
    
      ~获取常量
        字符串/数字/布尔类型,直接写在el表达式中,el直接进行输出
      ~获取域中的变量
        如果el中写的是一个变量的名,则el会调用pageContext的findAttribute方法,在四大作用域中以给定的名字找对应的属性值,找到后进行输出,如果四个域中都找不到,什么都不输出
      ~获取数组中的数据
      ~获取集合中的数据
      ~获取Map中的数据
      ~获取javabean的属性      
    
    (2)执行运算:
        算数运算
            +-*/
        逻辑运算
        比较运算
       
        三元运算符
        empty运算符
        
    (3)获取常用开发对象:el中内置了11个内置对象,这些对象el内置的,不需要提前定义就可以直接在el中使用
        !pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
        
        !pageScope -- page域中属性组成的Map
        !requestScope -- request域中属性组成的Map
        !sessionScope -- session域中属性组成的Map
        !applicationScope --application域中属性组成的Map
        
        !param -- 所有请求参数组成的Map<String,String>
        paramValues -- 所有请求参数组成的Map<String,String[]>
        
        header -- 所有请求头组成的Map<String,String>
        headerValues -- 所有请求头组成的Map<String,String[]>
        
        !cookie -- 所有cookie信息组成的Map<String,Cookie>
        
        initParam -- 所有web应用的初始化参数组成Map
        
        
            
    (4)调用java方法: -- 不需要大家自己会写调用方法的过程,只要会调用别人写好的标签库就可以了 fn标签库
           ~写一个类其中包含要被el调用的方法,这个方法必须是静态的方法
           ~写一个tld文件在其中对要被调用的静态方法进行一下描述
           ~在jsp页面中taglib指令将tld文件引入当前jsp页面,从而在jsp页面中就可以调用描述好的方法  

3.JSTL:
    <c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
    <c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的    属性。  
    <c:remove>标签用于删除各种Web域中的属性
    <c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
    !!<c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式
    !!<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
    !!<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
    !!<c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
    <c:param>标签      在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
    <c:import> 标签,实现include操作
    <c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
    <c:redirect>标签用于实现请求重定向
    
4.自定义标签技术:
    传统标签:
        (1)写一个类实现Tag接口
        (2)写一个tld文件,描述写好的类
        (3)在jsp页面中引入tld文件,就可以在jsp页面中使用自定义标签了
        
        分为doStartTag 和 doEndTag方法来分别处理发现开始标签和发现结束标签时的代码,在doStartTag可以通过返回值来控制标签体是否允许执行,在doEndTag方法里可以通过返回值控制标签之后的剩余页面是否允许执行
        
        传统标签的这种开发方式,需要我们分析发现开始标签和发现结束标签时都需要执行什么代码,还需要分析到底要返回什么样的标签体控制程序执行,相对来说相当的繁琐.
    
    简单标签:
        (1)写一个类实现SimpleTag接口(继承SimpleTag接口的默认实现类SimpleTagSupport)
        (2)写一个tld文件,描述写好的类
        (3)在jsp页面中引入tld文件,就可以在jsp页面中使用自定义标签了
    
        当jsp在执行的过程中,每当遇到一个简单标签时都会创建一个处理类对象.
        调用setJspContext传入当前jsp页面的PageContext对象.
        如果当前标签有父标签则调用setParent方法将父标签传入,如果没有父标签则这个方法不会被调用.
        如果该标签具有属性,调用属性的setXXX方法将属性的值传入
        如果当前标签具有标签体,则会调用setJspBody将封装了标签体信息的JspFragment传入,如果没有标签体,这个方法不执行
        最后调用doTag方法,在这个方法里我们可以书写处理标签事件的java代码
        当自定义标签执行完成后,简单标签对象就销毁掉了.
    
        控制标签体是否执行<c:if>
        控制标签之后的内容是否执行
        控制标签体重复执行<c:foreach>
        修改标签体后输出<c:out>
        
        为自定义标签来增加一个属性:
            在标签处理类中增加一个javabean属性,这个属性就是要增加的标签的属性,并对外提供setXXX方法
            在tld文件中这个标签的描述中描述一下该属性       
 
        *想要开发一个简单标签,写一个类继承SimpleTagSupport覆盖doTag方法就可以了,可以调用getJspContext/getJspBody来获取需要的内容
        *在tld文件中对标签进行描述
            <tag>
                <name>simpleDemo1</name> -- 标签的名字
                <tag-class>com.itheima.simletag.SimpleDemo1</tag-class> -- 标签的处理类
                <body-content>scriptless</body-content> -- 标签体的类型 JSP(简单标签不能写) Scriptless(任意的jsp内容,不包括java代码) empty(空标签) tagdependent(标签体是给后台用的,一般不用这种类型)
                <attribute> -- 声明一个属性,可以声明多个属性
                    <name>times</name>  -- 属性的名字
                    <required>true</required> -- 是否为必须存在的属性
                    <rtexprvalue>true</rtexprvalue> -- 是否支持el表达式
                    <type>int</type> -- 属性的java类型
                </attribute>
            </tag>
============================================================================================================
用户注册登录注销
    Servlet+jsp+javaBean+dom4j(XPATH)
    
    javaee的经典三层架构
    
    com.itheima.web
                .service
                .dao
                .domain
                .util
                .test
                .exception
                .factory
   
   *junit
   dom4j
   *jstl
   beanutils
   
   *debug调试模式
   
   users.xml -- 模拟数据库
   config.properties -- 主配置文件
   
    
    
    
    
    
    
    


基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值