全网最详细_jsp01(跟着宝哥学java:jsp)jsp组成、jsp原理、jsp内置对象、el表达式、jstl标签库

1 概念

jsp:java server page java服务器端页面
    动态资源:请求jsp时 需要应用服务器把jsp解析为静态资源 任何才能响应
    javaweb的十三种技术规范之一:实现动态页面
    原理:每个jsp对应一个servlet 通过servlet的response的输出流 拼凑一个与jsp相同效果的静态页面html

2 案例

2.1 统一设置jsp的编码集

在这里插入图片描述

2.2 案例1

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><!-- 组成1:jsp标签 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>第一个jsp</title>
</head>
<body>
     <h1>jsp组成2:html代码</h1><!-- 组成2:html代码 -->
     <!-- 组成3:java片段 -->
     1+1=2<br/>
     1+1=<%=1+1%><!-- 通过java计算式子的值后 显示到页面 -->
     <!-- html注释: -->
     <%-- jsp注释:--%>
     
     <h1>jsp中java片段的格式1:<% %>在定义servlet的service方法体</h1>
     <% 
        //java代码:写java语句
        int a=1;int b=3;
        System.out.println(a+"+"+b+"="+(a+b));//控制台输出
        //通过rssponse的输出流往页面打印
        out.println(a+"+"+b+"="+(a+b)+"<br/>");//页面输出
        out.println(hehe());//调用成员方法
        out.println(this.aa+"+"+this.bb+"="+(this.aa+this.bb)+"<br/>");//调用成员变量
        System.out.println(application.getRealPath("/"));
     %>
     
     <h1>jsp中java片段的格式2:<%! %> 在定义servlet的成员</h1>
     <%!
        //java代码:写类的成员
        {
    	  System.out.println("构造代码块");
        }
	     static{
	    	 System.out.println("静态构造代码块");
	     }
	     int aa=11;//成员变量
	     int bb=22;//成员变量
	     public String hehe(){
	    	 return this.aa+"+"+this.bb+"==="+(this.aa+this.bb)+"<br/>";
	     }
     %>
     
     <h1>jsp中java片段的格式3:<%=1%> 页面输出:完全等价于out.println(1);</h1>
     2*3=<%=2*3%><br/>
     2*3=<% out.println(2*3);%><br/>
</body>
</html>

2.3 案例2:深入理解jsp其实是一个servlet这句话

  • 定义一个简单的jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- html注释 -->
    <%--jsp注释 --%>
    <%   //java片段1:定义service的方法体
        int a=1,b=2;
        out.println(a+"+"+b+"="+(a+b)+"<br/>");
    %>
    <%!  //java片段2:定义servlet类的成员
         int c=2,d=3;
         public int add(){return c+d;}
    %>
    <!--java片段3: <%=1%> 页面输出:完全等价于out.println(1)-->
    c+d=<%=c+d%><br/>

</body>
</html>
  • 获取其对应的servlet
        System.out.println(application.getRealPath("/"));

在这里插入图片描述

  • 拿此jsp和servlet做比较
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3 jsp的指令标签

<%--jsp指令标签:格式:<%@ xxx 属性名=属性值 %>
jsp指令标签:设置整个页面的相关信息
jsp指令标签:<%@ page %>   设置页面常见属性
jsp指令标签:<%@ taglib %> 设置页面要引入的第三方标签库
jsp指令标签:<%@ include %> 静态包含:把两个页面合并
--%>

3.1 page指令标签

<%--
    jsp指令标签:<%@ page %>   设置页面常见属性
一个页面中可以有多个相同的执行标签
--%>
<%@ page autoFlush="true" %>                      <!-- 是否自动刷新reponse的输出流 -->
<%@ page buffer="8kb" %>                          <!-- 设置reponse的输出流的缓冲区大小 -->
<%@ page contentType="text/html; charset=UTF-8" %><!--重点:设置响应文件的格式 并指定文件的编码集 -->
<%@ page errorPage="error.jsp"  %>                <!--重点:指定其对应的错误页面 -->
<%@ page isErrorPage="false" %>                   <!--重点:是否为错误页面-->
<%@ page extends="" %>                            <!--设置对应的servlet的父类 -->
<%@page import="java.util.Date"%>                 <!--引入其他包的类 -->
<%@ page info="" %>                               <!--对当前jsp对应的servlet的一些信息的设置 版本+作者+时间 -->
<%@ page isELIgnored="false" %>                   <!--是否屏蔽el表达式 -->
<%@ page isThreadSafe="true" %>                   <!--是否线程安全 -->
<%@ page language="java" %>                       <!--片段使用的语言 -->
<%@ page pageEncoding="UTF-8"  %>                 <!--重点:设置响应体的编码集:完全等价于response.setCharacterEncoding("UTF-8") -->
<%@ page session="true" %>                        <!--是否可用session -->
<%@ page trimDirectiveWhitespaces="false" %>      <!--是否去除两边的空格 -->

