JavaWeb-jsp技术

jsp快速入门

JSP(全称Java Server Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。

1. 创建JSP文件

在这里插入图片描述

2. 编写 HTML标签 和 Java代码

在这里插入图片描述

jsp原理

在这里插入图片描述
jsp=html+java,用于简化开发
它本质上就是一个servlet
jsp在被访问时,由jsp容器(tomcat)将其转换为java文件(servlet),在由jsp容器将其编译,最终对外提供服务的其实就是这个字节码文件

jsp脚本

JSP脚本用于在 JSP页面内定义 Java代码
jsp脚本有三类
1、<%…%>:内容会直接放到_jspService()方法之中
2、<%=…%>:内容会放到out.print()中,作为out.print()的参数
3、<%!…%>:内容会放到_jspService()方法之外,被类直接包含
示例代码:

<body>
<h1>Hello jsp!</h1>
<% System.out.printf("Hello World!"); %>
<%= "Hello World11!" %>
<%!
    public void hello(){
        System.out.printf("Hello World22!");
    }
%>
<% out.println("Hello World33!"); %>
<% hello(); %>
</body>

EL表达式

EL表达式介绍

MVC模式设计程序中,JSP只是用来表示视图,视图的任务就是显示响应,而不是在JSP中做任何关于程序控制和业务逻辑的事情。所以在JSP页面中应该尽可能少的、或者是完全不出现Java代码。
EL是JSP 2.0增加的技术规范,其全称是表达式语言(Expression Language)。EL语言的灵感来自于ECMAScript和XPath表达式语言。EL表达式语言是一种简单的语言,提供了在JSP中简化表达式的方法,目的是为了尽量减少JSP页面中的Java代码,使得JSP页面的处理程序编写起来更加简洁,便于开发和维护。
在JSP中访问模型对象是通过EL表达式的语法来表达。所有EL表达式的格式都是以“ ”表示。例如, {}”表示。 例如, 表示。例如,{ userinfo}代表获取变量userinfo的值。
当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找。

EL表达式作用

1、执行运算
利用 EL 表达式可以在 Jsp 页面中执行一些基本的关系运算、逻辑运算和算术运算,用于完成一些简单的逻辑运算。${user==null}
2、获取数据
EL 表达式主要用于替换 Jsp 页面中的脚本表达式,它可以从各种作用域中检索 Java 对象和获取数据。(request、session、application、list、map、array 等)
3、获取 Web 对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,Web 开发人员可以很轻松获得对 Web 常用对象的引用,从而获得这些对象中的数据。
4、调用 Java 方法
EL 表达式允许用户开发自定义 EL 函数,以在 Jsp 页面中通过 EL 表达式调用 Java 类的方法。

执行运算

在这里插入图片描述
执行运算实例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>EL表达式运算符</title>
</head>
<body>
EL 表达式进行算数运算:${1 + 1}、${1 - 1}、${2 * 2}、${1 / 2}、${1 mod 2}、${(1 + 2) * 3}
<hr>
<br>
EL 表达式进行关系运算:${emp eq null}、${1 != 2}、${2 ge 3}、${3 lt 3}<hr>
<br>
EL 表达式进行逻辑运算:${true || false}、${true && false}、${!(1 == 1)}、${empty(null)}
<hr>
<br>
EL 表达式中使用三元表达式:${1==1 ? 'Yes' : 'No'}
<br/>
</body>
</html>
获取数据

L只能从四大域中获取属性,EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
EL表达式可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据。
1、准备类

public class Role {
    private String roleId;
    private String roleName;
    public String getRoleId() {
        return roleId;
    }
    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
}
public class Users {
    private String userId;
    private String username;
    private String realName;
    private Role role;
   }

jsp页面

<body>
<%
    request.setAttribute("name", "zhouzhuo");
%>
使用 EL 表达式获取数据:${name}
${requestScope.name}
<hr>
<br>
<%
Users user = new Users();
user.setUsername("admin");
user.setRealName("管理员");
request.setAttribute("user", user);
%>
使用 EL 表达式可以获取对象的属性:${user.userId}、${user.realName}
<hr>
<br>
<%
    Role role = new Role();
    role.setRoleId("01");
    role.setRoleName("教学部");
    user.setRole(role);
    request.setAttribute("user", user);
%>
使用 EL 表达式可以获取对象中的对象属性:${user.role.roleId}、${user.role.roleName}
</body>
<body>
<%
    Users user1 = new Users();
    user1.setUsername("1001");
    user1.setRealName("张三");
    Users user2 = new Users();
    user2.setUsername("1002");
    user2.setRealName("李四");
    List<Users> list = new ArrayList<Users>();
    list.add(user1);
    list.add(user2);
    request.setAttribute("list", list);
%>
使用 EL 表达式获取list集合中指定位置的数据:${list[0].realName}、${list[1].realName}
<hr>
<br>
<%
    Map<String, String> map = new LinkedHashMap<String, String>();
    map.put("a", "aaaa");
    map.put("b", "bbbb");
    map.put("c", "cccc");
    request.setAttribute("map", map);
%>
使用 EL 表达式获取map集合的数据${map.a} ${map["c"]}
</body>
获取web对象

EL 表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
在这里插入图片描述

<body>
获取 Jsp 页面中的pageContext对象:${pageContext}
<hr><br>
<%
    pageContext.setAttribute("name", "张三1"); //map
%>
从page域(pageScope)中查找数据:${pageScope.name}
<hr><br>
<%
    request.setAttribute("name", "张三2"); //map
%>
从request域(requestScope)中获取数据:${requestScope.name}
<hr><br>
<%
    session.setAttribute("name", "张三3"); //map
%>
从session域(sessionScope)中获取数据:${sessionScope.name}
<hr><br>
<%
    application.setAttribute("name", "张三4"); //map
%>
从application域(applicationScope)中获取数据:${applicationScope.name}
</body>
<body>
<!--
    param和paramValues对象用来访问参数值。
    通过使用request.getParameter方法和request.getParameterValues方法。
    param对象返回单一的字符串,而paramValues对象则返回一个字符串数组。
-->
<!-- http://localhost:8080/javaWeb/index.jsp?userId=admin -->
从request请求中获取参数:${param.userId}
<hr>
<br>
<!-- http://localhost:8080/javaWeb/index.jsp?hobby=java&hobby=python -->
从request请求中获取参数:${paramValues.hobby[0]}、${paramValues.hobby[1]}
<hr>
<br> 从header请求头中获取参数:${header.Host}、${header["Accept-Language"]}
<hr>
<br> 从header请求头中获取参数:${headerValues.Accept[0]}、${headerValues["Accept-Encoding"][0]}
<hr>
<br>从cookie对象中取值:${cookie.JSESSIONID.value}
<hr>
<br> initParam对象获取在web.xml文件中配置的初始化参数:${initParam.url}
</body>

jstl标签

JSTL介绍

JSTL(Java server pages standarded tag library,即 Jsp 标准标签库)是由 JCP(Java community Proces)所制定的标准规范,它主要提供给 Java Web 开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代 Jsp 页面上的 Java 代码,从而提高程序的可读性,降低程序的维护难度。
通俗的理解,JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的。使用 JSLT 标签的目的就是不希望在 Jsp 页面中出现 Java 逻辑代码。
在 Jsp 页面引入核心标签库的代码为:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
此外,还需要引入一个依赖jar包

引入依赖
<dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>2.0.0</version>
</dependency>
JSTL优点

1、简化了 Jsp 和Web应用程序的开发。
2、在应用程序服务器之间提供了一致的接口,最大限度地提高了·Web应用在各应用服务器之间的移植。
3、允许 Jsp 设计工具与Web应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。
4、以一种统一的方式减少了 Jsp 中的Scriptlets代码数量,可以达到程序中没有任何Scriptlest代码。
5、JSTL封装了 Jsp 开发中的常用功能。比如说,在没有JSTL时,通过Scriptlets来迭代输出某个List(Set),有了JSTL,就可以使用它的一系列的Tag进行迭代输出。由于JSTL是 Jsp 2.0规范的一部分,所以最新的Web容器都会支持它

JSTL常用标签介绍

JSTL包含了和以下操作相关的标签:
1、核心标签:核心标签库是整个JSTL中最常用的部分,主要由以下几部分组成:基本输入输出、流程控制、迭代操作和URL操作。负责Web应用的常见工作,如:循环、表达式赋值、基本输入输出等。
2、I18N格式标签库:用来格式化显示数据的工作,如:日期格式化,国际化等。
3、XML标签库:用来访问XML文件的工作,支持 Jsp 对XML文档的处理。(几乎不用)
4、数据库标签库:SQL标签库的逻辑操作,包括查询、更新、事务处理、设置数据源等。可以做访问数据库的工作。(几乎不用)
5、函数标签库:用来读取已经定义的某个函数。
在这里插入图片描述

c:out示例
<body>
<h4>out标签实例:</h4>
<br>
<!--直接输出了一个字符串。 -->
<c:out value="JSTL的out标签的使用" />
<hr><br>
<c:out value="<a href='http://baidu.com/'>百度</a>" />
<hr><br>
<!--escapeXml="false"表示value值中的html标签不进行转义,而是直接输出 -->
<c:out value="<a href='http://baidu.com/'>百度</a>" escapeXml="false" />
<hr><br>
<c:out value="&lt使用字符转义&gt" />
<hr><br>
<c:out value="&lt未使用字符转义&gt" escapeXml="false"></c:out>
<hr><br>
<!-- 设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。 -->
<c:out value="${null}" default="默认值" />
<hr><br>
<!-- 未设定默认值,输出结果为空。 -->
<c:out value="${null}" />
</body>
c:set示例:
<body>
<h5>给指定scope范围赋值:</h5>
<c:set var="name" value="page" scope="page" />
从page域中得到值:${pageScope.name}<br>
<c:set var="name" value="request" scope="request" />
从request域中得到值:${requestScope.name}<br>
<c:set var="name" value="session" scope="session" />
从session域中得到值:${sessionScope.name}<br>
<c:set var="name" scope="application">application</c:set>
使用&lt;c:out&gt;和el,从application域中得到值:
<c:out value="${applicationScope.name}">
   未得到name的值
</c:out>
<br><hr>
<h5>操作JavaBean</h5>
<jsp:useBean id="emp" class="com.dts.entity.Emp" scope="page" />
<!-- 设置JavaBean的属性值 -->
<c:set target="${emp}" property="empId">001</c:set>
<c:set target="${emp}" property="empName">教研部</c:set>
使用的目标对象为:${person} <br>Bean中获得的empno值为:
<c:out value="${emp.empId}" /><br>Bean中获得的ename值为:
<c:out value="${emp.empName}" /><br>
<h5>操作Map</h5>
<%
    Map<String, String> map = new HashMap<String, String>();
    request.setAttribute("map", map);
%>
<!--将data对象的值存储到map集合中 -->
<c:set property="company" value="isoftstone" target="${map}" />Map中取值:${map.company}

</body>
c:remove示例:
<body>
<h4>set标签实例:</h4>
使用set标签设置变量
<c:set var="name" value="tom" scope="page" />
<c:set var="age" value="18" scope="session" />
<p>
    name:
    <c:out value="${pageScope.name}" />
</p>
<p>
    age:
    <c:out value="${sessionScope.age}" />
</p>
<hr>
使用remove标签移除age变量
<c:remove var="age" scope="session"/>
<p>
    name:
    <c:out value="${pageScope.name}" />
</p>
<p>
    age:
    <c:out value="${sessionScope.age}" />
</p>
</body>
c:catch示例:
<body>
<h4>catch标签实例</h4>
<!--把容易产生异常的代码放在<c:catch></c:catch>中,自定义一个变量errorInfo用于存储异常信息 -->
<c:catch var="errorInfo">
    <%=1 / 0%>
</c:catch>
<p>EL表达式输出异常:</p>
<p>
    异常 : ${errorInfo} <br> 异常信息 : ${errorInfo.message}
</p>
</body>
c:if 示例:
<body>
<h4>if标签示例:</h4>
<c:set var="company" value="isoftstone" scope="page" />
<c:if test="${pageScope.company == 'isoftstone' }" var="result" scope="session">
    <c:out value="软通动力欢迎您的加入! " />
</c:if>
${result}
</body>
<c:choose>、<c:when> 和 <c:otherwise>示例:
<body>
<%--通过set标签设定score的值为85 --%>
<c:set var="score" value="85" />
<c:choose>
    <c:when test="${score >= 90}">
        你的成绩为优秀!
    </c:when>
    <c:when test="${score > 70 && score < 90}">
        您的成绩为良好!
    </c:when>
    <c:when test="${score > 60 && score < 70}">
        您的成绩为及格
    </c:when>
    <c:otherwise>
        对不起,您没有通过考试!
    </c:otherwise>
</c:choose>
</body>
c:forEach示例:
<body>
<%
    int[] array = { 0, 1, 2, 3, 4 };
    pageContext.setAttribute("array", array);
%>
不指定begin和end的迭代:
<!-- 从集合的第一个元素开始,遍历到最后一个元素 -->
<c:forEach var="num" items="${array}">
    &nbsp;<c:out value="${num}" />
</c:forEach>
<br> 指定begin和end的迭代:
<!--指定begin的值为1、end的值为4、step的值为2 -->
<!-- 第二个开始,每两个遍历一次,第五个遍历结束 -->
<c:forEach var="num" items="${array}" begin="1" end="4" step="2">
    &nbsp;<c:out value="${num}" />
</c:forEach>
<br>输出整个迭代的信息:<br>
<%--指定varStatus的属性名为s,并取出存储的状态信息 --%>
<c:forEach var="num" items="${array}" begin="3" end="4" varStatus="status" step="1">
    <c:out value="${num}" />&nbsp;的四种属性:
    index = ${status.index}、count = ${status.count}、first = ${status.first}、last = ${status.last}
    <br>
</c:forEach>
</body>
c:forTokens 示例:
<body>
<c:forTokens var="str" items="bai、du、a、a、欢、迎、您" delims="、">
    ${str}
</c:forTokens>
<hr>
<c:forTokens items="1*2*3*4*5*6*7" delims="*" begin="1" end="6" step="2" var="num" varStatus="status">
    <c:out value="${num}" />&nbsp;的四种属性:
    index = ${status.index}、count = ${status.count}、first = ${status.first}、last = ${status.last}
    <br>
</c:forTokens>
<hr>
<%
    String operate = "增加,删除,修改,查询";
    pageContext.setAttribute("operate", operate);
%>
<c:forTokens var="str" items="${operate }" delims="," varStatus="status">
    <input type="checkbox" name="operate" value="${status.index}"> ${str}
</c:forTokens>
</body>
c:import 示例:
<c:import url="http://wwww.baidu.com" charEncoding="utf-8" />
<c:import url="index.jsp" charEncoding="utf-8" />
函数标签常用示例:

<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions”%>

<body>
<c:set var="string" value="hello , welcome to java web"/>
<c:out value="${string}"></c:out>
<c:if test="${fn:startsWith(string, 'hello')}">
    <p>字符串以hello开头</p>
</c:if>
<c:if test="${fn:endsWith(string, 'web')}">
    <p>字符串以web结尾</p>
</c:if>
<c:set var="string1" value="hello java"/>
<c:set var="string2" value="${fn:split(string1, ' ')}" />
<c:set var="string3" value="${fn:join(string2, '-')}" />
<p>将hello java空格替换为-:${string3}</p>
<c:set var="string1" value="这是第一个字符串。"/>
<c:set var="string2" value="${fn:substring(string1, 5, 15)}" /></body>
格式化标签

JSTL 格式化标签用来格式化并输出文本、日期、时间、数字。

语法
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>

   <body><p>日期解析:2021-11-02 08:10:10</p>
<c:set var="strDate" value="2021-11-02 08:10:10" />
<fmt:parseDate value="${strDate}" var="parseStrDate"
              pattern="yyyy-MM-dd HH:mm:ss" />
<p>解析后的日期为:<c:out value="${parseStrDate}" /></p>
<p>日期格式化</p>
<c:set var="now" value="<%=new java.util.Date()%>" />
<p>当前日期格式化: <fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${now}" /></p>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值