JSP基础

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。,就是在html当中嵌入java代码实现动态开发。JSP的目的是输出动态的内容用来展示,但是不适合用来写java逻辑

一,jsp的原理

jsp页面会被服务器首先翻译成java文件,里面的html内容都会使用out.writer()输出,然后进过java的虚拟机编译为.class文件,然后运行。服务器把运行的结果返回给浏览器。
这里写图片描述
这里写图片描述


JSP的基本语法

  • JSP模版元素
    网页的静态内容。如:html标签和文本。

  • JSP脚本
    1.小脚本:<%System.out.println(“hello world”)%>
    2.表达式:<%=3+5%>等价于out.print(3+5)注意这个表达式当中没有分号
    3.申明:<%! %>表示在类中定义全局成员,和静态的代码块。因为一个jsp就是一个servlet的实现类。

  • JSP注释
    JSP注释:<%–这里是注释–%>这种注释是不会翻译成 html的,相当于java的注释
    网页注释:<!–网页注释–>,推荐使用JSP注释

  • 三个指令
    三个指令的语法都是一样的如下:
    <%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%>
    或者
    <%@ 指令名称 属性1=“属性值1”%>
    <%@ 指令名称 属性2=“属性值2”%>

    1,page指令:用于定义JSP页面的各种属性,其中有8中指令

    • import指令和java代码中的import是一样的

      <%@ page import="java.util.Date,java.util.List"%>
      <%@ page import="java.util.Date"%>
      <%@ page import="java.util.List"%>
    • session:是否会自动创建session对象。默认值是true;
    • buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb。一般不修改。
    • errorPage: 如果页面中有错误,则跳转到指定的资源。
      例如<%@page errorPage=”/uri” %>其中/代码当前应用的目录下,代表绝对路径,如果去掉则表示相对路径。
    • isErrorPage:是否创建throwable对象。默认是false
    • contextType: 等同于response.setContextType(“text/html;charset=utf-8”);告诉浏览器和服务器使用什么编码解析
    • pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。

      <%@ page  pageEncoding="gbk" %>
      
    • isELIgnored: 是否支持EL表达式。 默认是false

    2,include指令,将其他资源包含进来,分为静态包含和动态包含:

    • 静态包含:在将jsp文件翻译成java文件的会后合并两个文件。

      <%@ include file="/include/header.jsp" %>
      
    • 动态包含:不会合并文件,当代吗执行带include时才包含另一个文件。

      <jsp:include page="/include/header.jsp"></jsp:include>
      

    原则:能使用静态包含就不适用动态包含

    3,taglib:作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    

4、JSP的6个动作

  • < jsp:include > 动态包含
  • < jsp:forward> 请求转发
  • < jsp:param> 设置请求参数
  • < jsp:useBean> 创建一个对象
  • < jsp:setProperty> 给指定的对象属性赋值
  • < jsp:getProperty> 取出指定对象的属性值
    <!-- 首先创建一个student实体,class表示的是实体的路径 -->
     <jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean>
     <!-- 设置属性,给name这个属性设置值 -->
     <jsp:setProperty property="name" name="stu1" value="jerry"/>
     <!-- 获取属性 -->
     <jsp:getProperty property="name" name="stu1"/>

     <!-- http://localhost:8080/day11_02_jsp2/6.jsp?name=123 -->
     <!-- 请求转发,转发到当前应用的7.jsp -->
     <jsp:forward page="/7.jsp">
         <!-- 设置设置请求参数 -->
        <jsp:param value="123" name="name"/>
        <jsp:param value="333" name="pwd"/>
     </jsp:forward>

5、JSP的9个内置对象

| 对象名       | 类型                                   | 说明                      |
|-------------|---------------------------------------| --------------------------|
| request     | javax.servlet.http.HttpServletRequest |                           |
| response    | javax.servlet.http.HttpServletResponse|                           |
| session     | javax.servlet.http.HttpSession        | session="true"开关        |
| application | javax.servlet.ServletContext          |                           |
| exception   | java.lang.Throwable                   | 由isErrorPage="false"开关  |
| page        | java.lang.Object                      | 当前对象this当前servlet实例 |
| config      | javax.servlet.ServletConfig           |                          |
| out         | javax.servlet.jsp.JspWriter           | 相当于 printWriter对象     |
| pageContext | javax.servlet.jsp.PageContext         |                          |   
  • pageContext(重要)

    • 本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
      void setAttribute(String name,Object o);
      Object getAttribute(String name);
      void removeAttribute(String name);
      操作其它域对象的方法
      void setAttribute(String name,Object o,int Scope);
      Object getAttribute(String name,int Scope);
      void removeAttribute(String name,int Scope);
      scpoe的值:
      PageContext.PAGE_SCOPE
      PageContext.REQUEST_SCOPE
      PageContext.SESSION_SCOPE
      PageContext.APPLICATION_SCOPE
      findAttribute(String name); 自动从page request session application依次查找,找到了就取值,结束查找。

    • 它可以创建其它的8个隐式对象:
      在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时就使用。

    • 提供了的简易方法
      pageContext.forward(“2.jsp”);
      pageContext.include(“2.jsp”);

6、EL表达式
EL表达式:expression language 表达式语言
要简化jsp中java代码开发。
它不是一种开发语言,是jsp中获取数据的一种规范

