jsp的使用

概述

  • Jsp 是由sun公司研发的一种 动态生成html页面的一种网页技术
  • 简单来说 jsp是java与html的结合体
  • 可以在任意系统上运行
  • 在web开发过程中担任显示层(视图层)的角色

语法

  1. 注释
<!-- html注释 (客户端能看到注释内容) -->
<%-- jsp注释(客户端看不到内容)      --%>
  1. 声明
    格式:<%! java代码 %> 用于定义方法成员变量
  2. 脚本
    格式:<% java代码%> 用于定义局部变量 和执行语句
  3. 表达式
    格式:<%=表达式(值)%> 用于输出变量或者表达式的值
  4. 指令
page
 language="java"  指定语言
 contentType="text/html; charset=UTF-8" 文档类型
 pageEncoding="UTF-8" 页面编码
 isErrorPage="true"  结合errorpage属性使用     错误页面设置(可以用来指定出错处理的页面)
 import="" 用来导包
  1. 动作
include:在页面请求的引入一个页面
 usebean: 实例化javabean
 getproperty:取得javabean属性
 setproperty: 设置javaBean属性
 forword:转发

下面是使用jsp相关动作的一个案例:

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!--  html注释 (客户端能看到的内容)-->
<%--  jsp注释(客户端不可以看到)  --%>
    
用于成员变量和方法的声明
<%! String name = "Jeason";
ArrayList al = new ArrayList();
	public void show(){}
%>

用于局部变量和执行语句的声明(在转化为java文件时候,实在servelet的方法中的)
<% String test = "test"; %>

表达式,用于输出我们的变量或者表达式的值
<%= name %>

<jsp:include page="insert.jsp"></jsp:include>
<jsp:useBean id="p1" scope="session" class="bean.Person"></jsp:useBean>
<br>
<%-- 输出我们刚在用useBean建立的对象信息 --%>
<%= p1.toString() %>
<br>
<%-- 下面我们给刚才建立的Bean对象来赋值 --%>
<jsp:setProperty property="name" value="Jeason" name="p1"/>
<jsp:setProperty property="sex" value="man" name="p1"/>
<jsp:setProperty property="age" value="24" name="p1"/>
<%= p1.toString() %>

<%-- 下面我们做一次转发 --%>
<jsp:forward page="insert.jsp"></jsp:forward>

</body>
</html>

未执行转发前的网页输出如下:

用于成员变量和方法的声明 用于局部变量和执行语句的声明(在转化为java文件时候,实在servelet的方法中的) 表达式,用于输出我们的变量或者表达式的值 Jeason 测试一下jsp的include 啦啦啦
啦啦啦
Person [name=Jeason, sex=null, age=null]
Person [name=Jeason, sex=man, age=24]

面试题:jsp 和servlet 谁的速度效率高
jsp本质就是servlet 在第一次被访问时候 被翻译成servlet类 我们可以在tomcat 目录work里面找到生成servlet

jsp的内置对象和四大作⽤域

  1. 九大内置对象
out:用于输出  正常 out.print  out.write  用户向页面输出数据
pageContext:可以获取其他八大对象
request:请求对象   可以得到请求参数(请求头相关信息)
response:响应对象  跳转页面  响应页面数据
session:会话技术   域对象   会话技术 
application:就是servlet中servletContext 上下问对象 三个作用 根据相对路径取绝对路径  全局参数  域对象等
exception:异常信息
page:代指当前jsp页面  相对于javathis引用 
config: 就是servletConfig  可以获取servlet中配置参数
<%-- 演示 --%>
<% out.write("jsp的out对象");  %>
<br>
<% out.write(pageContext.getSession().getId()); %>

可以获得输出如下:
jsp的out对象 
07BC61F5C328BDABEB6C224FF5EBF9C7
  1. 四大作用域
    范围从大到小
    servletContext:整个工程 (整个项目下jsp和servlet都可以获取域对象中数据)
    session:一次会话(多页面 范围一次会话 存储用户信息)
    request:一次请求(多页面 转发虽然跳转了页面触发的是一次请求 一搬用于2个页面传递数据的时候使用)
    pageContext:当前jsp页面(当前页面)

EL表达式的使⽤

我们一般用EL来简化在jsp中编写的java代码。主要用来从request或者其他对象中取值.

下面是一些简单的示例,我们在servlet程序中提前对request和session进行了参数赋值。

