JAVA框架-JSP的使用
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