jsp&el&jstl

jsp&el&jstl

一、jsp(java服务器页面)

1.简介
(1)全称为java server pages,即java服务器页面;
(2)本质上jsp就是一个servlet,在html代码中嵌套java代码,
        运行在服务器端,接受请求,处理业务逻辑,生成动态内容;
(3)对应的java和class文件在tomcat目录下的work目录下;
(4)后缀名 .jsp
(5)作用:将内容的生成和信息的展示相分离

2.jsp三个脚本
    <%...%> java程序片段
        生成在jsp的service方法中
    <%=...%> 输出表达式
        生成在jsp的service方法中,相当于在java中调用out.print(..)
        不能";"结尾
    <%!...%> 声明成员
        成员位置
    
3.jsp的指令
(1)作用:声明jsp页面的一些属性或者动作
(2)格式:<%@指令名 属性=值 属性=值%>
(3)分类(了解) ★★★
    page:主要声明jsp页面的一些属性
    include:静态包含
    taglib:导入标签库
    注:一个页面中可以出现多个指令;
        指令可以放在任意位置,一般都放在jsp页面最上面.
(4)page指令
    a.重要属性:3个
        contentType:设置响应流的编码,及通知浏览器用什么编码打开,设置文件的mimetype
        pageEncoding:设置页面的编码
        import:导入所需要的包
        contentType和pageEncoding联系:
            若两者都出现的时候,各自使用各自的编码;
            若只出现一者,两个都使用出现的这个编码;
            若两者都不出现,使用服务器默认的编码 tomcat7使用的iso-8859-1
    b.了解属性
        language:当前jsp页面里面可以嵌套的语言
        buffer:设置jsp页面的流的缓冲区的大小
        autoFlush:是否自动刷新
        extends:声明当前jsp的页面继承于哪个类,必须继承的是httpservlet及其子类
        session:设置jsp页面是否可以使用session内置对象
        isELIgnored:是否忽略el表达式
        errorPage:当前jsp页面出现异常的时候要跳转到的jsp页面
        isErrorPage(理解):当前jsp页面是否是一个错误页面
                    若值为true,可以使用jsp页面的一个内置对象exception
(5)include指令
    静态包含(内容),就是将被包含页面或者servlet的所有内容复制过来一起编译运行,
    只生成一个java文件
    格式:
        <%@include file="相对路径或者是内部路径" %>
    例如:
        <%@include file="/jsp/include/i1.jsp" %>    
    路径:(了解)
        相对路径:
            当前路径    ./或者什么都不写 
            上一级路径  ../
        绝对路径:
            带协议和主机的绝对路径
            不带协议和主机的绝对路径
                /项目名/资源        
        内部路径:
            不带协议和主机的绝对路径去掉项目名
            使用情形:请求转发 静态包含 动态包含
(6)taglib指令:导入标签库    
    格式:
         <%@taglib prefix="前缀名" uri="名称空间" %>
    若导入之后
        <前缀名:标签 .. >
    例如:
        <c:if test="">输出内容</c:if>

4.jsp的内置对象(9大内置对象)(常见面试题)★★★
    在jsp页面上可以直接使用的对象:
    内置对象            类型
    out                    JspWriter
    request              HttpServletRequest
    response           HttpServletResponse
    session              HttpSession
    
    exception           Throwable
    page                  Servlet(this)
    config                ServletConfig
    application         ServletContext
    pageContext      PageContext
    
5.jsp的域对象(理解)(范围从大到小)
(1)域对象             生命周期
    application            整个项目
    session                一次会话
    request                一次请求
    pageContext        一个页面
(2)pagecontext作用(理解)
    a.域对象
        方法:xxxAttribute()
    b.操作其他域对象
        方法:xxxAttribute(...,int scope);
        scope取值:
            APPLICATION_SCOPE 
            SESSION_SCOPE 
            REQUEST_SCOPE 
            PAGE_SCOPE 
    c.获取其他的内置对象
        getXxx()
        例如:getRequest():获取request内置对象
    d.便捷查找
        findAttribute(String key):
            依次从pagecontext,request,session,application四个域中(从小到大),查找相应的属性,
            若查找到了返回值,且结束该次查找;若查找不到,返回一个null
        
6.jsp的动作标签 ★★★
    <jsp:forward>:请求转发  相当于java中  request.getRequestDispatcher(..).forward(..);
        <jsp:forward page="内部路径"></jsp:forward>
    <jsp:include>:动态包含(运行结果)  生成多个java文件
        就是将被包含页面或者servlet的运行结果包含到当前页面中    
        <jsp:include page="内部路径"></jsp:include>

