JSP基本知识

1 概念

jsp:java server page java服务器端页面
jsp是动态资源:必须通过web应用服务器解析为静态资源才能响应给客户端
jsp:13种web技术规范之一
     动态拼凑页面

深入理解

jsp是动态资源
每个jsp都要被浏览器解析为一个servlt 通过servlet的输出流拼凑和jsp相同效果的静态页面
jsp=html+css+js+jsp标签+java片段

2 原理

每个jsp都要被tomcat解析为一个servlet:jsp的所有内容在servlet中都有对应的代码
servlet要通过response的输出流来拼凑一个和jsp相同效果的页面

案例代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><!-- 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>JSP01原理</title>
<style type="text/css">
   /*css代码*/
   span{
      color:red;
      font-size:20px;
   }
</style>
</head>
<body>
    <span>span标签</span><br/><!-- html代码 -->
    <script type="text/javascript">
        alert("js代码");//js代码
    </script>
    <!-- java片段1 -->
    <%
       String message1="java片段1";
    %>
     <!-- java片段2 -->
    <%!
       String message2="java片段2";
       public String getMessage3(){
    	   return "java片段2333";
       }
    %>
    
    message1=
    <!-- java片段3 -->
    <%=message1%><br/>  <!-- out.print(message1); -->
    message2=
    <%=message2%><br/>
    message3=
    <%=getMessage3()%><br/>
    
    <%--jsp注释 <%=message1%> --%>
    <!-- html注释<%=message1%> -->
    
</body>
</html>

效果

image

获取此jsp对应的servlet

  • 位置
tomcat发布时会显示此jsp及其servlet的位置:
-Dcatalina.base=C:\Users\Administrator\Desktop\java37workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

image

  • servlet位置
C:\Users\Administrator\Desktop\java37workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\java37_ee_07_jsp\org\apache\jsp\day01

image

jsp中java片段的对应关系

  • jsp被解析成一个servlet

image

  • java片段 <%java代码 %> 对应的servlet的service方法体

image

  • java片段<%=数据%> 对应的是servlet的输出流的print方法

image

  • java片段 <%!java代码%> 对应的是servlet的成员

image

注意:

jsp被解析为servlet
servlet是单例:一个类只有一个对象
单例类中尽量避免定义成员::线程安全问题
jsp中<%! %>尽量避免使用

总结:

<!--java片段的使用-->
<%System.out.print("一般用于定义局部变量!"); %>
<%="用于在页面打印变量的值"%><br/>

3 jsp指令标签

page指令标签