3.2 include指令标签

<h1>include指令标签</h1>
<%--
    include指令标签:用于静态包含:把指定的页面的代码合并到当前页面中
    --%>
<%
int a=11,b=13;
out.println(a+"+"+b+"="+(a+b)+"<br/>");
%>
<%@ include file="test.txt" %>
  • test.txt
<h1>test.txt</h1>
<%
out.println(a+"-"+b+"="+(a-b)+"<br/>");
%>

3.3 taglib指令标签

<h1>taglib指令标签</h1>
<%--taglib指令标签:用于引入第三方标签库 --%>
<%--<%@ taglib prefix="" uri="" %>   prefix指定标签的前缀 uri指定标签库的路径--%>

4 jsp的动作标签

动作标签:jsp页面执行的某些操作

4.1 forward动作标签

<h1>jsp动作标签1:forward:请求转发</h1>
<%--jsp动作标签格式:<jsp:xxx 属性名=属性值></jsp:xxx> --%>
<jsp:forward page="/jsp/test1.jsp"></jsp:forward>
<%
//完全等价于:
//request.getRequestDispatcher("/jsp/test1.jsp").forward(request, response);
%>

4.2 include动作标签

<h1>jsp动作标签2:include:请求包含--动态包含</h1>
<jsp:include page="/jsp/test1.jsp" flush="true">
    <!--jsp:param设置请求参数  -->
    <jsp:param name="aa" value="aa_value"/>
</jsp:include>
<%
//请求包含:当前资源和被包含的资源 共同来处理请求
//完全等价于:
//request.getRequestDispatcher("/jsp/test1.jsp").include(request, response);
%>

4.3 静态包含和动态包含的区别

1:使用的标签不同:
    静态包含使用的是jsp的include指令标签:<%@ include file="test01.jsp" %>
    动态包含使用的是jsp的include动作标签:<jsp:include page="/jsp/test1.jsp"/>
2: 被包含的资源是否会被解析
    静态包含text1.jsp时  只是把text1.jsp的代码合并到当前jsp  不会对text1.jsp进行解析为servlet:
    动态包含text1.jsp时  当前jsp和text1.jsp都会被解析为servlet 两个servlet对应两个输出流 共同来响应一个页面
3:包含的文件格式不同
     静态包含的文件格式 可以任意
     动态包含的文件格式必须是jsp/servlet

4.4 useBean动作标签

<h1>jsp动作标签3:useBean:指定的域对象中设置域属性</h1>
<jsp:useBean id="s1" class="com.zhiyou100_04.jsp.Student" scope="request"/>
<%
//完全等价于
request.setAttribute("s2", new Student());
%>
<%=request.getAttribute("s1") %><br/>
<%=request.getAttribute("s2") %><br/>


<jsp:setProperty property="sid" name="s1" value="11"/><!-- 设置usebean对象的属性的值 -->
<jsp:setProperty property="sname" name="s1" value="韩梅梅"/>
<jsp:setProperty property="sex" name="s1" value="男"/>
<jsp:setProperty property="score" name="s1" value="11.1"/>
<%=request.getAttribute("s1") %><br/>
<%
//完全等价于
((Student)request.getAttribute("s1")).setSid(12);
%>
<%=request.getAttribute("s1") %><br/>

<jsp:getProperty property="sid" name="s1"/><br/><!-- 获取usebean对象的属性的值 -->
<jsp:getProperty property="sname" name="s1"/><br/>
<jsp:getProperty property="sex" name="s1"/><br/>
<%
//完全等价于
out.println(((Student)request.getAttribute("s1")).getSid());
%>
<br/>

注意

所有的jsp动作标签:都是在用标签来替代java片段::目的 降低jsp的学习成本  消除jsp页面中的java代码 提高jsp的可读性和开发效率

5 jsp学习重点

  • jsp组成:java片段三种形式的作用
  • jsp的原理:每个jsp都被解析为一个servlet 提高servlet的输出流拼凑一个和jsp页面效果完全相同的html页面
  • jsp标签:jsp的指令标签和动作标签
  • jsp四大域对象:在指定范围内实现数据共享
  • jsp的九大内置对象
  • el表达式
  • el的十一大内置对象
  • jstl标签库

6 jsp的四大域对象

明确1:域对象:在指定范围内实现数据共享
明确2:域对象都有四个方法:setAttribute getAttribute removeAttribute getAttributeNames
明确3:servlet有三大域:request请求对象---在同一个请求链(请求转发和请求包含的资源)之间实现数据共享
                     session回话对象---在同一个回话(同一个浏览器发出的几个连续的请求)的所有请求之间实现数据共享
                     servletContext上下文域对象---同一个项目的所有请求之间实现数据共享
     jsp的四大域:     pageContext页面对象-----在当前页面和引入的标签库之间实现数据共享
                     request请求对象---在同一个请求链(请求转发和请求包含的资源)之间实现数据共享
                     session回话对象---在同一个回话(同一个浏览器发出的几个连续的请求)的所有请求之间实现数据共享
                     application上下文域对象---同一个项目的所有请求之间实现数据共享     
