jsp

tomcatwork目录: tomcat服务器存放jsp运行时的临时文件

 

 

Jsp的执行过程

 

 

tomcat扫描到jsp文件,在%tomcat%/workjsp文件翻译成java源文件

 

 

tomcat服务器把java源文件编译成class字节码文件 

 

 

tomcat服务器构造_01_hello_jsp类对象

 

 

 

为什么Jsp就是servlet

 

 

extends org.apache.jasper.runtime.HttpJspBase  implements org.apache.jasper.runtime.JspSourceDependent

 

 

HttpJspBase类  就是集成servlet

 

 

 

Jsp的生命周期

 

1)翻译: jsp->java文件

 

2)编译: java文件->class文件(servlet程序)

 

3)构造方法(第1次访问)

 

4)init方法(第1次访问):_jspInit()

 

5)service方法:_jspService()

 

6)destroy方法:_jspDestroy()

 

语法: <%!--  jsp注释  --%>

 

html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。

 

 

指令:

 

include指令

 

作用: 在当前页面用于包含其他页面

 

语法: <%@include file="common/header.jsp"%>

 

 

原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp),合并成翻译成一 java源文件,再编译运行!!,这种包含叫静态包含(源码包含)

 

 

如果使用静态包含,被包含页面中不需要出现全局的html标签了(如htmlhead body)

 

 

 

page指令

 

 

 

作用: 告诉tomcat服务器如何翻译jsp文件

 

 

import="java.util.*" --告诉服务器java文件使用什么包导入包,多个包之间用逗号分割

 

 

pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件

 

contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码

 

errorPage="error.jsp"

isErrorPage="false"

buffer="8kb"

session="true"

isELIgnored="false"

 

taglib指令

 

 

配置全局的错误处理页面

 

复制代码
  <!-- 全局错误处理页面配置 -->
  <error-page>
      <error-code>500</error-code>
      <location>/common/500.jsp</location>
  </error-page>
  <error-page>
      <error-code>404</error-code>
      <location>/common/404.html</location>
  </error-page>
复制代码

9大内置对象

内置对象名          类型

request    HttpServletRequest

response      HttpServletResponse

config        ServletConfig

application        ServletContext

session         HttpSession

exception        Throwable

page            Object(this)

out             JspWriter

pageContext     PageContext 

 

Out对象:out对象类型,JspWriter类,相当于带缓存的PrintWriter

当满足以下条件之一,缓冲区内容写出:

1)缓冲区满了

2)刷新缓存区

3)关闭缓存区

4)执行完毕jsp页面

 

 

pageContext对象

 

 

pageContext对象的类型是PageContext,叫jsp的上下文对象 可以获取其他八个内置对象

 

使用场景: 在自定义标签的时候,PageContext对象频繁使用到

 

 

本身是一个域对象

保存数据:

 

 

默认情况下,保存到page域 pageContext.setAttribute("name");

 

可以向四个域对象保存数据  pageContext.setAttribute("name",域范围常量)

 

读取数据

pageContext.getAttribute("name")

pageContext.getAttribute("name",域范围常量)

PageContext.PAGE_SCOPE  ... 

 

自动在四个域中搜索数据

pageContext.findAttribute("name");

顺序: page-> request-> session- > context域(application域)

 

Jsp中的四个域对象

pageContext      page域       只能在当前jsp页面中使用(当前页面)

request          request域       只能在同一个请求中使用(转发)

session          session域       只能在同一个会话(session对象)中使用(私有的)

application       context域       只能在同一个web应用中使用。(全局的)

 

使用EL表达式替换掉jsp表达式

EL作用:向浏览器输出域对象中的变量值或表达式计算的结果

语法: ${变量或表达式}

输出基本数据类型变量       

${name}        从四个域获取               域范围: pageScoep / requestScope / sessionScope / applicationScope

${pageScope.name}   指定域获取       

 

jsp标签

标签的作用:替换jsp脚本

流程判断(if   for循环)  跳转页面(转发,重定向)

 

Jsp标签分类

内置标签(动作标签): 不需要在jsp页面导入标签