<!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>

    
    <%--
       JSP的重点
       1:原理:jsp要被tomcat解析为servlet  通过servlet的response的响应输出流拼凑一个和jsp相同效果的页面
       2:jsp指令标签:给整个jsp页面设置属性
       3:jsp动作标签:jsp页面的一些动作:请求转发+请求包含+域属性的增删改查
       4:jsp九大内置对象:jsp中已经创建好的 在servlet中常用的9个对象
       5:el表达式:替代<%= %> 往页面输出变量的值
       6:el的十一大内置对象:el表达式中已经定义好的11个变量
       7:jstl表达式:el表达式的扩展
     --%>
     
     <%--jsp指令标签:
         jsp指令标签的格式: <%@ xxx %>
         page指令标签:给当前jsp页面设置属性
      --%>
     <%@page  autoFlush="true" %> <!-- 是否自动刷新response的输出流 -->
     <%@page  buffer="8kb" %><!-- response输出流的缓冲区大小-->
     <%@page contentType="text/html; charset=UTF-8" %><!-- 
                                 完全等价于:response.setContentType("text/html;charset=utf-8");
             1 设置response的字符输出流编码集为utf-8
             2 通过设置响应头context-type 来告诉浏览器 通过utf-8解码                    
      -->
     <%@page pageEncoding="UTF-8"  %><!-- 
                                     完全等价于:response.setCharacterEncoding("utf-8");
                                     设置response的字符输出流编码集为utf-8
      -->
    
     <%-- <%@page extends="java.lang.Object"%>--%><!-- jsp解析成的servlet要继承的父类 -->
     
     <%@page info="作者:苗天宝" %><!--servlet的作者/日期/版本信息  -->
     <%@page isELIgnored="false" %><!-- 是否屏蔽el表达式 -->
     <%@page isErrorPage="false" %><!-- 当前jsp是否为错误页面 -->
     <%@page isThreadSafe="true" %><!-- 是否线程安全 -->
     <%@page language="java"  %><!--片段使用的语言  -->
     <%@page session="true" %><!--是否可用session  -->
     <%@page trimDirectiveWhitespaces="false" %><!-- 是否去除两边的空格-->
     <%@page errorPage="error.jsp" %><!-- 错误页面:当前页面出错 要跳转的目的页面-->
     1/0=<%=1%><br/>
     
     <%int age=11;String name="韩梅梅"; %>
     <%@page import="java.util.Date"%><!--引入其他包中的类 -->
     date=<%=new Date() %><br/>
     
     
   <%-- jsp注释 --%>
   <%--
       jsp要被tomcat解析为servlet  通过servlet的response的响应输出流拼凑一个和jsp相同效果的页面
       jsp=html+css+js+java片段+jsp标签
    --%>
    <%int n=1; %><%--设置service的方法体 --%>
    <%! int m=1; %><%--设置servlet的成员 --%>
    <%=n%><%--通过response的输出流 往页面打印变量的值 --%>
</body>
</html>
  • error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page isErrorPage="true" %> <!-- 当前页面是错误页面 -->   
<!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>错误页面</title>
</head>
<body>
    <h1>看到我 说明你你错了</h1>
    ${exception.getMessage()}<br/>
</body>
</html>

include指令标签

  • 03.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>
    <h1>jsp指令标签2:include</h1>
    <!-- java片段::等价于service方法体 -->
    <%
       int age=11;
       String name="韩梅梅";
    %>
    <%@ include file="a.jsp" %>  <!-- 静态包含 -->
    <!-- 注意:a.jsp生成对应的servlet   03.jsp和a.jsp的代码先合并  再被tomcat解析为servlet-->
    
</body>
</html>
  • a.jsp
name=<%=name%><br/>
age=<%=age%><br/>
  • 效果

image

taglib指令标签

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

4 jsp的动作标签

可以在页面要实现一些指定功能的标签

forward动作标签

     <%--
          jsp动作标签:在jsp页面实现指定功能的标签
          jsp动作标签格式: <jsp:xxx />
      --%>
      <h1>04.jsp</h1>
      
      <jsp:forward page="01.jsp"/>
      <%-- 完全等价于:
           <%
                request.getRequestDispatcher("01.jsp").forward(request, response);
           %>
      --%>

include动作标签

<h1>04.jsp</h1>
<%
   String pageName="01.jsp";
%>
    <jsp:include page="<%=pageName%>">
        <jsp:param value="aa_value" name="aa"/>
    </jsp:include> <!-- 动态包含:::请求包含 -->
    <%-- 完全等价于:
         <%
        request.getRequestDispatcher("01.jsp?aa=aa_value").include(request, response);
        %>
    --%>

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

<%--
静态包含和动态包含的区别:
相同之处:都是把两个jsp合并为一个jsp页面       
不同之处:
     1 标签不同  
               动态包含:是jsp动作标签: <jsp:include page="xxx" />                           
               静态包含:是jsp指令标签: <%@include file="xxx" /> 
     2 合并时机不同
               动态包含: 1.jsp动态包含2.jsp 两个jsp都会被tomcat解析生成两个servlet 
                        两个servlet的输出流合并 共同响应一个静态页面
               静态包含:1.jsp静态包含2.jsp 先把2.jsp的代码合并到1.jsp中 tomcat只解析1.jsp 
                         生成一个servlet 只有这一个servlet的输出流来响应一个静态页面                                3  被包含的页面名是否可以是变量
               动态包含:被包含的页面名可以是变量
                    <%
                       String pageName="01.jsp";
                    %>
                    <jsp:include page="<%=pageName%>"/>                             
               静态包含:被包含的页面不能是变量
    4  是否可以传递参数
              静态包含不能传递参数
              动态包含可以传递参数(请求参数):   
            <jsp:include page="01.jsp">
                <jsp:param value="aa_value" name="aa"/>
            </jsp:include> 
 --%>