<h1>jsp的域对象</h1>
<%
//servlet的三大域对象
request.setAttribute("aa1", "aa_request11");
session.setAttribute("bb1", "bb_session11");
request.getServletContext().setAttribute("cc1", "cc_servletContext11");

//jsp的四大域对象:上面的三个域+pageContext
pageContext.setAttribute("dd1", "dd_pageContext11");//在当前页面之间实现数据共享
%>

<jsp:forward page="test2.jsp"/>
  • test2.jsp
<h1>获取servlet域属性</h1>
aa1=<%=request.getAttribute("aa1") %><br/>
bb1=<%=session.getAttribute("bb1") %><br/>
cc1=<%=request.getServletContext().getAttribute("cc1") %><br/>
dd1=<%=pageContext.getAttribute("dd1") %><br/>
<%
//jsp的四大域对象:
pageContext.setAttribute("dd1", "dd_pageContext11_new");
%>
dd1=<%=pageContext.getAttribute("dd1") %><br/>

7 jsp的九大内置对象

7.1 概念

jsp被解析成一个servlet:
jsp的九大内置对象 就是对应的servlet的service方法中可以直接使用的九个对象--不用创建即可使用
在jsp对应的servlet中即可找到

7.2 九大内置对象功能描述

    jsp被解析成一个servlet:
	jsp的九大内置对象 就是对应的servlet的service方法中可以直接使用的九个对象--不用创建即可使用
	在jsp对应的servlet中即可找到
	request:HttpServletRequest 请求对象
	        作用:1 获取请求参数 2获取请求头 3 请求转发+请求包含 4 作为域对象 5 其他功能
	response:HttpServletResponse 响应对象
	        作用:1 设置响应头 2 设置响应体 3 重定向 4 其他功能
	session:HttpSession 回话对象
	         作用:session域对象:在同一个回话中实现数据共享 
	application:ServletContext 上下文对象
	         作用:1ServletContext域对象  2 其他功能           
	config:ServletConfig 配置对象
	        作用:  获取当前资源在web.xml中的配置信息
	out:PrintWrite  响应对象对象的字符输出流
	       作用:拼凑页面
    page: Object    当前jsp页面 /this
    exception:Exception  异常对象::注意 只有设置isErrorPage=true的页面才有此对象
    pageContext:PageContext pageContext对象
                作用 1 作为page域对象  2 代理其他域对象 3 全域查找  4 获取其他八个内置对象

7.3 九大内置对象测试代码:前八个

  
     <h1>内置对象1:request对象</h1>
          获取请求参数parameter aa=<%=request.getParameter("aa") %><br/>
          获取请求头header User-Agent=<%=request.getHeader("User-Agent") %><br/>
     <%
        //请求转发+请求包含
        //request.getRequestDispatcher("/jsp/test2.jsp").forward(request, response);
        //request.getRequestDispatcher("/jsp/test2.jsp").include(request, response);
        //作为域对象
        request.setAttribute("attr1", "attr1_request");
     %>
           获取request域属性attribute  attr1=<%=request.getAttribute("attr1") %><br/>
          获取session:  <%=session==request.getSession() %>    <br/>
          
     <h1>内置对象2:resposne对象</h1>
     <%
         //设置响应头
         response.setHeader("cc", "cc_header");
         //设置响应体
         response.getWriter().print("ehehh11111<br/>");
         //重定向
         //response.sendRedirect("/java43_01_web/jsp/test2.jsp");
         //其他功能
         response.addCookie(new Cookie("c1","c111"));
     %>
     
     <h1>内置对象3:out对象:响应的字符输出流</h1>
     <%
         response.getWriter().print("ehehh2222<br/>");
         out.print("ehehh3333<br/>");
     %>
     <%="ehehh4444444<br/>" %>
     
     <h1>内置对象4:session对象:回话对象</h1>
          获取sesdionid=<%=session.getId() %><br/>
     <%session.setAttribute("s1", "s1_value");%>
          获取session域属性s1=<%=session.getAttribute("s1") %><br/>
          
     <h1>内置对象5:application对象:上下文对象</h1> 
     <%application.setAttribute("a1", "a1_value");%>
          获取application域属性a1=<%=application.getAttribute("a1") %><br/>
         其他功能:获取项目路径 <%=application.getContextPath() %><br/>
         其他功能:获取资源的真实路径 <%=application.getRealPath("/1.html") %><br/>  
         
     <h1>内置对象6:config对象:配置对象</h1>
          获取当前servlet的配置信息: servlet-name=<%=config.getServletName() %><br/>
          
    <h1>内置对象7:page对象:当前页面</h1>
    this==page:<%=this==page %><br/>
    <h1>内置对象8:error对象:异常  注意 只有设置isErrorPage的页面才有此对象</h1>

