WEB-03

1.JSP

1.1 JSP的模板修改和注释

在IDEA中File下拉选择Setting,搜索jsp,找到File Encoding,修改即可。

1.2 JSP的注释

由于JSP = HTML + Java代码 + JSP自身,所以有三种注释
存在时机:

  • 存在JSP的源码中,翻译成HTML后这个注释也存在,在生成HTML响应到页面的时候这个注释也会存在。

1.2.1 HTML的注释

<!-- html的注释 -->

1.2.2 Java代码的注释

<% 
	//单行注释
	/*多行注释*/
	/** 文档注释 **/
%>

存在时机:

  • 存在JSP的源码中,翻译成Servlet后Java代码的注释也会存在,但是在生成HTML相应到页面后,这种注释就会消失

1.2.3 JSP注释

<%--JSP的注释--%>

存在时机:

  • 存在JSP的源码中,翻译Servlet后注释就没有了

注意:Java代码注释的话不要使用HTML的注释!!!

1.3 JSP的指令元素

1.3.1 JSP指令元素的概述

  • 用于指示JSP执行的某些步骤
  • 用于指示JSP表现特定行为

1.3.2 JSP指令元素的语法

语法:
<% @ 指令名称 属性1名称=属性的值 属性2名称=属性的值 %>

1.3.3 JSP指令元素的分类

page指令
用来指示JSP的页面设置属性和行为

include指令
指示JSP包含哪些其他页面

taglib指令
指示JSP的页面包含(引入了)哪些标签库

1.4 JSP的指令-page指令

1.4.1 写法

<%@ page 属性名=属性值 %>

Page指令用来定义JSP文件的全局属性。
这些属性可以单独使用,也可以几个或多个同时使用。
在JSP页面中,只有import属性可以出现多次,其他属性只能出现一次。

1.4.2 Page指令属性

language属性: 声明使用脚本的语言。

extends属性: 标明JSP编译成Servlet的时候继承的类。默认值:HttpBase。

session属性: 用来标明JSP中是否可以直接使用session对象。默认值是true。

buffer属性: 标明JSP对客户端输出缓冲区大小。默认值8kb。

autoFlush属性: 如果缓冲区大小溢出,是否自动刷出。默认true。

※ import属性: 用于导入Java包或类。

※ contentType属性: 标明JSP被浏览器解析和打开的时候采用的默认的字符集。

※ pageEncoding属性: JSP文件及JSP翻译后的Servlet保存到硬盘上采用的字符集。

isErrorPage属性: 处理JSP页面异常。

errorPage属性: 处理JSP页面异常。

isELIgnored属性: 通知JSP是否忽略EL表达式。

1.5 JSP的指令-include和taglib指令

1.5.1 Include指令

1.5.1.1 写法

<%@ include 属性名=属性值 %>

在JSP文件当中静态包含一个文件,同时由该JSP解析包含的文件内容。
在后面会学习动态包含。

1.5.1.2 Include指令属性

file属性: 指示JSP页面包含页面的路径。

1.5.1.3 Include指令原理(静态包含原理)

在这里插入图片描述
注意地方:

  • 应该将被包含的页面的结构去掉,如下图所示
    在这里插入图片描述
  • 在被包含的页面中定义变量,在包含的页面中还可以使用。

1.5.2 taglib指令

1.5.2.1 写法

<%@ taglib 属性名=属性值 %>

用于在JSP页面中引入标签库。

1.5.2.2 Taglib指令属性

uri属性: 引入标签库的路径
prefix属性: 引入标签库的别名

1.6 JSP的内置对象

1.6.1 JSP的内置对象概述

指的是可以直接在JSP页面中使用的对象。
也就是无需创建,在<%%>中可以直接使用的对象就是内置对象。

JSP的内置对象有哪些

① request:从客户端向服务器发送的请求对象。

② response:从服务器端向客户端做出响应对象。

③ session:服务端为客户端创建会话对象。

④ application:代表应用。获得的ServletContext对象。

⑤ out:向输出流写入内容的对象。

⑥ page:当前的JSP翻译成Servlet后的对象引用。

⑦ pageContext:本JSP的页面的上下文对象。

⑧ config:本JSP的ServletConfig对象。

⑨ exception:表示JSP页面运行时产生的异常对象。