useBean动作标签

  • 准备工作:创建一个实体类Student
     <jsp:useBean id="stu1" class="com.zhiyou100.entity.Student" scope="request"/>
     <!-- 给request域中添加一个属性名为stu1 值为一个无参数构造方法创建的Student对象 -->
     <%
          // 完全等价于:
          request.setAttribute("stu1", new Student());
     %>
     
     <jsp:setProperty property="sage"  value="11" name="stu1" />
     <!--给域属性stu1对应的对象的sage属性赋值为11 -->
     <%
         //完全等价于
         Student s2=(Student)request.getAttribute("stu1");
         s2.setSage(12);
     %>
     
     <%
        Student s1=(Student)request.getAttribute("stu1");
     %>
     stu1=<%=s1%><br/>
     sage=<jsp:getProperty property="sage" name="stu1"/><br/>
     <!-- 获取域属性stu1的属性sage的值 并通过输出流打印 -->
     <%
         //完全等价于
         Student s3=(Student)request.getAttribute("stu1");
         response.getWriter().print(s3.getSage());
     %>

5 jsp的九大内置对象

jsp要被解析为servlet:
jsp的九大内置对象:是jsp对应的servlet中定义好的九个常用对象
 <%--
                        九大内置对象:jsp对应的servlet自动创建好的九个对象:方便jsp的直接使用
        1:request:HttpServletRequest类型 :封装与请求相关的所有内容     
                                       作用: a: 获取请求参数
                    b: 获取请求头
                    c: 作为域对象 实现请求链之间数据共享
                    d: 请求转发 请求包含
                    e: 其他功能
        2: response:HttpServletResponse类型:封装与响应相关的所有内容
                                       作用:a:设置响应头
                   b:设置响应体
                   c:重定向
                   d:其他功能 
        3:page:HttpServlet类型:当前servlet对象
        4:config:ServletConfig类型: 配置信息:servlet-name url-pattern
        5:out: PrintWriter类型: response的打印输出流
        6:application:ServletContext类型:上下文对象
        7:session:HttpSession: 会话对象
        8:pageContext: PageContext:
        9:exception: Throwable类型:错误页面捕获到的异常对象
                                         注意:只有当<%@page isErrorPage="true" %>才有exception对象     
    --%>
    <%
      out.print(" 项目路径:"+request.getContextPath()+"<br/>");
    %>
         项目路径:<%=request.getContextPath()%><br/>
    servlet-name:<%=config.getServletName() %><br/>
    page=<%=page%><br/>
    this=<%=this%><br/>
    <%
       application.setAttribute("aa", "aa_application_value");
    %>
    aa=<%=application.getAttribute("aa") %><br/>
    sessionid=<%=session.getId() %><br/>

