jsp

jsp

什么是jsp

Java Servlet Pages:java服务器端页面。也和Servlet一样用于开发动态web技术

最大的特点:

  • 写Jsp就像在写Html
  • 区别:
    • HTML只给用户提供静态数据
    • JSP页面中可以嵌入Java代码,为用户提供动态数据

jsp原理

思路:JSP到底怎么执行

  • 代码层面没有问题

  • 服务器内部工作

    tomcat中有一个work目录

    IDEA中使用Tomcat会在IDE中生成一个work目录

  • 浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet

  • Jsp最后也会转换成java类

  • Jsp本质上就是一个Servlet

  1. 判断请求

  2. 内置了一些对象

    • pageContext:页面上下文
    • Session
    • application:applicationContext = ServletContext
    • config:配置
    • out
    • page:当前页
    • request:请求
    • response:响应

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArefuG4h-1597420466065)(C:%5CUsers%5Chasee%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200809230952600.png)]

  3. 输出页面前增加的代码

在这里插入图片描述

  1. 以上的对象可以在jsp页面中直接使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGpz8FOK-1597420466067)(C:%5CUsers%5Chasee%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200810110122114.png)]

在JSP页面中:

  • 只要是Java代码,就会原封不动地输出

  • 如果是HTML代码,就会被转换成:

    out.write("<html>")
    

    这样的格式渲染到前端

JSP基础语法

JSP表达式

用来将程序的输出输出到客户端

<%-- JSP表达式
    作用:用来将程序的输出输出到客户端
    <%= 变量或表达式%>>
 --%>
<%= new java.util.Date()%>

结果:页面直接显示日期

Jsp脚本片段

<%
  int sum = 0;
  for(int i = 1; i <= 100; i++){
      sum += i;
  }
  out.println("<h1>Sum=" + sum +"</h1>");
%>

结果:Sum=5050

脚本片段的再实现

在代码中嵌入HTML元素
<%
    for(int i = 0; i < 5; i++) {

%>

    <h1>hello world <%=i%></h1>

<%
}
%>

hello world 0

hello world 1

hello world 2

hello world 3

hello world 4

JSP声明

<%!
    static{
        System.out.println("Loading Servlet");
    }
    
    int var = 0;
    public void init(){

        System.out.println("进入了方法init");
    }
%>

区别:

JSP声明:

  • 会被编译到JSP生成的Java类中

其他:

  • 生成到_jspService方法中

在JSP中,嵌入Java代码即可

JSP指令

定制错误页面


<%-- 定制错误页面 --%>

<%@ page import="java.util.*" %>
<%@ page errorPage="error/500.jsp" %>

当该页面有错误时就会自动跳转到error下的500.jsp页面

也可以在web.xml下配置

    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>

显式地声明这是个错误页面

<%@ page isErrorPage="true" %>

提取公共页面

<%@ include file=""%>

拼接页面

<jsp:include page="footer.jsp"/>

转发页面

<jsp:forward page="test2.jsp"></jsp:forward>

JSP内置对象及作用域

九个内置对象

  • PageContext
  • Request
  • Response
  • Session
  • Application ->ServletContext 存东西
  • config ->ServletConfig
  • out
  • page
  • exception

1. 内置对象存储

    //保存的数据只在一个页面中有效
    pageContext.setAttribute("name1","yeye");

    //保存的数据只在一次请求中有效,请求转发会携带
    request.setAttribute("name2","yeye");

    //保存的数据在一次会话中有效(从打开浏览器到关闭浏览器)
    session.setAttribute("name3","yeye");

    //保存的数据在服务器中有效,从打开服务器到关闭服务器
    application.setAttribute("name4","yeye");

2. 从pageContext取出

<%--通过PageContext取出我们保存的值
    脚本片段中的代码,会被原封不动生成到.jsp.java
    所以这里的代码必须保证Java语法的正确性--%>
<%
    //从PageContext中取出,我们通过寻找的方法
    //从底层到高层(作用域):page->request->session->application
    //类似JVM的双亲委派机制
    String name1 = (String)pageContext.findAttribute("name1");
    String name2 = (String)pageContext.findAttribute("name2");
    String name3 = (String)pageContext.findAttribute("name3");
    String name4 = (String)pageContext.findAttribute("name4");
    String name5 = (String)pageContext.findAttribute("name5");
%>

3.使用EL表达式输出

<%--使用el表达式输出 -> ${}--%>
<h1>取出的值为</h1>
<h4>${name1}</h4>yeye
<h4>${name2}</h4>yeye
<h4>${name3}</h4>yeye
<h4>${name4}</h4>yeye
<h4>${name5}</h4>不显示
<h3><%=name5%></h3>null