1.6.2 JSP的内置对象具体类型

  • request HttpServletRequest
  • response HttpServletResponse
  • session HttpSession
  • application ServletContext
  • config ServletConfig
  • page Object
  • pageContext PageContext
  • out JspWriter
  • exception Throwable

1.6.3 pageContext对象的概述

1.6.3.1 pageContext简介

pageContext对象直接翻译为“页面上下文”对象,代表的是当前页面运行的一些属性。

它是javax.serlvet.jsp.PageContext类的实例对象

1.6.3.2 作用

① 提供了page范围的数据存取的方法:

  • 向page范围中存入数据:
    在这里插入图片描述
  • 从page范围获取元素:
    在这里插入图片描述
  • 从page范围移除元素:
    在这里插入图片描述
  • 查找属性的方法:
    在这里插入图片描述

② 通过这个对象获得其他的8个内置对象:
在这里插入图片描述
在这里插入图片描述

1.6.3.3 pageContext作为域对象的存取范围

JSP的四个作用范围
在jsp中,除了ServletContext,Request,Session外,还有pageContext可作为域对象存取数据。
在这里对着四种域对象的作用范围进行分析。

PageScope:页面范围

  • 页面范围指的是在当前的页面内有效,出了这个页面,用pageContext保存的数据就无效了。

RequestScope:请求范围

  • 从客户端向服务器发送一次请求,服务器对这次请求作出了响应之后,用request保存的数据就无效了。

SessionScope:会话范围

  • 每个浏览器向服务器发送请求(多次请求)。会话结束就销毁数据。

ApplicationScope:应用范围

  • 在整个应用中任意的地方都可以获取。

代码演示:

<body>
<h1>JSP的四个作用范围</h1>

<%
    //page范围(pageContext)
    pageContext.setAttribute("name","张三");
    //request范围
    request.setAttribute("name","李四");
    //Session范围
    session.setAttribute("name","王五");
    //application范围
    application.setAttribute("name","赵六");
%>
<h1>
    当前页面获取值
</h1>
<%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>

<%--<%   
    //转发到scopeDemo2.jsp
    //发现张三没了
	request.getRequestDispatcher("/demo2/scopeDemo2.jsp").forward(request,response);
%>--%>

<a href="scopeDemo2.jsp">第二次请求,跳转</a>
<!-- 跳转后发现李四没了 -->

<!-- 关闭浏览器再直接打开scopeDemo2.jsp后发现王五没了 -->
</body>
1.6.3.4 pageContext对象向四个域范围存取数据
<%
    //page范围(pageContext)
    pageContext.setAttribute("name","张三");
    //request范围
//    request.setAttribute("name","李四");
    pageContext.setAttribute("name","李四",PageContext.REQUEST_SCOPE);
    //Session范围
//    session.setAttribute("name","王五");
    pageContext.setAttribute("name","王五",PageContext.SESSION_SCOPE);
    //application范围
//    application.setAttribute("name","赵六");
    pageContext.setAttribute("name","赵六",PageContext.APPLICATION_SCOPE);
%>
<h1>
    当前页面获取值
</h1>
<%=pageContext.getAttribute("name")%><br>
<%=request.getAttribute("name")%><%=pageContext.getAttribute("name",PageContext.REQUEST_SCOPE)%><br>
<%=session.getAttribute("name")%><%=pageContext.getAttribute("name",PageContext.SESSION_SCOPE)%><br>
<%=application.getAttribute("name")%><%=pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE)%>
1.6.3.5 findAttribute方法

查找属性方法:先根据小范围的名称进行查找,如果找到了就返回,如果没有找到就会去比其大一个域的范围进行查找。

即先在pageContext找,找不到就去request找,然后去session找,然后去application找。

1.7 JSP的动作标签

1.7.1 JSP的动作标签概述

JSP的动作标签用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成jsp页面难以维护。

1.7.2 常用的动作标签

<jsp:forward/>:请求转发。
<jsp:include/>:包含(动态包含)。
<jsp:param/>:传递参数。

1.7.3 动态包含原理分析

在这里插入图片描述
与静态包含的区别在于:
动态包含是在执行的时候,编译执行每一个被包含的元素。
静态包含是在编译成java文件的时候,将其他被包含的jsp都复制到当前jsp中,最终只形成一个java文件。