pageContext对象

    <%--
    pageContext作用:
       1 作为域对象:在当前页面和当前页面引入的标签库中实现数据共享
       2 获取其他八个内置对象
       3 全域查找
       4 代理其他域
     --%>
    <!--  1 作为域对象:在当前页面中实现数据共享: 
          Object getAttribute(String);
          void setAttribute(String,Object);
          void removeAttribute(String);
    -->
    <%
      pageContext.setAttribute("aa", "aa_pageConetext_value");
    %>
    aa=<%=pageContext.getAttribute("aa") %><br/>
    
    
    <!-- 2 获取其他八个内置对象:
         xxx  getXxxx();
     -->
    <%=pageContext.getRequest()==request%><br/>
    <%=pageContext.getResponse()==response%><br/>
    <%=pageContext.getSession()==session%><br/>
    <%=pageContext.getServletConfig()==config%><br/>
    <%=pageContext.getServletContext()==application%><br/>
    <%=pageContext.getOut()==out%><br/>
    <%--<%=pageContext.getException()==exception %><br/>--%>
    <%=pageContext.getPage()==page%><br/>
    
    <!-- 3 全域查找:
        Object findAttribute(String);
     -->
    <%
        //pageContext.setAttribute("bb", "bb_pageContext_value");
	    //request.setAttribute("bb", "bb_request_value");
	    //session.setAttribute("bb", "bb_session_value");
	    application.setAttribute("bb", "bb_application_value");
    %>
    pageContext.findAttribute("bb")=<%=pageContext.findAttribute("bb") %><br/>
    
    
    <!-- 4 代理其他域
          void setAttribyte(String,Object,int)
          Object getAttribyte(String,int)
    -->
    <%
       pageContext.setAttribute("cc", "cc_request", PageContext.REQUEST_SCOPE);
       pageContext.setAttribute("dd", "dd_session", PageContext.SESSION_SCOPE);
       pageContext.setAttribute("ee", "ee_application", PageContext.APPLICATION_SCOPE);
    %>
    cc=<%=request.getAttribute("cc")%><br/>
    dd=<%=session.getAttribute("dd") %><br/>
    ee=<%=application.getAttribute("ee") %><br/>
    cc=<%=pageContext.getAttribute("cc", PageContext.REQUEST_SCOPE)%><br/>
    dd=<%=pageContext.getAttribute("dd", PageContext.SESSION_SCOPE)%><br/>
    ee=<%=pageContext.getAttribute("ee", PageContext.APPLICATION_SCOPE)%><br/>

6 EL表达式

EL(Expression Language) 是为了使JSP写起来更加简单
el格式: ${}
el作用: 替换<%= %>  在页面显示变量的值

el使用场景

    <h1>el表达式的使用场景</h1>
    <!--使用场景1: 在js中使用 -->
    <script type="text/javascript">
           var oh1= document.getElementsByTagName("h1")[0];
           oh1.innerText=oh1.innerText+"${1+1}";
    </script>
    
    <!--使用场景2: 在html中使用 -->
    html不能进行运算:1+1=1+1 <br/>
    java片段1实现: 1+1=<%=1+1%><br/>
    java片段2实现: 1+1=<% out.print(1+1);%><br/>
    el表达式实现:1+1=${1+1}<br/>
    
    <!--使用场景3: 在jsp标签中使用 -->
    <jsp:useBean id="stu"  class="com.zhiyou100.entity.Student" scope="page"/>
    <!-- 在pageContext域对象中添加一个域属性 名为stu 值为Student对象 -->
    <jsp:setProperty property="sage" name="stu" value="${20+1}"/>
    stu.sage=<%=((Student)pageContext.getAttribute("stu")).getSage()%><br/>