7.4 九大内置对象:PageContext

    <h1>内置对象9:pageContext对象:</h1>
        作为pageContext域对象在 当前页面和标签之间实现数据共享:<br/>
    <% pageContext.setAttribute("p1", "p1_value"); %> 
       获取 pageContext域属性 p1=<%=pageContext.getAttribute("p1") %><br/>
    
    <%
        //pageContext.setAttribute("a1", "a1_value_pageContext");
        //session.setAttribute("a1", "a1_value_session");
	    //request.setAttribute("a1", "a1_value_request");
	    application.setAttribute("a1", "a1_value_application");
	    pageContext.setAttribute("a11", "a11_value_pageContext");
	    request.setAttribute("a12", "a12_value_request");
	    session.setAttribute("a13", "a13_value_session");
	    application.setAttribute("a14", "a14_value_application");
    %>   
       全域查找:a11=<%=pageContext.findAttribute("a11") %><br/> 
       全域查找:a12=<%=pageContext.findAttribute("a12") %><br/>
       全域查找:a13=<%=pageContext.findAttribute("a13") %><br/>
       全域查找:a14=<%=pageContext.findAttribute("a14") %><br/>
       全域查找:从小到大找::a1=<%=pageContext.findAttribute("a1") %><br/>
       代理其他域:<br/><%pageContext.setAttribute("a111", "a111_request", PageContext.REQUEST_SCOPE);%>
       获取request域属性a111=<%=request.getAttribute("a111") %><br/>  
       获取request域属性a111=<%=pageContext.getAttribute("a111", PageContext.REQUEST_SCOPE)%><br/>
       获取其他八个内置对象:<%=request==pageContext.getRequest() %><br/>
       获取其他八个内置对象:<%=response==pageContext.getResponse() %><br/>
       获取其他八个内置对象:<%=out==pageContext.getOut() %><br/>
       获取其他八个内置对象:<%=session==pageContext.getSession() %><br/>
       获取其他八个内置对象:<%=application==pageContext.getServletContext() %><br/>
       获取其他八个内置对象:<%=config==pageContext.getServletConfig() %><br/>
       获取其他八个内置对象:<%=page==pageContext.getPage() %><br/>        

7.5 jsp和servlet的分工

jsp一般用于获取数据+数据展示
servlet一般用于业务逻辑的处理

7.6 九九乘法表

<h1>拼凑99乘法表</h1> 
<%
out.print("<table>");
for(int i=1;i<=9;i++){
    out.print("<tr>");
    for(int j=1;j<=i;j++){
        out.print("<td>"+i+"*"+j+"="+(i*j)+"</td>");
    }
    out.print("</tr>");
}
out.print("</table>");
%> 
<h1>拼凑99乘法表</h1> 
<table>
    <%
    for(int i=1;i<=9;i++){
        %>
    <tr>
        <% 
        for(int j=1;j<=i;j++){%>
        <td><%=i+"*"+j+"="+(i*j)%></td>
        <%
        }
        %>
    </tr>
    <% 
    }
    %>
</table>         

8 el表达式

8.1 概念

el:Expression Language 表达式语言
格式:${式子}  等价于 <%=式子 %> 在页面输出数据

8.2 基本操作

<%--
        el:Expression Language 表达式语言
        格式:${式子}  等价于 <%=式子 %> 在页面输出数据
        目的:替换     <%=式子 %>java片段  
        注意:el表达式操作的变量只能是域属性               
--%>
<%
request.setAttribute("a", "a_request");
session.setAttribute("a", "a_session");
pageContext.setAttribute("a", "a_pageContext");
application.setAttribute("a", "a_application");
request.setAttribute("a1", "a1_request");
session.setAttribute("a2", "a2_session");
pageContext.setAttribute("a3", "a3_pageContext");
application.setAttribute("a4", "a4_application");
%>
<h1>获取域属性:通过内置对象out</h1>
request域属性a=<%out.println(request.getAttribute("a"));%><br/>
session域属性a=<%out.println(session.getAttribute("a"));%><br/>
application域属性a=<%out.println(application.getAttribute("a"));%><br/>
pageContext域属性a=<%out.println(pageContext.getAttribute("a"));%><br/>
<h1>获取域属性:通过java片段<%=1 %></h1>
request域属性a=<%=request.getAttribute("a")%><br/>
session域属性a=<%=session.getAttribute("a")%><br/>
application域属性a=<%=application.getAttribute("a")%><br/>
pageContext域属性a=<%=pageContext.getAttribute("a")%><br/>
<h1>获取域属性:通过el表达式</h1>
request域属性a=${requestScope.a}<br/>
session域属性a=${sessionScope.a}<br/>
application域属性a=${applicationScope.a}<br/>
pageContext域属性a=${pageScope.a}<br/>


<%
int aa=1;
%>
aa=<%=aa %><br/>
aa=<%out.println(aa); %><br/>
aa=${aa}<br/><!-- el表达式获取不到局部变量aa  只能获取域属性 -->