7.jsp的注释
    html注释 <!--  -->
        注释的内容只在页面上看不到  java代码和html源代码都有
    java注释 
        只在java代码中存在
    jsp注释 <%--  --%>
        只在jsp页面中存在,翻译成java文件之后就没有了

        
二、el(表达式语言)

1.简介
(1)jsp的内置表达式语言,从jsp2.0开始。用来替代<%=..%>
(2)作用
    a.获取域中数据 ★
    b.执行运算 ★
    c.获取常见的web对象
    d.调用java的方法
(3)格式:${el表达式}

2.作用    
(1)获取域中数据 ★★★
    a.获取简单数据
        格式:
            ${域Scope.域中属性名}(${域中的属性名}:依次从小到大)
        例如:
            ${pageScope|requestScope|sessionScope|applicationScope.属性名}
        以后经常使用:(便捷获取)
            ${域中属性名}:依次从pageContext,request,session,application中查找指定属性,
            若查找到返回值,结束该次查找;若查找不到,返回""
    b.获取复杂数据
        获取数组或者list中的数据
            ${域中的容器名称[index]}
        获取map中的数据
            ${域中的容器名称.键名}
    c.javabean导航
        格式:${域中javabean名称.bean属性}    
        javabean:java语言编写的一个可重用的组件,
                 狭义上来说就是我们编写的一个普通的java类 例如:User Person 
        javabean规范(了解)
            c1.必须是一个公共的具体的类  public class
            c2.提供私有的字段  private String id;//id称之为字段
            c3.提供公共访问字段的方法 get|set|is方法
                public String getId(){..}
                一旦有公共的方法之后,get|set|is之后的内容,将首字母小写,将这个东西称之为bean属性
                例如:id就是一个bean属性
            c4.提供一个无参的构造器
            c5.一般实现序列化接口  serializable    
    注:★
    若属性名中出现了"."|"+"|"-"等特殊符号,需要使用scope获取
        格式:
            ${域Scope["域中属性名"]}
        例如:
            ${requestScope["arr.age"] }    
(2)执行运算 ★★★
    四则运算 关系(> < ==) 逻辑(&& || !)
    注:
        +:只能进行加法运算,字符串形式数字可以进行加法运算.
        empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空
            ${empty 域中的对象名称}
            ${not empty 域中的对象名称}
        三元运算符
(3)获取常见的web对象
(4)调用java的方法
    
3.el的内置对象(了解) 11个
    pageScope,requestScope,sessionScope,applicationScope
    param,paramValues
    header,haederValues
    initParam
    cookie★
    pageContext★
    注:除了pagecontext其余对象获取的全是map集合
(1)el内置对象-和参数相关(了解)
        param
        paramValues
(2)el内置对象-和请求头相关(了解)
        header
        haederValues
(3)el内置对象-和全局初始化相关(了解)
        initParam
(4)el内置对象-cookie ★
    a.${cookie} 获取map{key=Cookie}
        例如:创建cookie
            Cookie c=new Cookie("username","tom");
        通过${cookie}获取相当于    
            {username=new Cookie("username","tom")}
        相当于map的key是cookie的键,map的value是当前cookie    
    b.若想获取名称username的cookie的value值(获取tom)
        格式:${cookie.cookie的key.value}
        例如:${cookie.username.value}--javabean导航
      注:java中Cookie的api
        getName():获取cookie的名称
        getValue():获取cookie的value值
        我们称name和value是cookie的bean属性
    c.使用cookie内置对象:
        ${cookie.给cookie起名字.value}    
        例如:获取jsessionid的值:${cookie.JSESSIONID.value}
(5)el内置对象-pagecontext ★    
    pageContext:获取不是map集合,相当于jsp的pageContext内置对象
    在jsp页面中动态获取项目名:
        ${pageContext.request.contextPath}


三、jstl(jsp标准标签库)

1.简介
    jsp标准的标签库语言,apache组织的,用来替代java脚本

2.使用步骤
(1)导入jar包 (jstl.jar和standard.jar)
(2)在页面上导入标签库
    格式:
        <%@taglib prefix="" uri=""%>
    例如:
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
3.jstl的分类
    core:核心类库 ★
    fmt:格式化|国际化
    xml:过时了
    sql:过时了
    函数库:很少使用
    