jstl标签: 需要在jsp页面中导入标签

 

自定义标签 开发者自行定义,需要在jsp页面导入标签

 

   

 

动作标签

转发标签: <jsp:forward />

参数标签:  <jsp:pararm/>

包含标签:  <jsp:include/>

原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。

(先翻译再合并),动态包含

 

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

1) 语法不同

静态包含语法: <%@inclue file="被包含的页面"%>

动态包含语法: <jsp:include page="被包含的页面">

 

2)参数传递不同

静态包含不能向被包含页面传递参数

动态包含可以向被包含页面传递参数

 

3)原理不同

静态包含: 先合并再翻译

动态包含: 先翻译再合并

 

 

JSTL标签: java标准标签库

 

 

核心标签库 c标签库) 重点

国际化标签(fmt标签库)

EL函数库(fn函数库)

xml标签库(x标签库)

sql标签库(sql标签库)

 

使用步骤:

导入jstl支持的jar包(标签背后隐藏的java代码)

使用taglib指令导入标签库  <%@taglib uri="tld文件的uri名称" prefix="简写" %>

 

 

核心标签库的重点标签:

保存数据:<c:set></c:set>   

获取数据:<c:out value=""></c:out>

单条件判断:<c:if test=""></c:if>

多条件判断:

          <c:choose></c:choose>

         <c:when test=""></c:when>

          <c:otherwise></c:otherwise>

循环数据

          <c:forEach></c:forEach>

          <c:forTokens items="" delims=""></c:forTokens>

重定向

          <c:redirect></c:redirect>

复制代码
<%--set标签 :保存数据(保存到域中)默认保存到page域 --%>
    <c:set var="name" value="rose" scope="request"></c:set>
    

   
    <%--out标签: 获取数据(从域中) 
    default: 当value值为null时,使用默认值
    escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
    --%>
    <c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>
    
    <hr/>
    
    <%--if标签 :单条件判断--%>
    <c:if test="${!empty msg}">
        条件成立
    </c:if>
    
    <hr/>
    <%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
    <c:set var="score" value="56"></c:set>
    
    <c:choose>
        <c:when test="${score>=90 && score<=100}">
            优秀
        </c:when>
        <c:when test="${score>=80 && score<90}">
            良好
        </c:when>
        <c:when test="${score>=70 && score<80}">
            一般
        </c:when>
        <c:when test="${score>=60 && score<70}">
            及格
        </c:when>
        <c:otherwise>
            不及格
        </c:otherwise>
    </c:choose>
    
    <%-- forEach标签:循环 --%>
    <%
        //List
         List<Student>  list = new ArrayList<Student>();
         list.add(new Student("rose",18));
         list.add(new Student("jack",28));
         list.add(new Student("lucy",38));
         //放入域中
         pageContext.setAttribute("list",list);
         
         //Map
         Map<String,Student> map = new HashMap<String,Student>();
         map.put("100",new Student("mark",20));
         map.put("101",new Student("maxwell",30));
         map.put("102",new Student("narci",40));
         //放入域中
         pageContext.setAttribute("map",map);
     %>
     <hr/>
     <%--
      begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
      end="":     到哪个元素结束。默认到最后一个元素
      step="" : 步长    (每次加几)  ,默认1
      items="": 需要遍历的数据(集合) 
      var="": 每个元素的名称 
      varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)
      
     --%>
    <c:forEach items="${list}" var="student" varStatus="varSta">
        序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
    </c:forEach>
    
    <hr/>
    
    <c:forEach items="${map}" var="entry">
        ${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
    </c:forEach>
    <hr/>
    <%-- forToken标签: 循环特殊字符串 --%>
    <%
        String str = "java-php-net-平面";
        pageContext.setAttribute("str",str);
     %>
    
    <c:forTokens items="${str}" delims="-" var="s">
        ${s }<br/>
    </c:forTokens>
    
    <%--redrict:重定向 --%>
    <c:redirect url="http://www.baidu.com"></c:redirect>
复制代码

JavaBean

这个Java类必须具有一个无参的构造函数 属性必须私有化。

私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

 

posted @   escapist  阅读(110)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示