8.3 el作用

<%
int aa=1;
%>
aa=<%=aa %><br/>
aa=<%out.println(aa); %><br/>
aa=${aa}<br/><!-- el表达式获取不到局部变量aa  只能获取域属性 -->

<h1>el的作用</h1>
<h2>作用1:获取域属性</h2>
<h2>作用2: 运算</h2>
1+1=${1+1}<br/>
5/2=${5/2}<br/>

<h2>作用3: 对象导航ognl</h2>
<!-- 在pageContext域中添加一个域属性  属性名为stu1 值为一个student对象 -->
<jsp:useBean id="stu1" class="com.zhiyou100_04.jsp.Student" scope="page"/> 
<jsp:setProperty property="sid" name="stu1" value="11"/>
<jsp:setProperty property="sname" name="stu1" value="韩梅梅"/>
<jsp:setProperty property="sex" name="stu1" value="女"/>
<jsp:setProperty property="score" name="stu1" value="11.1"/>
<%
Student stu2=new Student();
stu2.setSid(22);stu2.setSname("憨憨");stu2.setSex("男");stu2.setScore(14f);
pageContext.setAttribute("stu2", stu2);
%>
<%--Object Graph Navigation Language:ognl
    操作对象时:obj.xxx 在对象obj的getXxx方法
    --%>
获取学生stu1:${pageScope.stu1}<br/>
获取学生stu2:${pageScope.stu2}<br/>
获取学生的详细详细:sid=${pageScope.stu1.sid} | sname=${pageScope.stu1.sname} | sex=${pageScope.stu1.sex} | score=${pageScope.stu1.score}<br/> 
获取学生的详细详细: score=${pageScope.stu1.score}<br/> 
获取学生的详细详细: show=${pageScope.stu1.show}<br/>  

<h2>作用4: 全域查找:从小到大找</h2>
获取学生stu1:${stu1}<br/>
a=${a}<br/>
a=<%=pageContext.findAttribute("a") %><br/>

<h2>作用5: 操作集合和数组</h2>
<%
pageContext.setAttribute("array", new int[]{1,3,4,5,6,7,8,9,2}); 
List<String> list=new ArrayList<String>();
list.add("abc1");list.add("abc2");list.add("abc3");
pageContext.setAttribute("list",list); 
Set<String> set=new HashSet();
set.add("a11");set.add("a12");set.add("a13");set.add("a14");
pageContext.setAttribute("set", set); 
Map<String,String> map=new HashMap<String,String>();
map.put("key1", "dd11");map.put("key2", "dd12");map.put("key-3", "dd13");map.put("key-4", "dd14");
pageContext.setAttribute("map", map); 
%>
array=${array}<br/>
array[0]=${array[0]}  array[1]=${array[1]} array[2]=${array[2]}<br/>
list=${list}<br/>
list.get(0)=${list[0]} list.get(1)=${list[1]} list.get(2)=${list[2]} <br/>
set=${set}<br/>
set第1个元素=${set.toArray()[0]} set第2个元素=${set.toArray()[1]} set第3个元素=${set.toArray()[2]} <br/>
map=${map}<br/>

key1=${map.key1} key2=${map.key2} key-3=${map['key-3']} key-4=${map['key-4']} <br/>
注意1:操作map时:如果键中含有特殊字符:写法应该为map['key']<br/>
注意2:el表达式客户体验性很好 不报错<br/>
date=<%=(Date)request.getAttribute("date") %><br/>
<%-- date=<%=((Date)request.getAttribute("date")).getYear()%>:::空指针异常<br/> --%>
date=${date }<br/>
date.year=${date.year}<br/>
1/0=${1/0}<br/>

8.4 el的使用场景

<%
    request.setAttribute("a", 12);
    request.setAttribute("b", 13);
    request.setAttribute("stu", new Student());
    session.setAttribute("c", 12);
    request.setAttribute("d", 0);
%>
<h1>el表达式的使用场景:</h1>
<h2>使用场景1:html中</h2>
${a}+${b}=${a+b}<br/>
<h2>使用场景2:jsp标签中</h2>
<jsp:setProperty property="score" name="stu" value="${a+b}" />
stu=${stu }<br/>
<h2>使用场景3:js代码中</h2>
<div id="div1"></div>
<script type="text/javascript">
    window.οnlοad=function(){
        document.getElementById("div1").innerHTML="c=${sessionScope.c}".fontcolor("red").bold();
    }
</script>

8.5 el中数学运算可以使用的运算符

<%
    request.setAttribute("a", 12);
    request.setAttribute("b", 13);
    request.setAttribute("d", 0);
%>
<h1>el表达式数学运算可以使用的运算符:</h1>
<%--
    算数运算符: + - * / %     div等价于/ mod 等价于%
        比较运算符: gt表示>  
        ge表示>=  
        lt表示< 
        le表示<=   
        eq表示==
        ne表示!=
        逻辑运算符:    and 表示&&
        or 表示 || 
        非空判断:   empty 判断域属性是否不存在
        not empty 判断域属性是否存在  
        三元表达式:    boolean?值1:值2     
            --%>