4.core(掌握)★
(1)c:if 判断 ★★★
    格式:
        <c:if test="${el表达式}">满足的时候输出的内容</c:if>
    例如:
        <c:if test="${3>4 }">
            3大于4
        </c:if>
        <c:if test="${3<=4 }">
            3不大于4
        </c:if>
(2)c:forEach 循环 ★★★
    格式1:
         <c:forEach begin="从哪里开始" end="到哪里结束" step="步长" var="给变量起个名字" varStatus="循环状态变量">
            ${i }--${vs.count }--${vs.current }<br>
         </c:forEach>
        varStatus:用来记录循环的状态
            常用的属性:
                count:记录次数
                current:当前遍历的内容
    例如:
        <c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
            ${i }--${vs.count }--${vs.current }<br>
        </c:forEach>
    格式2:
        <c:forEach items="${el获取域中的容器}" var="n">
            ${n }
        </c:forEach>
    例如:
        //遍历list
            <c:forEach items="${list }" var="n">
                ${n }
            </c:forEach>
        //遍历map
             <c:forEach items="${map }" var="en">
                ${en.key }-- ${en.value }<br/>
             </c:forEach>
(3)c:set 往域中设置值
    <c:set var="day" value="5"></c:set>
    <!-- 相当于pageContext.setAttribute("day",3) -->
(4)c:choose c:when c:otherwise 分支(类似于switch)


四、常见案例

1.案例一-展示所有商品
(1)需求:在页面中展示所有商品信息,不要使用jsp的脚本
(2)技术分析:jsp/el/jstl
(3)步骤分析
    a.数据库和表
        create database day12;
        use day12;
        create table product(
            id int primary key auto_increment,
            pname varchar(20),
            price double,
            pdesc varchar(20)
        );
        insert into product values (null,'电视机',3200,'液晶曲面大电视');
        insert into product values (null,'韭菜盒子',3,'味重请小心食用');
        insert into product values (null,'益达',10,'韭菜伴侣');
        insert into product values (null,'十三香',12,'守义牌');
    b.新建一个项目
        导入jar包:驱动 dbutils c3p0 jstl
        导入c3p0配置文件(记得修改jdbcUrl)和工具类
        实体类(Product):
            private int id;
            private String pname;
            private double price;
            private String pdesc;
    c.index.jsp中添加一个连接
        <a href="/day1201/findAll">展示所有商品</a>
    d.FindAllServlet
        调用ProductService.findAll() 返回一个集合 List<Product>
        将list放入request域中
        请求转发到product_list.jsp
    e.ProductService().findAll() 调用ProductDao().findAll()
    f.ProductDao().findAll()  使用beanListHandler()
        创建queryrunner
        编写sql
        执行sql
    g.在product_list.jsp展示所有商品
        使用c:forEach
        使用javabean导航获取里面的数据

2.案例二-重写登录案例
(1)需求:在页面上填写用户名和密码及验证码,点击提交,先校验验证码是否一致.
                若一致后再去找数据库.顺便记住用户名
(2)技术分析:表单 验证码 servlet request session cookie
(3)步骤分析
    a.数据库和表
        create table user(
            id int primary key auto_increment,
            username varchar(20),
            password varchar(20)
        );
    b.创建一个项目(复制day1201)
        包结构
        jar包
        工具类和配置文件
    c.表单 login.jsp(复制day01中resource中案例中的全部内容到WebContent中)
       (将index.html改成index.jsp;将login.htm改成login.jsp)
        修改login.jsp:
            给用户名和密码,验证码,记住用户名添加name属性
           (验证码修改图片路径,记住用户名添加value属性)
            修改表单的action属性
            添加method属性:method="post"
               (复制day10中的CodeServlet.java,修改web.xml)
    d.表单提交 LoginServlet
        获取验证码(从前台传过来和session中(修改CodeServlet.java))
            判断两个验证码是否一致
                若不一致:
                    填写错误信息,请求转发到login.jsp
                若一致:获取用户名和密码
                    调用UserService的getUserByUsernameAndPwd() 返回值:User user
                    判断user是否为空
                        若为空:填写错误信息,请求转发到login.jsp
                        若不为空:
                            继续判断是否勾选了记住用户名
                                若勾选:创建cookie 将用户名放入cookie写回浏览器
                            将user对象放入session中
                    页面重定向 index.jsp 展示 xxx:欢迎回来
      e.后续
      修改login.jsp:展示错误信息;给用户名添加value属性
      修改index.jsp


      
      
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值