el作用

    <h1>el表达式作用</h1>
    <!-- 作用1:基本运算 :
            运算符:+、-、*、/(div)、%(mod)
            比较符: > (gt)、 >=(ge)、 <(lt)、 <=(le)、 ==(eq)、 !=(ne) 
            空判断:empty 、 not empty
            三元符:  boolean?a:b  
    -->
    5/2=${5/2},5/2=${5 div 2}<br/>
    5%2=${5%2},5/2=${5 mod 2}<br/>
    <%request.setAttribute("a", 3);%>
    1&gt;2 = ${1>2},1&gt;2 =${1 gt 2}<br/>
    1&gt;=2 = ${1>=2},1&gt;=2 =${1 ge 2}<br/>
    1==2 = ${1==2} , 1==2 = ${1 eq 2}<br/>
    1!=2 = ${1!=2} , 1!=2 = ${1 ne 2}<br/>
    
    0 是否为空=${empty 0}<br/>
    0 是不是不为空=${not empty 0}<br/>
    1 是否为空=${empty 1}<br/>
    "" 是否为空=${empty ""}<br/>
    ' ' 是否为空=${empty ' '}<br/>
    'a' 是否为空=${empty 'a'}<br/>
    null 是否为空=${empty null}<br/>
    
    1>2?"好":"坏" = ${1>2?"好":"坏"}<br/>
    
    <!-- 作用2:操作域对象中的属性-->
    <%
        pageContext.setAttribute("bb", "bb_pageContext_value");
	    request.setAttribute("bb", "bb_request_value");
	    session.setAttribute("bb", "bb_session_value");
	    application.setAttribute("bb", "bb_application_value");
    %>
    <!-- 全域查找 -->
    bb=${bb}<br/><!-- bb=bb_pageContext_value -->
    bb=<%=pageContext.findAttribute("bb")%>
    <!-- 获取指定域对象的属性 -->
    pageScope.bb=${pageScope.bb}<!-- 获取pageContext域中的bb属性 --><br/>
    requestScope.bb=${requestScope.bb}<!-- 获取request域中的bb属性 --><br/>
    sessionScope.bb=${sessionScope.bb}<!-- 获取session域中的bb属性 --><br/>
    applicationScope.bb=${applicationScope.bb}<!-- 获取application域中的bb属性 --><br/>
    
    <!-- 作用3:对象导航:OGNL -->
    <!-- 
                                   对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),
                                   作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。
                       解析:如果一个对象a拥有getXxx方法 就可以在el中通过a.xxx来调用此方法
     -->
    <jsp:useBean id="stu2"  class="com.zhiyou100.entity.Student" scope="page"/>
    <jsp:setProperty property="sage" name="stu2" value="12"/>
    <jsp:setProperty property="sid" name="stu2" value="10012"/>
    <jsp:setProperty property="sname" name="stu2" value="韩梅梅"/>
    <jsp:setProperty property="score" name="stu2" value="89.9"/>
    stu2=${pageScope.stu2}<br/>
    stu2.sage=${pageScope.stu2.sage}<br/>
    stu2.sname=${pageScope.stu2.sname}<br/>
    stu2.sex=${pageScope.stu2.sex}<br/><!-- 只要对象拥有方法getXxx即可 -->
    stu2.sage=<%=((Student)pageContext.getAttribute("stu2")).getSage()%><br/>
    
    <!-- 作用4:操作集合/数组 -->
    <%
       List<Student> list=new ArrayList<>();
       list.add(new Student(10011,"韩梅梅",12,14f));
       list.add(new Student(10012,"韩庚",22,24f));
       list.add(new Student(10013,"韩信",32,34f));
       list.add(new Student(10014,"韩非子",42,44f));
       request.setAttribute("list", list);
    %>
    list[0]=${requestScope.list[0]}<br/>
    list[1].sname=${requestScope.list[1].sname}<br/>
    list[2].sage=${requestScope.list[2].sage}<br/>
    list[3].score+3=${requestScope.list[3].score+3}<br/>
    <%int a;int b=3; %>
    <%--a=<%=a%><br/> --%>
    b=${b}<br/><!-- el表达式获取的变量必须是域属性  el获取的变量如果不存在  不会报错 -->

