JSP:JavaBean+EL函数+JSTL标签

一、JavaBean的概念(*****)
            1、JavaBean就是一个遵循特殊写法的普通类
            2、特殊写法
                    a、必须有默认的构造方法
                    b、所有字段定位私有的   
                    c、提供公有的getter或setter方法,属性
                    d、一般实现java.io.Serializable (session的持久化需要)             
            3、一定要符合Java的命名规范。           
            4、应用场景:(***)
                    在企业级开发中,JavaBean是用来传递数据的。

二、JavaWeb的开发模型(*****)
            开发原则:JSP页面中不能出现一行Java脚本<%%>和Java表达式<%=%>
                                      Java脚本:替代方案,自定义标签。
                                      Java表达式:替代方案,EL表达式。   Struts2框架:OGNL表达式。
                                      
            模型一:了解:JSP+JavaBean  : 易造成业务逻辑混乱,只适合业务逻辑简单的小程序;          
            模型二:开发实际应用: MVC+三层架构(Servlet+JSP+JavaBean)                         
                           程序中
                                      M:厨师  JavaBean:模型
                                      V:上的菜  JSP:显示页面
                                      C: 服务台 Servlet:控制器             
                           
                                                      

三、JSP中操作JavaBean的动作元素(***)
              jsp:useBean
                      作用:用于在指定域范围内查找指定名称的JavaBean对象,找到了就直接使用;
                                 没有找到,创建一个,并放到指定的域范围内。
                      属性:
                                 id:必须的。JavaBean的名称
                                 class:JavaBean的完整类名
                                 scope:域范围。默认是page范围。可选值:page request session application                        
                      注意:如果该标签有主体内容,只在创建新对象时才会执行。
                                 当scope为page或request时,每次都执行主体内容  ;  
                                 为session或appli时,只第一次执行主体内容
                                 
                     例: 
                     ----------------------------------------------------------------------------------------
                     <jsp:useBean id="p" class="cn.itcast.domain.Person" scope="page">凤姐</jsp:useBean>                            
                     <%=p.getName() %>
                     原理:
                      cn.itcast.domain.Person p = null;
                      synchronized{
                              p = (cn.itcast.domain.Person)pageContext.getAttribute("p",PageContext.PAGE_SCOPE);
                              if(p == null){
                                      p = new cn.itcast.domain.Person();
                                      pageContext.setAttribute("p",p,PageContext.PAGE_SCOPE);
                              }
                      }
                     ----------------------------------------------------------------------------------------
                                                                
              jsp:setProperty(必须先使用useBean)
                      作用:调用JavaBean的setter方法。还能自动类型转换,仅限基本类型
                      属性:
                                property:必须的。属性名称。比如setName,名称是name。可以使用通配符*。
                                                   使用前提是请求参数的名称与属性的名称完全一致。
                                name:必须的。哪个对象的,即jsp:useBean中的id的取值。
                                value:属性的取值。支持直接量;支持表达式(<%=表达式%>)。
                                param:请求参数名
                        
                      例:
                      ----------------------------------------------------------------------------------------
                       <!-- 利用value属性设置JavaBean的各种属性 -->
                       <% String s = "fuck"; %> 
                      <jsp:useBean  class="cn.itcast.domain.Person" scope="page" ></jsp:useBean>
                      <jsp:setProperty property="name" name="p" value="<%=s %>" />
                      <jsp:setProperty property="gender" name="p" value="male" />
                       <%=p.getName() %> <br/>
                       <%=p.getGender() %> <br/>
                      ----------------------------------------------------------------------------------------
                      <!-- 利用请求参数名设置JavaBean的各种属性 -->
                      <!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
                      <jsp:setProperty property="name" name="p" param="name"/>
                      <jsp:setProperty property="gender" name="p" param="gender"/>
                      <%=p.getName() %> <br/>
                      <%=p.getGender() %> <br/>
                      原理:
                                String name = request.getParameter("name");
                                p.setName(name);  
                      ----------------------------------------------------------------------------------------
                      <!-- 请求参数的名称和属性的名称一致时,可以使用通配符* -->
                      <!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
                       <jsp:setProperty property="*" name="p"/>
                       <%=p.getName() %> <br/>
                       <%=p.getGender() %> <br/>                                
                      ----------------------------------------------------------------------------------------
                        
              jsp:getProperty
                      作用:调用JavaBean的getter方法。
                      属性:
                                 property:必须的。属性的名称。比如getName,名称是name。
                                 name:必须的。哪个对象的, 即jsp:useBean中的id的取值。
                      例: 
                      ----------------------------------------------------------------------------------------
                      <!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
                      <jsp:setProperty property="*" name="p"/>
                      <jsp:getProperty property="gender" name="p"/>
                      ----------------------------------------------------------------------------------------
                                