a+b=${a+b}<br/>
a-b=${a-b}<br/>
a*b=${a*b}<br/>
a/b=${a/b},a/b=${a div b }<br/>
a%b=${a%b},a/b=${a mod b }<br/>
a &gt; b?${a>b},a &gt; b?${a gt b}<br/>
a &lt; b?${a<b},a &lt; b?${a lt b}<br/>
a &gt;= b?${a >= b},a &gt;= b?${a ge b}<br/>
a &lt;= b?${a <= b},a &lt;= b?${a le b}<br/>
a == b?${a == b},a == b?${a eq b}<br/>
a != b?${a != b},a != b?${a ne b}<br/>
1 &gt; 2 && 1 &lt;0 ? ${1 gt -1 && 1 lt 2 }<br/>
1 &gt; 2 && 1 &lt;0 ? ${1 gt -1 and 1 lt 2 }<br/>
1 &gt; 2 || 1 &lt;0 ? ${1 gt -1 || 1 lt 2 }<br/>
1 &gt; 2 || 1 &lt;0 ? ${1 gt -1 or 1 lt 2 }<br/>
${d}=0? ${empty d}<br/>
域属性中不存在e? ${empty e}<br/>
域属性中不存在a? ${empty a}<br/>
域属性中存在a? ${not empty a}<br/>
域属性中存在e? ${not empty e}<br/>  
1>2就显示3 否则显示4:::::${1>2?3:4}<br/>       

8.6 el表达式的11大内置对象

jsp的九大内置对象:jsp被解析为servlet后 service方法中已经定义好的九个可以直接使用的对象
     request response 
     out
     pageContext page 
     session application
     servletConfig
     exception
     