el的十一大内置对象

   <%
       添加域属性
	   pageContext.setAttribute("b", "b_pageContext_value");
	   request.setAttribute("b", "b_request_value");
	   session.setAttribute("b", "b_session_value");
	   application.setAttribute("b", "b_application_value");
	   
	   添加cookie
	   response.addCookie(new Cookie("c1","c1_value"));
	   response.addCookie(new Cookie("c2","c2_value"));
   %>
       
   <!-- el的十一大内置对象:在el表达式中 可以直接使用的11个对象 -->
   <!-- 1-4:域对象
           pageScope:pageContext域对象
		   requestScope:request域对象
		   sessionScope:session域对象
		   applicationScope:application域对象
    -->
   pageScope.b=${pageScope.b}
   requestScope.b=${requestScope.b}
   sessionScope.b=${sessionScope.b}
   applicationScope.b=${applicationScope.b}
   <!-- 注意:request和requestScope的区别 -->
             requestScope是request的一部分
   
   <!-- 5-6:获取请求参数
           param:获取单值请求参数
           paramValues:获取多值请求参数
           http://localhost:8080/java-web-ts/a.jsp?name=jjy&enjoy=lq&enjoy=zq&enjoy=pq    
   -->
     请求参数:name=${param.name} 
     请求参数:enjoy=${paramValues.enjoy[0]}、${paramValues.enjoy[1]}、${paramValues.enjoy[2]} 
     
   <!-- 7-8:获取请求头
          header:获取单值请求头
          headerValues:获取多值请求头   
   -->
     请求头:Accept=${header.Accept}   
     请求头:Host=${header.Host} 
     请求头:User-Agent=${header['User-Agent']} 
    
   <!-- 9:获取cookie --> 
     cookie c1:${cookie.c1.name}=${cookie.c1.value}
  
   <!-- 10: 获取项目的初始化参数:
            initParameter
            在web.xml中配置的项目的初始化参数
		  <context-param>
		     <param-name>encodingName</param-name>
		     <param-value>UTF-8</param-value>
		  </context-param>  
   --> 
   <%
       String charset=request.getServletContext().getInitParameter("encodingName"); 
   %>
   charset=<%=charset%>
   charset=${charset}
   charset=${initParam.encodingName}
   
   
   <!-- 11: pageContext:pageContext对象 -->
   项目路径:${pageContext.request.contextPath}

7 jstl表达式

概念

JSTL(Java server pages standarded tag library,即JSP标准标签库)
	它主要提供给Java Web开发人员一个标准通用的标签库,
	开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
JSP=html+css+js+java片段+jsp标签   
	html代码中嵌套java片段::可读性差::学习成本高::维护难度高
	jstl的作用:通过定义的标签 来替代jsp中的java片段:
	对el表达式的扩展

使用

JSTL使用
	1:导入jar包:jstl-1.2.jar+standard-1.1.2.jar
       把jar放入WEB-INF/lib下 并bulid path
	2:通过jsp的taglib指令标签 引入此标签库
	   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
       <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/functions"%>
	   prefix:指定前缀
	   uri:指定标签库的路径
	3: 在/WEB-INF下引入依赖的tld文件
	   c.tld 
	   fn.tld  

分类

jstl标签库分类:
          1 core库:核心库:实现流程控制和属性的增删改查    最常用的
          2 fmt库:格式化库:实现数据的格式化   不常用
          3 functions库:字符串方法库:字符串相关的方法   不太常用
          4 sql库:操作数据库:不使用
          5 xml库:xml解析:不使用

functions标签库

    <!-- functions标签库 字符串方法库 --> 
    <%
       request.setAttribute("str", "abcdefghijklMSBCDDABCabc");
    %>  
    str=${str}
    str的字符串长度=${fn:length(str)}
    str是否包含abc=${fn:contains(str,"abc")}
    str是否以abc开头=${fn:startsWith(str,"abc")}
    str是否以abc结尾=${fn:endsWith(str,"abc")}
    str替换所有的a为0=${fn:replace(str,"a","0")}
    str第一次出现a=${fn:indexOf(str,"a")}
    str剪切子串=${fn:substring(str,1,5)}
    str切割=${fn:split(str,"a")[0]}
    str转化为大写=${fn:toUpperCase(str)}
    str转化为小写=${fn:toLowerCase(str)}

fmt标签库

    <!-- fmt标签库 实现数据的格式化 -->
    <%
        request.setAttribute("date", new Date());
    %>
    date=${date}<br/>
    date=<fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss"  value="${date}" /><br/>

jsp和servlet的分工

jsp和servlet的分工
jsp:提供表单获取数据+响应数据显示
servlet:接受数据+处理数据(服务数据库)+资源跳转

core标签库