四、EL表达式(*****)
              它只是JSP中的表达式,不是一种开发语言,为了替代JSP中的java表达式。
              基本语法:${EL表达式}
        4.1获取数据
                    EL表达式只能获取四大域中的数据(*****)。
                    EL表达式获取的对象如果是null,页面不会显示数据。因此,EL表达式中永远不会出现空指针异常
                    p.name:调用域中名称为p对象的getName方法,点运算符是用于获取属性的取值的。
                                  原理: 调用pageContext.findAttribute("p")方法
                                              依次从page request session(注意缓存) application域范围内找名称p对应的对象
                                                             
                    例:
                    ----------------------------------------------------------------------------------------------------------
                    <!-- 获取域中JavaBean的普通属性的方式 -->
                    <jsp:useBean id="p" class="cn.itcast.domain.Person" ></jsp:useBean>
                    法1:  <%=p.getName() %><br/>
                    法2: <jsp:getProperty property="name" name="p"/><br/>
                    法3:  ${p.name}      (选该方式)                                                           
                               ${p['name']}
                    ----------------------------------------------------------------------------------------------------------
                    <!-- 获取域中JavaBean的类属性的方式 -->
                    public class Person implements Serializable {
                            private Address address = new Address();
                            public Address getAddress() {    return address;   }
                            public void setAddress(Address address) {   this.address = address;   }
                    }
                    public class Address {
                            private String city = "上海";
                            public String getCity() {    return city;    }
                            public void setCity(String city) {   this.city = city;   }
                     }
                     
                     <jsp:useBean id="p" class="cn.itcast.domain.Person" ></jsp:useBean>
                     ${p.address.city}
                     注:  要考虑清楚.后为什么元素   p.address == new Address();  p.address.city == 上海;
                    ----------------------------------------------------------------------------------------------------------
                    <!-- 获取数组中指定的元素 -->
                    String[] str = {"a","b","c"};
                    // 注意:要将数组弄到域对象中才能被EL表达式操作 
                    pageContext.setAttribute("str",str);
                    ${str[1]}
                    ----------------------------------------------------------------------------------------------------------
                    <!-- 获取List集合中指定的元素 -->
                    List list = new ArrayList();
                    list.add("aa");
                    list.add("bb");
                    list.add("cc");
                    pageContext.setAttribute("list",list);
                    ${list[2]}
                    ----------------------------------------------------------------------------------------------------------
                    <!-- 获取Map集合中指定的元素 -->
                    Map map1 = new LinkedHashMap();
                    map1.put("a","aaa");
                    map1.put("b","bbb");
                    map1.put("c","ccc");
                    pageContext.setAttribute("mm1",map1);
                    ${mm1.b}
                    ----------------------------------------------------------------------------------------------------------
                    Map map2 = new LinkedHashMap();
                    // 注:  若键为数字,必须换为字符串 因为JSP没有自动装/拆箱
                    map2.put("1","aaa");
                    map2.put("2","bbb");
                    map2.put("3","ccc");
                    pageContext.setAttribute("mm2",map2);
                    ${mm2["3"]}
                    ----------------------------------------------------------------------------------------------------------
                    Map map3 = new LinkedHashMap();
                    map3.put("a", new Person("谢霆锋","男", true));
                    map3.put("b",new Person("张卫健","男", true));
                    map3.put("c",new Person("刘德华","男", false));
                    pageContext.setAttribute("mm3",map3);
                    ${mm3["a"].name }<br/>
                    ${mm3.c.name}
                    ----------------------------------------------------------------------------------------------------------                     
                        
          
        4.2数学逻辑运算:
                    运算符:
                                  empty运算符:如果判断的对象是null或者空字符串,都返回true。
                                                           对于集合,即使集合对象本身不是null,没有任何元素,也返回true。                                       
                                  .运算符 和  []运算符:          
                                          .运算符能做的,[]也能做。[]能做的,.不一定能做。
                                                  如${p.name}===${p['name']}==${p["name"]}           
                                           []运算符优秀在可以取不符合Java命名规范的东东。   
                                                  如: ${headerValues["accept-encoding"][0]} 
                     注:  EL表达式不支持字符串连接操作。
                    
                    
                                      
                    例:
                    ----------------------------------------------------------------------------------------------------------
                    ${s}<br/>                       // 什么都没有
                    ${empty ""}<br/>         // true
                    ${empty s}<br/>           // true
                    ----------------------------------------------------------------------------------------------------------
                    List list = new ArrayList();
                    // list.add("aaa");
                    pageContext.setAttribute("list",list);
                    ${empty list}                 // true   若加入元素后,为false
                    ----------------------------------------------------------------------------------------------------------
                    //session.setAttribute("user","谢霆锋");
                    ${empty user?"请登录":"欢迎您:"}${user}      
                    ----------------------------------------------------------------------------------------------------------
                    // 0 女  1 男
                    pageContext.setAttribute("gender","1");
                    ${gender=="0"?"女":"男"}
                    ----------------------------------------------------------------------------------------------------------
          
        4.3获取JSP的内置对象(11大EL内置对象):
                    难点,不要与JSP的内置对象和范围名称搞混
                    11大EL隐式对象中,其中pageContext是表示自身对象外,其余都是表示的Map结构
                    
                    
                   
                    
                    例:
                    ------------------------------------------------------------------------------------------------------------------------------
                    PageContext内置对象
                    ${pageContext}<br/>
                    <!-- 在EL中得到HttpServletRequest对象 -->
                    ${pageContext.request }<br/>
                    <!-- 在EL中获取当前应用的名称 -->
                    ${pageContext.request.contextPath}<br/>
                    <!-- 获取HttpServletResponse采用的编码 -->
                    ${pageContext.response.characterEncoding}<br/>
                    ------------------------------------------------------------------------------------------------------------------------------
                    PageScope内置对象 
                    <%
                    pageContext.setAttribute("a","aa");
                    pageContext.setAttribute("p1",new Person("刘谦","男",false));
                    ${pageScope.a}<br/>
                    %>
                    ${pageScope.p1.name}<br/>
                    ------------------------------------------------------------------------------------------------------------------------------
                    RequestScope内置对象
                    <%
                    pageContext.setAttribute("p2",new Person("刘非","女",false),PageContext.REQUEST_SCOPE);  
                     %>
                    ${requestScope.p2.gender}
                    ------------------------------------------------------------------------------------------------------------------------------
                    sessionScope内置对象
                    <% 
                    pageContext.setAttribute("user","abc");                  
                    Person person = new Person("刘亦菲","女",true);
                    session.setAttribute("user",person);
                    %>
                    ${empty sessionScope.user?"请登录":"欢迎您:"}${sessionScope.user.name}   // 注: 要指定user的查找范围
                    ------------------------------------------------------------------------------------------------------------------------------
                    applicationScope内置对象如上
                    ------------------------------------------------------------------------------------------------------------------------------
                    param内置对象   注:  参数重名,则值显示第一个参数和值;
                    // 获取get方式提交的参数值
                          <!-- 访问:  http://localhost:8080/day10/4.jsp?username=aaa&username=bbb&password=123 -->
                          ${param}<br/>                                                                       // {username=aaa  password=123}
                          ${param.username}<br/>                                                  //  aaa
                          ${param.username} == ${param.password}<br/>       //  aaa=123
                   
                   // 获取post方式提交的参数值
                           <form  action="2.jsp" method="post">
                                  <textarea rows="6" cols="8" name="tt">/<textarea><br/><br/>
                                   <input type="submit" value="提交">
                           </form>
                           ${param.tt}
                    ------------------------------------------------------------------------------------------------------------------------------
                    paramValues内置对象
                    <!-- 访问:  http://localhost:8080/day10/4.jsp?username=aaa&username=bbb&password=123 -->
                    ${paramValues}<br/>                                            // {username=Java.lang.String@ab56bc,password=Java.lang.String@ab56bc}
                    ${paramValues.username[0]}<br/>                    //  aaa
                    ${paramValues.username[1]}<br/>                    //  bbb
                    ${paramValues.password[0]}<br/>                    //   123 
                    ------------------------------------------------------------------------------------------------------------------------------
                    header内置对象
                    ${header["accept-encoding"]}                              // 注: 必须用【】运算符
                    ------------------------------------------------------------------------------------------------------------------------------
                    headerValues内置对象
                    ${headerValues["accept-encoding"][0]} 
                    ------------------------------------------------------------------------------------------------------------------------------
                    cookie内置对象
                    <!-- 取JSESSIONID这个cookie的名称 -->
                    ${cookie["JSESSIONID"].name}<br/>
                    <!-- 取JSESSIONID这个cookie的值 -->
                    ${cookie.JSESSIONID.value}<br/>                         
                    // 注: cookie.JSESSIONID为cookie对象本身,为一个map, cookie.JSESSIONID.value为map的值
                    ------------------------------------------------------------------------------------------------------------------------------
                    initParam内置对象
                    <context-param>
                            <param-name>encoding</param-name>
                            <param-value>UTF-8</param-value>
                    </context-param>
                    ${initParam.encoding}
                    ------------------------------------------------------------------------------------------------------------------------------
        
        4.4调用普通类的静态方法(自定义EL函数)  (有问题???)
                    编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤):
                      a、编写一个普通的java类,提供一个静态方法
                                    public class FunctionDemo {
                                        public static String toUpperCase(String str){
                                                return str.toUpperCase();
                                        }
                                    }
                      b、在JavaWeb应用的WEB-INF目录下建立一个扩展名是tld(taglib definition)的XML文件(参考Tomcat中的示例)。内容如下:
                                    <?xml version="1.0" encoding="UTF-8"?>
                                    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
                                      version="2.0">
                                      <tlib-version>1.0</tlib-version>
                                      <short-name>myfn</short-name>
                                      <uri>http://www.itcast.cn/myfn</uri>
                                      <function><!-- 定义函数 -->
                                              <name>toUppercase</name>
                                              <function-class>cn.itcast.el.FunctionDemo</function-class>
                                              <function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>
                                      </function>
                                    </taglib>
                      c、(可选步骤)前提是把tld文件放到了WEB-INF目录下。
                            告知应用,tld文件和tld中的uri的对应。修改web.xml,增加以下内容:
                                    <jsp-config>
                                            <taglib>
                                                    <taglib-uri>http://www.itcast.cn/myfn</taglib-uri>
                                                    <taglib-location>/WEB-INF/myfn.tld</taglib-location>
                                            </taglib>
                                      </jsp-config>
                      d、在JSP中使用
                                    用taglib指令,引入自定义的EL函数库
                                    <%@ taglib uri="http://www.itcast.cn/myfn" prefix="myfn"%>
                                    <%
                                    pageContext.setAttribute("p","abcdefg");
                                    %>  
                                    ${myfn:toUppercase(p)}                         // 为何不管用???
                