请求转发

<%
    //前端转发
    pageContext.forward("/index.jsp");
    //原型:
    request.getRequestDispatcher("/index.jsp").forward(request,response);
%>

应用

  • Request:客户端向服务器发送请求产生的数据,用户看完就没用了
  • Session:产生的数据用户用完了一会儿还有用,比如:购物车
  • application:一个用户用完了,其他用户还可能使用,比如:聊天数据
<%@ page contentType="text/html; utf-8" language="java" %>

<html>
<head>
    <title></title>
</head>

<%
    //保存的数据只在一个页面中有效
    pageContext.setAttribute("name1","yeye");

    //保存的数据只在一次请求中有效,请求转发会携带
    request.setAttribute("name2","yeye");

    //保存的数据在一次会话中有效(从打开浏览器到关闭浏览器)
    session.setAttribute("name3","yeye");

    //保存的数据在服务器中有效,从打开服务器到关闭服务器
    application.setAttribute("name4","yeye");
%>

<%--通过PageContext取出我们保存的值
    脚本片段中的代码,会被原封不动生成到.jsp.java
    所以这里的代码必须保证Java语法的正确性--%>
<%
    //从PageContext中取出,我们通过寻找的方法
    //从底层到高层(作用域):page->request->session->application
    //类似JVM的双亲委派机制
    String name1 = (String)pageContext.findAttribute("name1");
    String name2 = (String)pageContext.findAttribute("name2");
    String name3 = (String)pageContext.findAttribute("name3");
    String name4 = (String)pageContext.findAttribute("name4");
    String name5 = (String)pageContext.findAttribute("name5");
%>

<%--使用el表达式输出 -> ${}--%>
<h1>取出的值为</h1>
<h4>${name1}</h4>yeye
<h4>${name2}</h4>yeye
<h4>${name3}</h4>yeye
<h4>${name4}</h4>yeye
<h4>${name5}</h4>不显示
<h3><%=name5%></h3>null

<%
    //前端转发
    pageContext.forward("/index.jsp");
    //原型:
    request.getRequestDispatcher("/index.jsp").forward(request,response);
%>

</html>



JSP标签

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
<%--转发可以携带参数
    url:http//localhost:8080/tset2.jsp?name=yeye--%>
<jsp:forward page="test2.jsp">
    <jsp:param name="name" value="yeye"/>
</jsp:forward>
<%--取出参数--%>
名字:<%=request.getParameter("name")%>

JSTL表达式

JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义了许多的标签,可以供我们使用,标签的功能和Java代码一样

核心标签(掌握部分)

引入JSTL核心标签库,我们才能使用JSTL标签:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 	描述
<c:out> 	用于在JSP中显示数据,就像<%= ... >
<c:set> 	用于保存数据
<c:remove> 	用于删除数据
<c:catch> 	用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if> 	与我们在一般程序中用的if一样
<c:choose> 	本身只当做<c:when>和<c:otherwise>的父标签
<c:when> 	<c:choose>的子标签,用来判断条件是否成立
<c:otherwise> 	<c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:import> 	检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach> 	基础迭代标签,接受多种集合类型
<c:forTokens> 	根据指定的分隔符来分隔内容并迭代输出
<c:param> 	用来给包含或重定向的页面传递参数
<c:redirect> 	重定向至一个新的URL.
<c:url> 	使用可选的查询参数来创造一个URL
格式化标签
SQL标签
XML标签

JSTL标签库使用步骤

  1. 引入对应的taglib
  2. 使用其中的方法
c:if c:out
<%--如果判断提交的用户名是管理员,则成功登录--%>
<%
    if(request.getParameter("username").equals("admin")) {
        out.print("登录成功");
    }
%>

<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="管理员欢迎你"/>
</c:if>
c:set c:choose
<%--定义一个变量叫score,值为85--%>
<c:set var="score" value="85"></c:set>

<c:choose>
    <c:when test="${score>=90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score>=90}">
        你的成绩为良好
    </c:when>
</c:choose>
c:foreach
<%
    ArrayList<String> strings = new ArrayList<String>();

    strings.add(0,"a");
    strings.add(1,"gg");
    request.setAttribute("list",strings);
%>

<%--var:每一次遍历出来的变量--%>
<%--items:要遍历的对象--%>
<%--step:步长--%>
<%--begin,end:开始,结束--%>

<c:forEach var="string" items="${strings}">
    <c:out value="${string}"/> <br>
</c:forEach>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值