JSP页面

1.1 JSP的本质

jsp部署到tomcat中,在启动tomcat的时候会把JSP页面翻译成一个.java文件,文件名是:JSP文件名_jsp.java。
JSP的本质是Servlet,只是形式不同,职责不同
servlet负责接收请求 处理数据 给出响应 jsp页面 主要负责将servlet响应回来的数据以页面的形式展示在浏览器中。

1.2 JSP的三种语法

1.2.1 JSP头部的page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

page指令可以修改JSP页面中的一些重要属性

  • contentType:属性表示jsp返回的数据类型,
response.setContentType("text/html;charset=UTF-8");
  • language:表示jsp翻译时使用什么语言,暂时只支持java
  • PageEncoding:表示当前页面文件本身使用的字符集
  • import和java代码中的import一样 导包
  • autoflush 设置当out书缓冲流缓冲区满之后 是否自动刷新缓冲区 默认值是true
  • buffer 设置out的缓冲区大小 默认8kb
  • errorPage:表示当前页面是否是错误信息页面 默认是false 如果设置为true 就可以获取异常信息
  • session 设置访问jsp页面 是否创建HttpSession对象 默认是true
1.2.2 JSP中的常用脚本

声明脚本
形式:<%! %>
用途:1.声明类的属性 2.声明静态代码块 3.声明类的方法
表达式脚本
形式:<%= %>
用途:在jsp页面输出数据

    <h1>这是一个JSP页面</h1>
    <%=20%><br/>
    <%="中北大学"%>
    <%=map%>
    <%=request.getAttribute("username")%>

请添加图片描述
代码脚本
形式:<% %>
用途:翻译之后的代码位于_jspService()方法内部,因此不能写方法

<%@ page import="java.util.Date" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%--
  Created by IntelliJ IDEA.
  User: adminstrator
  Date: 2021-8-24
  Time: 11:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" buffer="8kb" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 <% int age = 10;
 if( age >  18 ){
 %><h1>成年人</h1><%
     }else{ %>
    <h1>未成年人</h1><%
    }%>
</body>
</html>

请添加图片描述
jsp的三种注释

//注释
/*多行注释*/
<%----%> jsp的注释

1.3 JSP九大内置对象

内置对象 指的就是tomcat 在翻译jsp页面成为servlet源代码后,内部提供的九大对象

  • request 请求对象
  • response 响应对象
  • pageContext jsp的上下文对象
  • session 会话对象
  • application ServletContext对象
  • config ServletConfig对象
  • out jsp的输出流对象
  • page 指向当前jsp的对象
  • exception 异常对象
    对于内置对象,我们可以不用声明 直接使用
1.3.1 JSP的四大域对象
  • pageContext 作用范围 当前jsp页面范围内有效
  • request 一次请求内有效
  • session 一次会话范围内有效(一次会话是指打开浏览器访问服务器,直到关闭浏览器)
  • application ServletContext 整个web工程范围内都有效(只要web工程服务不停止,数据将一直存在)
    四大域对象的作用域从小到大:pageContext – request – session – application
index.jsp
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%--
  Created by IntelliJ IDEA.
  User: adminstrator
  Date: 2021-8-24
  Time: 11:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" buffer="8kb" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--    在四大域对象中存储数--%>
<%
    pageContext.setAttribute("key","pageContext");
    request.setAttribute("key","request");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
<%--获取四大域对象中存储的数据--%>
pageContext域:<%=pageContext.getAttribute("key")%><br/><br/>
request域:<%=request.getAttribute("key")%><br/><br/>
session域:<%=session.getAttribute("key")%><br/><br/>
application域:<%=application.getAttribute("key")%><br/><br/>
<%--转发到另一个jsp页面--%>
<%
    request.getRequestDispatcher("/main.jsp").forward(request,response);
%>
</body>
</html>

main.jsp
<%--
  Created by IntelliJ IDEA.
  User: adminstrator
  Date: 2021-8-24
  Time: 14:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--获取四大域对象中存储的数据--%>
pageContext域:<%=pageContext.getAttribute("key")%><br/><br/>
request域:<%=request.getAttribute("key")%><br/><br/>
session域:<%=session.getAttribute("key")%><br/><br/>
application域:<%=application.getAttribute("key")%><br/><br/>
</body>
</html>
1.3.2 JSP中的out和response.getWriter()的区别

本质上没有区别
response表示响应,给客户端输出内容
out也是给用户做输出使用的
在jsp中 统一使用out进行输出
out.writer()输出字符串 out.print()可以输出任意的类型

1.4 JSP的常用标签

1.4.1 动态包含

特点:

  1. page属性 指定要包含的jsp页面
  2. 动态包含会把包含的jsp也翻译为java代码
  3. 动态包含的底层代码使用JspRuntimeLibrary.include(request,response,“main.jsp”,out,false);
  4. jsp动态包含还可以传递参数
    <jsp:include page="main.jsp">
        <jsp:param name="username" value="admin"/>
        <jsp:param name="password" value="87654321"/>
    </jsp:include>
    <%=request.getParameter("username")%>------ 
    <%=request.getParameter("password")%>