五、SUN提供的标准EL函数库
                    JSTL标准标签:(Jsp Standard Tag Libary)
                           Core:   核心
                           Fmt:  国际化
                           SQL:  数据库操作
                           XML: xml操作
                           fn:     EL函数库
                      
                   需要导入JSTL的jar包:standard.jar和jstl.jar                    
                   参考 第18章 JSTL Functions标签库
                   注: 没有提示,需要使用某个函数时要参考文档;若没有,则自定义函数
                   
                   例:
                   <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
                    ${fn:contains("asdf","asd") }
                    
                   <%    
                        // html标签的转义   直接输出纯文本
                        pageContext.setAttribute("h","<h1>haha</h1>");
                   %>
                   ${fn:escapeXml(h) }<br/><br/>


六、JSTL中的核心标签库(替换掉JSP中的Java脚本)
              需要导入JSTL的jar包:standard.jar和jstl.jar       
              需要引入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
              
              c:if
                      作用:判断是否为true,如果为true,那么标签的主体内容就会显示。
                      属性:
                                test:必须的。要求必须是boolean的。支持表达式(EL或Java表达式)
                                var:保存test运算结果的变量
                                scope: 保存的域范围。默认是page
                                
                      例:
                              -----------------------------------------------------------------------------
                              <%
                              session.setAttribute("user","谢霆锋");
                              %>
                              <c:if test="${sessionScope.user == null}">
                                        对不起!请登录
                              </c:if>
                              <c:if test="${sessionScope.user != null}">
                                        欢迎您:${sessionScope.user }
                              </c:if>
                              -----------------------------------------------------------------------------
                        
              c:forEach
                      遍历:数组、List、Set、Map
                      属性:
                        items:要遍历的目标对象。支持表达式
                        var:    变量名。指向当前遍历的集合中的一个元素
                        begin:开始的索引(含),从0开始
                        end:   结束的索引(含)
                        step:  步长。默认是1
                        varStatus:取一个名字,引用了一个对象。
                        varStatus对象有以下方法:
                              int getIndex():当前记录的索引号。从0开始
                              int getCount():当前记录的顺序。从1开始
                              boolean isFirst():是否是第一条记录
                              boolean isLast():是否是最后一条记录
                              
                        例:
                        -----------------------------------------------------------------------------
                        遍历数组
                        <%
                        String str[] = {"a","b","c"};
                        pageContext.setAttribute("str",str);
                        %>
                        <c:forEach items="${str}" var="s">
                                ${s}<br/>                           
                        </c:forEach>                                                                            
                        -----------------------------------------------------------------------------
                        遍历list集合
                        List list = new ArrayList();
                        list.add("aa");
                        list.add("bb");
                        pageContext.setAttribute("list",list);
                        %>
                        <c:forEach items="${list}" var="e">
                                ${e}<br/>
                        </c:forEach>
                        -----------------------------------------------------------------------------
                        遍历set集合
                        <%
                        Set set = new HashSet();
                        set.add("aaa");
                        set.add("bbb");
                        set.add("ccc");
                        pageContext.setAttribute("set",set);
                        %>
                        <c:forEach items="${set}" var="e">
                                ${e}<br/>
                        </c:forEach>
                        -----------------------------------------------------------------------------
                        遍历map集合
                        <%
                        Map map = new LinkedHashMap();
                        map.put("a","aaaa");
                        map.put("b","bbbb");
                        map.put("1","1111");
                        pageContext.setAttribute("map",map);
                        %>
                        <c:forEach items="${map}" var="me">
                                ${me.key} = ${me.value }<br/>
                        </c:forEach>
                        -----------------------------------------------------------------------------
                        <c:forEach begin="1" end="5" var="s">
                          ${s}<br/>            // 1,2,3,4,5
                        </c:forEach>
                        <%
                        String s1[] = {"a","b","c","d","e","f"};
                        pageContext.setAttribute("s1",s1);
                        %>
                        <c:forEach items="${s1}" var="s" begin="1" end="4" >
                                ${s}<br/>       // b,c,d,e
                        </c:forEach>
                        <c:forEach items="${s1}" step="2" >
                                ${s}<br/>       // a,c,e
                        </c:forEach>
                        <c:forEach items="${s1}" var="s" begin="1" end="4" step="2">
                                ${s}<br/>       // b,d,e
                        </c:forEach>
                        -----------------------------------------------------------------------------
                        应用:
                        <%
                        List<Person> ps = new ArrayList<Person>();
                        ps.add(new Person("谢霆锋","1",true));
                        ps.add(new Person("张卫健","1",true));
                        ps.add(new Person("刘德华","1",true));
                        ps.add(new Person("高圆圆","0",false));
                        ps.add(new Person("baby","0",false));
                        pageContext.setAttribute("ps",ps);
                        %>
                        <table border="1" width="60%">
                                <tr>
                                        <th>索引</th>
                                        <th>顺序</th>
                                        <th>第一个</th>
                                        <th>最后一个</th>
                                        <th>姓名</th>
                                        <th>性别</th>
                                        <th>婚姻</th>
                                </tr>
                                <c:forEach items="${ps}" var="p" varStatus="vs">
                                        <tr bgcolor="${vs.index%2==0?'#CFCFCF':'#4D88A6' }">
                                                <td>${vs.index}</td>
                                                <td>${vs.count}</td>
                                                <td>${vs.first}</td>
                                                <td>${vs.last}</td>
                                                <td>${p.name}</td>
                                                <td>${p.gender=="1"?"男":"女"}</td>
                                                <td>${p.married?"已婚":"未婚"}</td>
                                        </tr>
                                </c:forEach>
                        </table>
                        -----------------------------------------------------------------------------
                        

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

忧桑的小猿猿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值