JSP介绍

本文深入讲解JSP技术,包括JSP的基本概念、工作原理、最佳实践及目录结构。涵盖JSP脚本、指令、动作、内置对象、EL表达式、JSTL等内容,适合初学者和进阶开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSP 学习

JSP 概述

  • jsp(Java Server Page) = java + html

TIM截图20190508231108.png

  • JSP 实际就是 Servlet
  • HTML:静态内容
  • Servlet:服务端的小应用程序。适合编写java逻辑代码
  • JSP:适合编写输出动态内容,但不适合写Java逻辑
  • 测试代码
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%
    Date date = new Date();
    SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    out.print(dataFormat.format(date));
  %>
  </body>
</html>

JSP 的原理

TIM截图20190508234233.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4K6t3d2-1569499159941)(https://i.loli.net/2019/05/08/5cd2fb376b3a1.png)]

  • 服务器不执行HTML代码,全部返回给浏览器执行,服务器只执行JAVA代码

TIM截图20190509082239.png
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVd8MbqT-1569499159954)(https://i.loli.net/2019/05/09/5cd3731df00cc.png)]

JSP 的最佳实践

  • Servlet: 控制器。重点写JAVA逻辑代码(获取表单数据,处理业务逻辑、分发转向)
  • JSP: 代码显示模板。重点在于显示数据
  • 使用JSP编写服务器逻辑代码的鸡肋 ----- 登陆注销

  • 目录结构

TIM截图20190509091517.png


  • login.jsp
<%--
  Created by IntelliJ IDEA.
  User: JJR
  Date: 2019/5/9 0009
  Time: 8:34
  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>
    <%
        try{
            out.write((String) request.getSession().getAttribute("msg"));
        } catch (Exception e){
            out.write("请登录");
        }
    %>

    <form action="dologin.jsp" method="post">
        用户:<input type="text" name="username"/><br />
        密码:<input type="password" name="password" /><br />
        <input type="submit" value="登陆" />
    </form>
</body>
</html>


  • logout.jsp
<%--
  Created by IntelliJ IDEA.
  User: JJR
  Date: 2019/5/9 0009
  Time: 9:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    request.getSession().invalidate();
    request.getRequestDispatcher("/index.jsp").forward(request,response);
%>

  • dologin.jsp
<%--
  Created by IntelliJ IDEA.
  User: JJR
  Date: 2019/5/9 0009
  Time: 8:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    <%
        //获取表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //处理业务逻辑
        if("12138".equals(username) && "12138".equals(password)){
            //登陆成功
            request.getSession().setAttribute("user", username);
            request.getRequestDispatcher("/success.jsp").forward(request, response);
        }else {
            request.getSession().setAttribute("msg", "用户名或密码错误");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }

        //分发转向
    %>



  • success.jsp
<%--
  Created by IntelliJ IDEA.
  User: JJR
  Date: 2019/5/9 0009
  Time: 8:43
  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>
    欢迎您:<%
        out.write((String) request.getSession().getAttribute("user"));
    %>
    <a href="index.jsp">首页</a>
</body>
</html>


  • index.jsp
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

    <%
      try{
        out.write((String) request.getSession().getAttribute("user"));
    %>
    <a href="logout.jsp">注销</a>
    <%
      } catch (Exception e){
        %>
    <a href="login.jsp">登陆</a>
    <%
      }
    %>

  </body>
</html>

JSP 的基本语法

  1. JSP 模板元素

    • 网页静态内容 — HTML标签和文本
  2. JSP 的脚本

    • 小脚本 — <% JAVA 代码 %>
    • 表达式 — <%=2+3 %> 等价于 out.print(2+3);

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPmeQhmk-1569499159957)(https://i.loli.net/2019/05/09/5cd381ff6ebe4.png)]
    TIM截图20190509092851.png

    • 声明 — <%! %> 表示在类中定义全局变量和静态块

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhwPqGHt-1569499159962)(https://i.loli.net/2019/05/09/5cd384dc15d61.png)]
    TIM截图20190509094013.png

JSP 3个指令

page 指令

  • 属性:
  • session:是否会找到创建session对象;默认值为true.
  • buffer:设置输出数据的缓存大小,默认为8KB,取值nono|8KB|size KB
  • errorPage:如果页面出现错误,则跳转到指定的资源
    errorPage="error.jsp"
  • isErrorPage:是否创建throwable对象exception。默认是false
    <%=exception.getMessage() %>
  • contextType:等同于 response.setContextType(“text/html;charset=utf-8”);告诉浏览器按什么编码编译
  • pageEncoding:告诉JSP引擎按什么编码编译
  • isELIgnored:是否支持EL表达式。默认是false(支持)
  • isThreadSafe:是否开启线程安全

include 指令(一般使用静态包含)

  • 静态包含:把其他资源包含到当前界面中 — 转译前生成

<%@include file=“path” %>

  • 动态包含:转译之后进行包含

<jsp:include page=“path”></isp:include>

<%--
  Created by IntelliJ IDEA.
  User: JJR
  Date: 2019/5/9 0009
  Time: 15:30
  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>

<font size="50px" color="blue">
    Hello, World
</font>
<br />
<%--静态包含--%>
<%@include file="index2.jsp" %>

<br />
<%--动态包含--%>
<jsp:include page="index2.jsp"></jsp:include>
</body>
</html>

TIM截图20190509153929.png

taglib 指令

  • 作用:在JSP页面中导入JSTL标签库。替换JSP内的Java代码片段
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    同时导入:jslt.jarstandard.jar

语法:

  • <%@指令名称 属性1=“属性值1” 属性2=“属性值2” 属性3=“属性值3” %>
  • 或者
  • <%@指令名称 属性1=“属性值1” %>
  • <%@指令名称 属性2=“属性值2” %>

JSP 6个动作

    1. 动态包含
      <jsp:include>

不带参数:<jsp:include page="index2.jsp"/>
携带参数:

<jsp:include page="index2.jsp">
    <jsp:param name="name" value="12138"/>
</jsp:include>
    1. 请求转发
      <jsp:forward>
    1. 设置请求参数
      <jsp:param>
  • 示例代码

不带请求参数: <jsp:forward page="index2.jsp"></jsp:forward>
带请求参数:

<jsp:forward page="index2.jsp">
    <jsp:param name="name" value="admin"/>
    <jsp:param name="pass" value="12138"/>
</jsp:forward>
    1. 创建对象
      <jsp:useBean>
    1. 给指定对象赋值
      <jsp:setProperty>
    1. 取出指定对象值
      <jsp:getProperty>
  • 示例代码
<!-- 创建UserBean 的对象 ub -->
<jsp:useBean id="ub" class="com.test.UserBean" scope="page"/>

<!-- 为ub的name属性赋值 -->
<jsp:setProperty name="ub" property="name" value="欧阳铁柱"/>

<!-- 读取ub的name属性值 -->
<jsp:getProperty name="ub" property="name"/>

JSP 9个内置对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9tTi98Rp-1569499159970)(https://i.loli.net/2019/05/09/5cd43e954db53.png)]

  • 注1:pegeContext对象包含了Session、Servlet、request、response等多个对象
  • 注2:标红(request、session、application、pageContext)为四大域对象(pageContext对象使用较少)

四大域对象:实际开发

  • request

存放的数据在一次请求(转发)内有效.使用非常多

  • session

存放的数据在一次会话内有效.使用较多,如:存放用户的登陆状态,购物车功能等.

  • application

存放的数据在整个应用范围内有效,但是因为范围较大,尽量少使用.

  • pageContext

存放数据在当前页面,使用的较少.
pageContext本身为域对象,同时它还可以操作其他三个域对象的数据

  • 操作自己的方法:
  • void setAttribute(String name, Object obj);
  • Object getAttribute(String name);
  • void removeAttribute(String name);
  • 操作其他域对象的方法
  • void setAttribute(String name, Object obj, int Scope);
  • Object getAttribute(String name, int Scope);
  • void removeAttribute(String name, int Scope);
  • 注:Scope的取值:
  • PageContext. PAGE_SCOPE
  • PageContext.REQUEST_SCOPE
  • PageContext.SESSION_SCOPE
  • PageContext.APPLICATION_SCOPE
  • findAttribute(String name);自动从page、request、application依次查找,找到就取值,结束查找。
  • 注:pageContext只在当前页面有效

EL表达式

  • EL表达式:Expression Language 表达式语言,简化jsp内的代码开发,是jsp获取数据的一种规范

  • 示例代码

<%--JSP 脚本--%>
<%=request.getAttribute("ub") %><br />


<%-- EL 表达式 --%>
${ub}

EL表达式的具体功能

  1. 获取数据

EL表达式只能获取存放在4个域对象的数据,对于 null 在页面显示为空白字符串

  • '.'运算符相当于get方法 — ${user.name } <=> user.getName()
  • '[]'运算符,相对于 ‘.’ 运算符来说,更加强大(取集合,数组等)
    ${ub['name'] }
  1. 运算
  1. 判断是否为null : empty(空串、空集合) — ${empty isNull }
  2. 三元运算符 : ${empty isNull ? "该值为null" : "该值不为null" }
  3. 基本数学运算
  1. 隐式对象
  • TIM截图20190510083518.png
  • 操作域对象示例代码
${pageScope.text }
${pageContext.getAttribute("text") }
${requestScope.text }
${sessionScope.text }
${applicationScope.text }
  • 获取表单数据的示例代码

  • 取form表单内该属性名第一次的值
${param.表单属性名 }

  • 取form表单所以出现该属性名的值 — 数组
${paramValues.username[0]}
  • 操作Cookie
// 获取JSESSIONID 的值
${cookie.JSESSIONID.value}

// 获取JSESSIONID 的名称---JSESSION
${cookie.JSESSIONID.name}

JSTL (JSP标准标签库)

作用:使用JSTL实现JSP页面的逻辑处理

使用JSTL

  1. 在JSP 页面使用标签库
  • 导入 jstl.jsrstandard.jar
  • 在JSP 添加taglib指令
<%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
  • 通用标签:set、out、remove
<%--    设置属性i的值--%>
<c:set var="i" value="欧阳铁柱" ></c:set>

<%--   输出i的值,默认为"上官翠花"--%>
<c:out value="${i }" default="上官翠花"/>

<c:out value = "${i }">
	default value
</c:out>



<%--   删除属性i--%>
<c:remove var="i"/>

<%--   输出i的值,默认为"上官翠花"--%>
<c:out value="${i }" default="上官翠花"/>
  • 条件标签:if choose

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

  • choose
<c:choose>
    <c:when test="${i == 1}">1</c:when>
    <c:when test="${i == 2}">2</c:when>
    <c:when test="${i == 3}">3</c:when>
    <c:otherwise>
        没有
    </c:otherwise>
</c:choose>
  • 迭代标签: froEach

  • 类似于fori循环 — for(int i = 0; i<10; i++){}
<c:forEach var="i" begin="1" end="10" step="2" >
    ${i}<br />
</c:forEach>

  • 类似于forEach循环
<%
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
request.setAttribute("list", list);
%>

<c:forEach items="${list }" var="l">
    ${l}
</c:forEach>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值