el的十一大内置对象:el表达式中可以直接使用的十一个对象:用于获取当前页面的所有信息
<!-- http://localhost:8080/java43_01_web/jsp/day03_03el.jsp?age=11&enjoy=lq&enjoy=zq&enjoy=pq -->
<h1>el十一大内置对象:1-2:::与请求参数parameter相关:::param+paramValues</h1>
获取单值请求参数param: age=${param.age }<br/><!-- param: age=11 -->
获取单值请求参数paramValues: enjoy=${paramValues.enjoy }<br/><!-- paramValues: enjoy=[Ljava.lang.String;@37e195e8 -->

<h1>el十一大内置对象:3-4:::与请求头header相关:::header+headerValues</h1> 
获取单值请求头header: Host=${header.Host}<br/><!-- param: age=11 -->
获取单值请求头headerValues: Accept-Language=${header['Accept-Language']}<br/><!-- param: age=11 -->
获取单值请求头headerValues: User-Agent=${header['User-Agent']}<br/>

<h1>el十一大内置对象:5:::与项目的初始化参数:::initParam</h1> 
获取web.xml中配置的项目的初始化参数:myEncoding=${initParam.myEncoding}<br/>
获取web.xml中配置的项目的初始化参数:myEncoding=<%=application.getInitParameter("myEncoding") %><br/> 

<h1>el十一大内置对象:6-9:::jsp的四大域对象:::xxxScope</h1> 
<%
request.setAttribute("a", "a_request");
session.setAttribute("a", "a_session");
pageContext.setAttribute("a", "a_pageContext");
application.setAttribute("a", "a_application");
response.addCookie(new Cookie("c1","c11_value"));
response.addCookie(new Cookie("c2","c12_value"));
response.addCookie(new Cookie("c3","c13_value"));

%> 
获取pageContext域属性:pageScope:::a=${pageScope.a} <br/>
获取request域属性:requestScope:::a=${requestScope.a} <br/>
获取session域属性:sessionScope:::a=${sessionScope.a} <br/>
获取application域属性:applicationScope:::a=${applicationScope.a} <br/>

<h1>el十一大内置对象:10:::获取cookie:::cookie</h1>
获取cookie对象:cookie::::c1=${cookie.c1} <br/>
获取cookie对象:cookie::::c2=${cookie.c2} <br/>
获取cookie对象:cookie::::c3=${cookie.c3} <br/> 
获取cookie:cookie::::${cookie.c1.name }=${cookie.c1.value } <br/>
获取cookie:cookie::::${cookie.c2.name }=${cookie.c2.value } <br/>
获取cookie:cookie::::${cookie.c3.name }=${cookie.c3.value } <br/>

<h1>el十一大内置对象:11:::pageContext:::就完全等价于jsp中的pageContext</h1>
获取session::${pageContext.session }<br/>
获取session::<%=pageContext.getSession() %><br/>
获取sessionid::${pageContext.session.id}<br/>
获取sessionid::<%=pageContext.getSession().getId() %><br/>
获取项目路径:: <%=pageContext.getServletContext().getContextPath() %><br/> 
获取项目路径:: ${pageContext.servletContext.contextPath }<br/>
获取请求方式:: <%=((HttpServletRequest)pageContext.getRequest()).getMethod()%><br/> 
获取项目路径:: ${pageContext.request.method }<br/>   

9 jstl标签库

9.1 jstl概念

<%-- 
    jstl:Java server pages standarded tag library  jsp标准标签库
    jsp=html+jsp标签+java片段:::可读性差+可维护性差+学习成本高
    使用jstl中的标签把java片段替换
    el表达式只能替换<%= %>
    jstl其实是对el的扩展 加强 ::只是el是jsp内部的 而 jstl需要jsp引入        
--%>

9.2 jstl的使用步骤

<h1>使用jstl的步骤</h1>
<%--
    第一步:项目导入jstl依赖的jar:standard-1.1.2.jar+jstl-1.2.jar
    第二步:使用jsp的taglib指令标签引入需要的标签:
       <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!-- uri:执行要引入标签的路径  prefix:指定引入的标签的前缀 --> 
    第三步:把  c.tld+ fmt.tld+  fn.tld添加到WEB-INF下   
    第四步: 通过<前缀:标签名 >来使用对应的标签            
--%>

9.3 jstl的分类

<h1>jstl标签库的分类</h1>
<%--
    1:http://java.sun.com/jsp/jstl/core 核心标签库::提供流程控制::最重要的
    2:http://java.sun.com/jsp/jstl/fmt  格式化标签库::提供对字符串数字日期格式化的标签::有用
    3:http://java.sun.com/jsp/jstl/functions 字符串方法标签::提供字符串转换操作的标签::有用
    4:http://java.sun.com/jsp/jstl/sql   sql标签::提供可以发送sql语句的标签:::废弃
    5:http://java.sun.com/jsp/jstl/xml   xml标签::提供解析xml的标签:::废弃
--%> 

9.4 fmt格式化标签库

<h1>jstl标签库:fmt标签库</h1>
<%
    pageContext.setAttribute("d1", new Date());
    pageContext.setAttribute("n1", 1234567.1234);
    pageContext.setAttribute("s1", "1234-12-13");
    pageContext.setAttribute("s2", "123,456,789.12");
%>
日期格式化:<fmt:formatDate value="${d1}" pattern="yyyy-MM-dd HH:mm:ss" /><br/>
数字格式化:  <fmt:formatNumber value="${n1}" pattern="##,###.00" /><br/>
日期解析:<fmt:parseDate  value="${s1}" pattern="yyy-MM-dd"/>::展示数据<br/>
日期解析:<fmt:parseDate  value="${s1}" pattern="yyy-MM-dd" var="d2" scope="page"/>::数据存入域中<br/>
获取d2=${pageScope.d2}<br/>
数字解析:<fmt:parseNumber  value="${s2}" pattern="#,###.00"/>::展示数据<br/>
数字解析:<fmt:parseNumber  value="${s2}" pattern="#,##.00" var="n2" scope="page"/>::数据存入域中<br/>
获取n2=${pageScope.n2}<br/> 

9.5 functions字符串概念标签库

<h1>jstl标签库:functions标签库</h1> 
<%
    pageContext.setAttribute("s1", "abc123abc321bca110ABC");
    pageContext.setAttribute("arr", new int[]{1,3,5,7,8,9,0,4});
%>
${s1}是否包含abc::${fn:contains(s1,'abc')}<br/>
${s1}中第一次出现123的位置::${fn:indexOf(s1,'123')}<br/>
${s1}是否包含abc不区分大小写::${fn:containsIgnoreCase(s1,'ABc') }<br/>
${s1}是否以110结尾::${fn:endsWith(s1,'110') }<br/>
${s1}数字元素拼接字符串::${fn:join(arr,'-') }<br/>
${s1}获取字符串长度::${fn:length(s1) }<br/>
${s1}替换使用的a为-::${fn:replace(s1,'a','-') }<br/>
${s1}切割使用a字符::${fn:split(s1,'a')}<br/>
${s1}是否以110开头::${fn:startsWith(s1,'110') }<br/>
${s1}截取子串::${fn:substring(s1,2,4)}<br/>
${s1}转化为小写::${fn:toLowerCase(s1) }<br/>
${s1}转化为大写::${fn:toUpperCase(s1) }<br/>

9.6 core核心标签库

<h1>jstl标签库:core标签库:核心标签库</h1>  

<h2>url标签</h2>
获取项目路径:<c:url value="/" /><br/>
获取aa.do的路径:<c:url value="/aa.do" /><br/>
<a href="/java43_01_web/jsp/day03_03el.jsp">请求day03_03el.jsp</a><br/>
<a href="${pageContext.servletContext.contextPath}/jsp/day03_03el.jsp">请求day03_03el.jsp</a><br/>
<a href="<c:url value='/'/>jsp/day03_03el.jsp">请求day03_03el.jsp</a><br/>
<a href="<c:url value='/jsp/day03_03el.jsp'/>">请求day03_03el.jsp</a><br/>
<c:url value="/" var="u1"/><!-- 创建一个u1域属性 值为项目路径 默认存入pageConetext域对象中 -->
<c:url value="/" var="u2" scope="request"/><!-- 创建一个u1域属性 值为项目路径 存入request域对象中 -->
u1=${pageScope.u1 }<br/>
u2=${requestScope.u2 }<br/>

<h2>set/out标签:添加和获取域属性</h2>
<c:set  scope="request" var="v1" value="1234"/><!-- 在request域对象中添加域属性v1 -->
v1=${requestScope.v1}<br/>
<c:out value="${requestScope.v1}"/> 完全等价于: ${requestScope.v1}<br/><!-- 输出域属性的值 -->
<c:out value="${requestScope.v2}" default="111"/><br/> <!-- 输出域属性的值:如果没值 使用默认值 -->
<c:set  scope="request" var="v3" value="<script  type='text/javascript'>alert(11);</script>"/><!-- 在request域对象中添加域属性v1 -->
<c:out value="${requestScope.v3}"/><br/>
<%-- <c:out value="${requestScope.v3}" escapeXml="false"/><br/> <!-- 输出域属性的值:对其中的内容进行解析-->--%>

<h2>remove标签:删除域属性</h2>
<c:set var="a" value="a_page" scope="page"/>
<c:set var="a" value="a_request" scope="request"/>
<c:set var="a" value="a_session" scope="session"/>
<c:set var="a" value="a_application" scope="application"/>
<c:remove var="a" /><!--全域删除a-->
<c:remove var="a"  scope="page"/><!--删除pageContext域中的a-->
page中的a:${pageScope.a}<br/>
request中的a:${requestScope.a}<br/>
session中的a:${sessionScope.a}<br/>
application中的a:${applicationScope.a}<br/> 

<h2>if/when/choose标签:选择结构</h2>
<c:set  var="sex" value="女"/>
<c:if test="${sex eq '男' }">
    你是${sex}生:帅哥一个!<br/>
</c:if>

<c:if test="${sex ne '男' }">
    你是${sex}生:美女一个!<br/>
</c:if>
<c:choose>
    <c:when test="${sex eq '男' }">
        你是${sex}生:帅哥一个!!!!<br/>
    </c:when>
    <c:otherwise>
        你是${sex}生:美女一个!!!!!<br/>
    </c:otherwise>
</c:choose>
<c:set  var="score" value="79"/>
<c:choose>
    <c:when test="${score lt 60 }">
        score=${score} 级别是:不及格!<br/>
    </c:when>
    <c:when test="${score lt 70 }">
        score=${score} 级别是:及格!<br/>
    </c:when>
    <c:when test="${score lt 80 }">
        score=${score} 级别是:良好!<br/>
    </c:when>
    <c:otherwise>
        score=${score} 级别是:优秀!<br/>
    </c:otherwise>
</c:choose>

<h2>foreach标签:循环结构</h2>
<%
pageContext.setAttribute("arr", new int[]{1,4,6,7,9,0,3});
pageContext.setAttribute("list", Arrays.asList(new Integer[]{1,4,6,7,9,0,3}));
%>
arr=${arr}<br/>
list=${list }<br/>
<h3>foreach的使用方式1:</h3>
<%--items:指定要遍历的集合/数组 
    var::定义变量记录其中的元素
        varStatus::记录遍历的状态:::其index属性记录的是元素的下标
            --%>
<c:forEach items="${arr}" var="item" varStatus="vs">
    ${item}:::${vs.index}:::${arr[vs.index]}<br/>
</c:forEach>
<c:forEach items="${list}" var="li" varStatus="vs">
    ${li}:::${vs.index}:::::::${list[vs.index]}<br/>
</c:forEach>
<h3>foreach的使用方式2:</h3>
<%--定义一个变量i从1跑到20 步长默认是1 --%>
<c:forEach begin="1" end="20" var="i">
    i=${i}<br/>
</c:forEach>
<c:forEach begin="1" end="20" var="i" step="2">
    i====${i}<br/>
</c:forEach>
<h3>打印九九乘法表:</h3>
<table>
    <c:forEach begin="1" end="9" var="i">
        <tr>
            <c:forEach begin="1" end="${i}" var="j">
                <td>${i}*${j}=${i*j}</td>
            </c:forEach>
        </tr>
    </c:forEach>
</table>
<hr/>
<table>
    <c:forEach begin="1" end="9" var="i">
        <tr>
            <c:forEach begin="1" end="9" var="j">
                <c:choose>
                    <c:when test="${(10-j) le i}">
                        <td>${i}*${(10-j)}=${i*(10-j)}</td>
                    </c:when>
                    <c:otherwise>
                        <td> </td>
                    </c:otherwise>
                </c:choose>
            </c:forEach>
        </tr>
    </c:forEach>
</table>
<hr/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值