2.EL

2.1 EL的概述

在这里插入图片描述
EL:Expression Language 表达式语言。

2.1.1 作用(为什么学习EL)

EL和JSTL一起使用取代JSP页面中嵌入Java代码写法(尖括号百分号)。

2.1.2 EL功能

  • ※ EL获取数据
  • ※ EL执行运算
  • ※ EL获取web开发常用的对象
  • EL调用Java方法

2.1.3 EL语法

${ EL表达式 }

2.2 EL获取数据

EL表达式语句在执行的时候,会调用pageContext.findAttribute()方法。分别从pageContext,request,session,application范围查找响应对象,找到则返回,找不到则返回空的字符串而不是null。

EL所获取的数据需要在四个作用范围中。

2.2.1 EL获取数据演示

<h1>EL获取数据</h1>
<%--先分别向四个域中存入数据--%>
<%
    pageContext.setAttribute("name","张三");
    request.setAttribute("name","李四");
    session.setAttribute("name","王五");
    application.setAttribute("name","赵六");
%>

${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}

<%--EL简写方式--%>
${name}

2.2.2 EL获取数组和集合中的数据

2.2.2.1 获取数组中的数据
<h1>EL获取数组的数据</h1>
<%
    String[] arrs = {"aa","bb","cc"};
    pageContext.setAttribute("arrs",arrs);
%>

${arrs[0]}
${arrs[1]}
${arrs[2]}
2.2.2.2 获取List集合的数据
<h3>获取List集合的数据</h3>
<%
    ArrayList<String> strings = new ArrayList<>();
    strings.add("11");
    strings.add("22");
    strings.add("33");
    strings.add("44");
    pageContext.setAttribute("strings",strings);
%>
${strings[0]}
${strings[1]}
${strings[2]}
${strings[3]}
2.2.2.3 获取Map中的数据
<h3>获取Map中的数据</h3>
<%
    HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
    stringIntegerHashMap.put("aaa",111);
    stringIntegerHashMap.put("bbb",222);
    stringIntegerHashMap.put("ccc",333);
    stringIntegerHashMap.put("ddd",444);
    stringIntegerHashMap.put("ddd.sss",555);
    pageContext.setAttribute("Map",stringIntegerHashMap);
%>
${Map.aaa}
${Map.bbb}
${Map.ccc}
${Map.ddd}
${Map["ddd.sss"]}     <!-- ※※※ -->

注意:
如果map的key中包含了特殊字符,不能使用,必须使用[]。

2.3 EL执行运算

2.3.1 执行算数运算

<h3>执行算术运算</h3>
<%
    pageContext.setAttribute("n1","10");
    pageContext.setAttribute("n2",20);
%>
${n1+n2}

2.3.2 执行关系运算

<h3>执行关系运算</h3>
${n1<n2}  -- ${n1 lt n2}<br>
${n1>n2}  -- ${n1 gt n2}<br>
${n1 == n2}  -- ${n1 eq n2}<br>
${n1 >= n2}  -- ${n1 ge n2}<br>
${n1 <= n2}  -- ${n1 le n2}<br>
${n1 != n2}  -- ${n1 ne n2}<br>

2.3.3 执行逻辑运算

<h3>执行逻辑运算</h3>
<%
    pageContext.setAttribute("n3", 30);
    pageContext.setAttribute("n4", 40);
%>
${ (n1 < n2) && (n3 < n4) } -- ${(n1 < n2) and (n3 < n4)}<br>
${ (n1 < n2) || (n3 < n4) } -- ${(n1 < n2) or (n3 < n4)}<br>
${ !(n1 < n2)} -- ${not(n1 < n2)}<br>

2.3.4 执行三元运算

<h3>执行三元运算</h3>
${n1<n2 ? "n1小于n2" : "n1不小于n2"}

2.3.5 空运算符

<h3>空运算符</h3>
${empty user}
${not empty user}

2.4 EL获取web开发常用对象

2.4.1 常用对象有哪些