1.4.2 静态包含

特点

  1. file属性 指定所要包含的jsp页面
  2. 静态包含不会把包含的jsp也翻译为java代码
  3. 静态包含就是把被包含的jsp页面的代码拷贝到了被包含的位置
<%@include file="main.jsp"%>
1.4.3 转发
<jsp:forward page="main.jsp"></jsp:forward>

page就是转发的路径

1.5 EL表达式

1.5.1 EL表达式的作用

代替jsp页面的表达式脚本在jsp页面进行数据的输出
区别:EL表达式在输出null值的时候 输出的是空串,而jsp表达式输出的是null字符串

    <body>
        <% request.setAttribute("key","value");%>
      jsp表达式:  <%=request.getAttribute("key")%><br/>
      EL表达式:  ${key}
    </body>
1.5.2 EL表达式数据的搜索

EL表达式主要是在jsp页面输出数据,主要输出的是四大域对象中的数据。
当四大域对象中有同名的属性时,EL表达式会按作用域从小到大的顺序搜索,找到就输出
(若中途执行了removeAttribute方法,仍会按照初始的优先级执行,但由于已经被移除了,所以返回null)

1.5.3 EL表达式输出Bean的属性
   @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Person p = new Person();
        p.setName("张三");
        p.setHobbys(new String[]{"足球","篮球","羽毛球"});
        List<String> cities = new ArrayList<>();
        cities.add("北京");
        cities.add("上海");
        cities.add("深圳");
        p.setCities(cities);
        Map<String ,Object> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2",100);
        map.put("k3",true);
        p.setMap(map);
        req.setAttribute("person",p);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }

    <body>
        输出person:${person}<br/>
        输出person的name:${person.name}<br/>
        输出person的hobbys:${person.hobbys[1]}<br/>
        输出person的cities:${person.cities}<br/>
        输出person的cities的某一个值:${person.cities[2]}<br/>
        输出person的map:${person.map}<br/>
        输出person的map的某一个key对应的值:${person.map.k2}<br/>
    </body>
1.5.4 EL表达式运算

1.关系运算

<%--       关系运算--%>
     等于:   ${5==5} ||  ${5 eq 5} <br/>
     不等于: ${5!=5} ||  ${5 ne 5} <br/>

     小于等于:${3 <=  5 } ||  ${3 le 5} <br/>
     大于等于:${3 >=  5 } ||  ${3 ge 5} <br/>

2.逻辑运算
&& 或 and ||或 or !或not
3.算数运算
+ - * /或div %或mod
4.empty运算(not empty)
判断某一个数据是否为空,如果为空 则返回true 否则就返回false

null值,空串,数组长度为0,集合元素个数为0
request.setAttribute("emptyNull",null);//true
request.setAttribute("emptyStr","");//true
request.setAttribute("emptyArr",new Object[]{});//true
request.setAttribute("emptyList",new ArrayList());//true
request.setAttribute("emptyMap",new HashMap<String,String>());//true

5.三元运算

${ 1!=1?"java":"CSS"}
  1. “.”点运算符和[]中括号运算符
    .点运算符可以输出bean对象的属性
    [] 可以输出集合(数组)中某个元素的值 还可以输出map集合中key里面包含特殊字符的key的值
         <% Map<String,Object> map = new HashMap<>();
            map.put("a.a.a","aaaa");
            map.put("b+b+b","bbbb");
            map.put("c-c-c","cccc");
            request.setAttribute("map",map); %>
    ${map['a.a.a']}<br/><br/>
    ${map['b+b+b']}<br/><br/>
    ${map['c-c-c']}<br/><br/>

1.6 EL表达式的11个隐含对象

EL表达式中有11个隐含对象,是EL表达式中自己定义的,可以直接使用

隐含对象类型说明
PageContextPageContextImpl它可以获取jsp 中的九大内置对象
PageScopeMap它可以获取pageContext 域中的数据
RequestScopeMap它可以获取Request 域中的数据
sessionScopeMap它可以获取Session 域中的数据
applicationScopeMap它可以获取ServletContext 域中的数据
paramMap它可以获取请求参数的值
paramValuesMap它也可以获取请求参数的值,获取多个值的时候使用。
headerMap它可以获取请求头的信息
headerValuesMap它可以获取请求头的信息,它可以获取多个值的情况
cookieMap它可以获取当前请求的Cookie 信息
initParamMap它可以获取在web.xml 中配置的上下文参数
1.6.1 获取四大特定域对象中的属性
  <body>
    <%
      pageContext.setAttribute("kye","pageContext");
      request.setAttribute("key","request");
      session.setAttribute("key","session");
      application.setAttribute("kye","application");
    %>
      ${requestScope.key}<br/><br/>
      ${applicationScope.key}
  </body>
