jsp的使用
概述
- Jsp 是由sun公司研发的一种 动态生成html页面的一种网页技术
- 简单来说 jsp是java与html的结合体
- 可以在任意系统上运行
- 在web开发过程中担任显示层(视图层)的角色
语法
- 注释
<!-- html注释 (客户端能看到注释内容) -->
<%-- jsp注释(客户端看不到内容) --%>
- 声明
格式:<%! java代码 %> 用于定义方法成员变量 - 脚本
格式:<% java代码%> 用于定义局部变量 和执行语句 - 表达式
格式:<%=表达式(值)%> 用于输出变量或者表达式的值 - 指令
page
language="java" 指定语言
contentType="text/html; charset=UTF-8" 文档类型
pageEncoding="UTF-8" 页面编码
isErrorPage="true" 结合errorpage属性使用 错误页面设置(可以用来指定出错处理的页面)
import="" 用来导包
- 动作
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的内置对象和四大作⽤域
- 九大内置对象
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
- 四大作用域
范围从大到小
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