EL表达式定义了11个web开发常用对象。使用这些对象可以很方便获取web开发中的一些常见对象,并可以读取这些对象中的数据。

  • pageContext :相当于JSP内置对象中pageContext
  • pageScope :获取指定域下的名称的数据
  • requestScope :获取指定域下的名称的数据
  • sessionScope :获取指定域下的名称的数据
  • applicationScope :获取指定域下的名称的数据
  • param :在页面中接收请求参数(接收一个名称对应一个值参数)。
  • paramValues :在页面中接收请求参数(接收一个名称对应多个值参数)。
  • header :在页面上获取请求头(获取一个key对应一个value 头)
  • headerValues :在页面上获取请求头(获取一个key对应多个value 头)
  • cookie :访问cookie的名称和值(${cookie.key.name} ${cookie.key.value})
  • initParam :获取全局初始化参数的值

3.JSTL

3.1 JSTL的概述

在这里插入图片描述
JSTL:JSP的标准标签库

3.1.1 为什么学习JSTL

主要和EL来取代传统页面上直接嵌入Java代码写法(尖括号百分号)。提升程序可读性、维护性和方便性。

3.1.2 JSTL的版本

JSTL1.0、JSTL1.1、JSTL1.2版本

  • 1.0版本不支持EL表达式。
  • 1.1 和 1.2 支持了EL表达式。

3.1.3 JSTL的标签库

  • c标签(core标签库)
  • fmt标签(国际化标签库)
  • xml标签
  • sql标签
  • jstl函数库(EL函数)

3.2 JSTL的入门

3.2.1 引入JSTL的jar包

在这里插入图片描述

3.2.2 引入标签库

新建jsp后
在这里插入图片描述

3.2.3 使用JSTL

在这里插入图片描述

在使用JSTL的时候,我原本使用的是Tomcat10版本,但每次运行都报错
在这里插入图片描述
无奈之下只好换到和教程所使用版本一致的Tomcat8.5,之所以出现上述问题我猜测是Tomcat10之后,JavaEE向JakartaEE转变的原因。这个原因的具体解决方法我还未找到。

3.3 JSTL的标签

3.3.1 JSTL的if标签

使用

<h1>JSTL的if标签的使用</h1>
<c:set var="i" value="10" scope="page"></c:set>
<c:if test="${i>=10}">
    <font color="red">i大于等于10</font>
</c:if>

if标签的属性

  • test属性:条件
  • var属性:将test条件中的值赋值给一个变量,在var中定义变量
  • scope属性:var属性中定义

3.3.2 JSTL的foreach标签

<body>
<%
    String[] arrs = {"aa","bb","cc"};
    pageContext.setAttribute("arrs",arrs);

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    pageContext.setAttribute("list",list);

    Map<Integer,String> map = new HashMap<>();
    map.put(1,"Rarity");
    map.put(2,"TwilightSparkle");
    map.put(3,"SunsetShimmer");
    pageContext.setAttribute("map",map);
%>
<h1>JSTL的foreach标签的使用</h1>
<h3>遍历数组</h3>


<c:forEach var="s" items="${arrs}">
    ${s}
</c:forEach>

<h3>遍历List集合</h3>
<c:forEach var="l" items="${list}">
    ${l}
</c:forEach>

<h3>遍历Map集合</h3>
<c:forEach var="m" items="${map}">
    ${m.key} -- ${m.value}
</c:forEach>

<h3>遍历从1到10</h3>
<c:forEach var="i" begin="1" end="10" step="1">
    ${i}
</c:forEach>

<h3>遍历100到200,每次加2,到第三个数的时候将该数字变为蓝色</h3>
<c:forEach var="i" begin="100" end="200" step="2" varStatus="status">
    <c:if test="${status.count % 3 == 0}">
        <font color= "blue">${ i }</font>
    </c:if>
    <c:if test="${status.count%3!=0}">
        ${i}
    </c:if>
</c:forEach>
</body>

3.4 案例

引入jar包:
在这里插入图片描述

代码

StudentModel:

public class StudentModel {

    public List<Student> findAll() throws Exception{
        QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
        List<Student> list = qr.query("select * from user", new BeanListHandler<Student>(Student.class));
        return list;
    }
}
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //1.调用java类处理数据
            StudentModel studentModel = new StudentModel();
            List<Student> list = studentModel.findAll();
            //2.显示到jsp页面
            request.setAttribute("list",list);
            request.getRequestDispatcher("/jsp/list.jsp").forward(request,response);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值