${1+1}
  ${1==1}
  ${1!=1}

<%--  从请求对象中获取数据--%>
  <h1>用户名:${requestScope.username}</h1>
  <h1>年龄:${requestScope.age}</h1>
  <%--  从会话对象中获取数据--%>
  <h1>用户名2:${sessionScope.username}</h1>

<%--  算数运算符--%>
  ${10 % 3}
  ${10 / 3}
  ${10 - 3}

<%--  逻辑运算符--%>
  ${true && true}
  ${true && false}
  ${true || false}
  ${!true}

  ${not true}
  ${true or false}
  ${true and false}

<%--  比较运算符--%>
  ${100 >= 100}
  ${sessionScope.username == tom}

<%--  判断是否为空--%>
  ${!empty sessionScope.age}

<%--  隐藏对象--%>
  <%--  从请求中获取参数--%>
  ${param.password}

<%--EL会自动搜索4个作用域 --%>
  ${username}

JSTL标签库

JSTL也是同样,目的是为了完成减少java代码量,使用类似于html标签的方式来完成一些页面的流程控制

语法也比较简单,使用前需要连接两个jar包jstl.jar和standard.jar,示例代码如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<%--配置JSTL--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>




<%--判断结构(常用)--%>
    <c:if test="fasle">
        <h1>判断通过了</h1>
    </c:if>
<%--循环结构--%>
    <c:forEach begin="1" end="10">
        <a href="http://www.baidu.com">百度一下</a>
    </c:forEach>

<%--循环遍历(常用)--%>
    <c:forEach items="1,2" var="temp" varStatus="vt">
        <spa>遍历的值${temp}</spa>
        <span>循环索引${vt.index}</span>
        <span>循环次数${vt.count}</span>
        <span>当前的值${vt.current}</span>
        <span>是否是第一个${vt.first}</span>
        <br/>
    </c:forEach>


<c:if test="${empty myname}">
    <h1>myname是空的</h1>
</c:if>
<c:if test="${!empty myname}">
    <h1>myname不是空的</h1>
</c:if>

<%--选择结构--%>
<c:choose>
    <c:when test="true">
        when1
    </c:when>
    <c:otherwise>
        其他的
    </c:otherwise>
</c:choose>


</body>
</html>

利用JSP进行分页展示案例

<%--
  Created by IntelliJ IDEA.
  User: 17390
  Date: 2020/5/9
  Time: 16:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>pagetest</title>
</head>
<body>

    <%--1.用户请求是发送需要显示的页码--%>
    <%--2.获取页码(查询相关数据),需要考虑用户是否发送页码,没有的话默认第一页--%>
    <%--3.添加两个按钮,上一页和下一页--%>
    <%--4.如果当前是第一页 不显示上一页按钮 (另外一个同理)--%>

    <c:if test="${param.page == null}">
        <c:set var="page" value="1" scope="request"/>
    </c:if>
    <c:if test="${param.page != null}">
        <c:set var="page" value="${param.page}" scope="request"/>
    </c:if>

    当前的页数:${requestScope.page}

    <c:if test="${page>1}">
        <a href="pagetest.jsp?page=${requestScope.page-1}">上一页</a>
    </c:if>
    <c:if test="${page<10}">
        <a href="pagetest.jsp?page=${requestScope.page+1}">下一页</a>
    </c:if>



</body>
</html>

利用JSP的el表达式和jstr来进行简单的分表

首先在servelt程序中构建一个list,并放入request域中,进行页面的转发。

package com.kkb.servlets;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;

@WebServlet(name = "ListServlet",urlPatterns = "/list")
public class ListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ArrayList<String>  list = new ArrayList<>();
        list.add("jerry");
        list.add("tom");
        list.add("scot");
        list.add("jack");
        request.setAttribute("list",list);
        request.getRequestDispatcher("list.jsp").forward(request,response);
    }
}

页面从request中获得list,进行循环遍历并输出。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <table border="1px">
        <tr>
            <th>人员列表</th>
        </tr>
<%--        遍历列表 变成一个个的单元格标签--%>
        <c:forEach items="${list}" var="name">
            <tr>
                <td>${name}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

小结

EL 表达式可以编写一些简单的表达式例如算数 比较 逻辑判断 取值(最常用的)
JSTL 用于实现流程控制 常见的 if for