1.6.2 pageContext对象的使用
<%--  pageContext对象的使用--%>
    <%
      pageContext.setAttribute("req",request);
    %>
  1.请求协议: ${req.scheme}<br/>
  2. 服务器的Ip:${pageContext.request.serverName }<br/>
  3. 服务器的端口:${pageContext.request.serverPort }<br/>
  4. 获取工程路径:${pageContext.request.contextPath }<br/>
  5 获取请求方法:${pageContext.request.method}<br/>
  6 . 获取客户端的ip地址: ${pageContext.request.remoteHost}<br/>
  7. 获取客户端的回话ID:${pageContext.session.id}<br/>
1.6.3 其他的隐含对象的使用
<%--  其他隐含对象的使用
  http://localhost:8080/index.jsp?username=admin&password=123456&hobby=java&hobby=html
--%>
  <hr/>
  输出请求参数username的值:${param.username}<br/>
  输出请求参数password的值:${param.password}<br/>
<%--  使用paramValues获取多值--%>
    输出请求参数username的值:${paramValues.username[0]}<br/>
    输出请求参数hobby1的值:${paramValues.hobby[0]}<br/>
    输出请求参数hobby2的值:${paramValues.hobby[1]}<br/>

常见的请求头
请添加图片描述

<%--  获取头信息--%>
  输出请求头[Cookie]:${header['Cookie']}<br/>
    输出请求头[User-Agent ]:${header['User-Agent']}<br/>
      输出请求头[User-Agent ]:${headerValues['User-Agent'][0]}<br/>
  </body>

获取上下文参数

    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>tiger</param-value>
    </context-param>
<%--  获取上下文参数--%>
    输出&lt;context-param&gt;参数username的值:${initParam.username}<br/>
    输出&lt;context-param&gt;参数password的值:${initParam.password}

1.7 JSTL标签库

JSTL标签库全称是JSP standard Tag Library 标准标签库 是一个不断完善的开源的jsp标签库
EL表达式主要替换了jsp的表达式脚本,而标签库是为了替换代码脚本

1.7.1 JSTL的五大功能模块
<%--引入所需要的标签库--%>
<%--jstl的核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--xml标签库--%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%--格式化标签库--%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--函数标签库--%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%--SQL标签库--%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
1.7.2 核心库的使用
<%--使用c:set给域对象存储数据   作用就类似于域对象的。setArrtribute()--%>
    <c:set scope="session" var="abc" value="abcValue"/>
${sessionScope.abc}
<%--c:if  test属性是判断的条件 使用el表达式关系判断--%>
<%
    request.setAttribute("age",20);
%>
<c:if test="${age >= 18}">
    <h1>成年人</h1>
</c:if>
<c:if test="${age < 18}">
    <h1>未成年人</h1>
</c:if>
<c:choose>
    <c:when test="${age <=10}">
        <h1>儿童</h1>
    </c:when>
    <c:when test="${age > 10 && age <18}">
        <h1>青少年</h1>
    </c:when>
    <c:otherwise>
        <c:choose>
            <c:when test="${age < 30}">
                <h1>青 年</h1>
            </c:when>
            <c:when test="${age >= 30 and age <50}">
                <h1>中 年</h1>
            </c:when>
            <c:otherwise>
                <h1>老 年</h1>
            </c:otherwise>
        </c:choose>
    </c:otherwise>
</c:choose>
<table border="1">
<%--
begin 表示开始的索引
end  结束索引
var  表示循环的变量
--%>
    <c:forEach begin="1" end="10" var="i">
        <tr>
            <td>
                第${i}</td>
        </tr>
    </c:forEach>
<%--    使用循环遍历数组--%>
    <%
        request.setAttribute("attr",new String[]{"java","html","css","js"});
    %>
<%--
    item表示遍历的集合(数据源)
    var 遍历得到的集合的每一项
--%>
    <c:forEach items="${requestScope.attr}" var="arr">
        ${arr}
    </c:forEach>
<%--遍历map--%>
    <%
        Map<String,Object> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
    %>
    <c:forEach items="${requestScope.map}" var="entry">
        ${entry.key}---${entry.value}
    </c:forEach>

每一个jsp页面都应该是由servlet跳转过来的

1.7.3 格式化标签库
<!--通过类型来格式-->
<fmt:formatDate value="${stu.birthday}"  type="date"></fmt:formatDate>
<!--自定义格式-->
<fmt:formatDate value="${stu.birthday}"  pattern="yyyy-MM-dd"></fmt:formatDate>

value:显示的日期 type:date、time、both

<fmt:formatNumber value="${balance}" type="currency"/><br/>
    <fmt:formatNumber value="${balance}" type="number"/><br/>
    <fmt:formatNumber value="${balance}" pattern="###,###.##"  />

type:number currency percent pattern:自定义格式 0/#代表一位数字

1.7.4 函数标签库
<c:set value="   hell   oworld  " var="str"></c:set>
 <p>字符串的长度:${fn:length(str)}</p>
<p>字符串的子串:${fn:substring(str,3 ,5 )}</p>
<p>字符串的转化为大写:${fn:toUpperCase(str)}</p>
    <p>字符串的去除空格:${fn:trim(str)}</p>
函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()去除收尾空格
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值