<!-- url标签 实现流程控制和属性的增删改查 -->
<!-- url作用1:设置域属性:(值前面加项目路径) -->
<c:url scope="request"  var="path" value="/1.txt"/>
代码:path=${requestScope.path}
结果:path=/forum/1.txt
<!-- url作用2:在路径前面补全项目名称 -->
<a  href="<c:url value='/jsp/1.jsp'/>">请求1.jsp</a>
结果:http://localhost:8080/forum/jsp/1.jsp
等价:<a  href="${pageContext.request.contextPath}/jsp/1.jsp">请求1.jsp</a>

<!-- set标签:作用:往指定域中添加属性:不指定域 默认是pageContext域 -->
<c:set scope="request"  var="a"  value="a_1"/>
结果:a=a_1
a=${requestScope.a}:从request域中取出了a
结果:a=a_1

<!--out标签:作用:输出变量的值:default指定默认值:escapeXml是否避免解析数据 -->
a=<c:out value="${requestScope.a}" default="a_0" />
结果:a=a_1	域中有值输出域中的值
1+1=<c:out value="${1+1}" />
结果:1+1=2
b=<c:out value="${requestScope.b}" default="b_0" />
结果:b=b_0	域中无值输出默认的值
<c:set  var="cc" value="<script type='text/javascript'>alert;</script>" />
cc=<c:out value="${cc}" escapeXml="true"/>
结果:cc=<script type='text/javascript'>alert;</script>

<!-- remove标签 -->
<c:remove var="a" scope="page"/>:删除所有page域中的a属性
<c:remove var="a"/>:删除所有域中的a属性

<!-- if标签 单分支 -->
<c:set scope="page"  var="sex"  value="男"/>
<c:if test="${pageScope.sex equal '男'}">
    男生    
</c:if>
<c:if test="${pageScope.sex notequal '男'}">
    不是男生    
</c:if><br/>

<!-- choose标签 多分支 -->
<c:set var="score"  value="18"/>
<c:choose>
    <c:when test="${score lt 60 }">
        分数=${score},不及格!<br/>
    </c:when>
    <c:when test="${score lt 70 }">
        分数=${score},及格!<br/>
    </c:when>
    <c:when test="${score lt 80 }">
        分数=${score},良好!<br/>
    </c:when>
    <c:otherwise>
        分数=${score},优秀!<br/>  
    </c:otherwise>
</c:choose>
结果:分数=18,不及格!

<!-- forEach标签:-->
<!-- forEach作用1:在pageContext中添加一个域属性i;i从1跑到20 每次+2-->
<c:forEach begin="1" end="20"  step="2"  var="i">
    i=${pageScope.i}<br/>
</c:forEach>
<!-- forEach作用2:items指定要遍历的集合:var给遍历的集合中的元素起个名字:varStatus记录遍历状态的对象(index属性获取的是遍历的索引)-->
<c:forEach items="${requestScope.list}" var="stu" varStatus="vs">
<!-- vs记录变量状态的对象:index属性记录变量顺序:从0开始 -->
 <%
    List<Student> list=new ArrayList<>();
    list.add(new Student(10011,"韩梅梅",12,14f));
    list.add(new Student(10012,"韩庚",22,24f));
    list.add(new Student(10013,"韩信",32,34f));
    list.add(new Student(10014,"韩非子",42,44f));
    request.setAttribute("list", list);
 %>   
    ${vs.index+1} 
    ${stu.sid}
    ${stu.sname}
    ${stu.sage}
    ${stu.score}
</c:forEach>
<!-- forEach:九九乘法表-->
<c:forEach begin="1" end="9" step="1" var="i">
    <c:forEach  begin="1" end="9" var="j">
         <c:choose>
            <c:when test="${i>=j}">
               ${i}*${j}=${i*j}
            </c:when>
         <c:otherwise>
            &nbsp; &nbsp;
         </c:otherwise>
    </c:forEach>
</c:forEach>

<!-- redirect标签:重定向 -->
<%
   <c:redirect  url="1.jsp"/>
%>
posted @ 2021-10-08 20:35  RenVei  阅读(175)  评论(0编辑  收藏  举报