1、功能

  • a.获取数据
    EL表达式只能获取存在4个作用域中的数据,如下
    这里写图片描述
    ${u} 原理: pageContext.findAttribute(“u”);代码是使用pageContext.findAttribute()在四个作用域对象的map当中寻找数据
    EL获取对于null这样的数据,在页面中表现为空字符串
    其中当找到了u对象时,u.name ==u.getName(),调用对应的getter方法。点后面跟着的是属性名字。
    属性导航

    //u表示一个student,address表示student当中的一个属性
    //,这个属性是一个对对象,这个对象下有一个city属性
    ${u.address.city}
    

    []运算符:点能做的,它也能做; 它能做的,点不一定能做
    $ {student.name}== student[name]== {student[“name”]}
    这里写图片描述


  • b.运算
    empty :判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
<%
        String str1 = null;
        request.setAttribute("str1", str1);

        String str2 = "";
        request.setAttribute("str2",str2);

        String str3 = "abc";
        request.setAttribute("str3", str3);


        List list1 = new ArrayList();
        request.setAttribute("list1", list1);

        List list2 = new ArrayList();
        list2.add("asdf");
        request.setAttribute("list2", list2);

        int sex = 0;
        request.setAttribute("s", sex);
     %>

     ${ empty str1 }  ---- true<br/> 
     ${ empty str2 }  ---- true<br/>
     ${ empty str3 }  ---- false <br/>
     ${ empty list1 } ---- true <br/>
     ${ empty list2 } ----  false<br/>

三元运算符 :

${ empty list2 ? "你还没有买商品":"你卖的商品如下" }
<input type="radio" name="sex" value="m" ${s==0 ? "checked='checked'":"" }/>男<br/>
<input type="radio" name="sex" value="f" ${s==1 ? "checked='checked'":"" }/>女<br/>
  • c.隐式对象:11个,EL表达式当中储存了是一个隐式对象。
    <%
        //pageContext.setAttribute("p", "pp");
        pageContext.setAttribute("p", "pp", PageContext.PAGE_SCOPE);

        //pageContext.setAttribute("p", "pp", PageContext.REQUEST_SCOPE);
        request.setAttribute("p", "request");

        //pageContext.setAttribute("p", "pp", PageContext.SESSION_SCOPE);
        session.setAttribute("p", "session");

        //pageContext.setAttribute("p", "pp", PageContext.APPLICATION_SCOPE);
        application.setAttribute("p", "application");
     %>
     ${p }
     ${pageScope.p}<!--获取pageContext当中的p的value-->
     <!--p可以拿到这四个域的所有数据,并且是从pageContext->request->session->application
     的属性开始,因为EL中有隐式对象,这里的隐式对象除了pageContext以为都是继承自Map<String,Object>,都是集合,这也导致${p}这种使用findattribute()的方式找不到request等对象的属性,所有需要通过pageContext这个对象来获取request对象然后调方法 -->
     ${pageContext.request.contextPath }<!--通过获取request对象来获取contextPath这个request固有的属性-->

这里写图片描述


三,JSTL

JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
使用:在JSP页面添加taglib指令
核心标签库:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

if判断

<c:if test="${5>3}">
    aaaaaaaaaaa
</c:if>

通用标签: set、 out、 remove

<!-- 声明一个变量 num -->
<c:set var="num" value="10" scope="session"></c:set>

输出变量:<%-- <c:out value="${num }"></c:out> --%>${num }

<c:remove var="num" scope="session"/>

输出变量:<c:out value="${num }" default="aaa"></c:out>

switch

<c:set var="num" value="${8 }"></c:set>

<c:choose>
    <c:when test="${num==1 }">aaa</c:when>
    <c:when test="${num==2 }">bbb</c:when>
    <c:when test="${num==3 }">ccc</c:when>
    <c:otherwise>
        dddd
    </c:otherwise>
</c:choose>

迭带标签:foreach
普通循环:var表示int i;begin表示i的初始胡,end表示结束条件,step表示步长

<c:forEach var="i" begin="1" end="10" step="2"> 
        ${i }<br/>
</c:forEach>

迭带器

    <%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        request.setAttribute("list", list);
     %>
    <c:forEach items="${list }" var="l">
        ${l }
    </c:forEach>

foreach(类型 变量名:数组或集合)

<%      
        //遍历数组
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("eee");
        list.add("ffff");

        request.setAttribute("list", list);
     %>

    <table border="1">
        <tr>
            <th>数据</th>
            <th>索引</th>
            <th>计数</th>
            <th>第一个</th>
            <th>最后一个</th>
        </tr>

        <c:forEach items="${list }" var="l" varStatus="vs">
            <tr ${vs.count%2==1 ? "style='background-color:lime'" : "style='background-color:green'" }>
                <td>${l }</td>
                <td>${vs.index }</td>
                <td>${vs.count }</td>
                <td>${vs.first }</td>
                <td>${vs.last }</td>
            </tr>
        </c:forEach>

forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put(“vs”,一个对象);
这个对象记录着当前遍历的元素的一些信息:

  • getIndex():返回索引。从0开始
  • getCount():返回计数。从1开始
  • isLast():是否是最后一个元素
  • isFirst():是否是第一个元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值