JSP详解

发布于:2022-12-06 ⋅ 阅读:(1014) ⋅ 点赞:(0)

一、JSP介绍

JSP: Java Server Pages,简单编写页面,它允许使用特定的标签在 HTML 网页中插入 Java 代码,实现动态页面处理,所以 JSP 就是 HTML 与Java 代码的复合体。

1.原理

 服务器启动,将编写的jsp文件,转译成java文件,再编译成class文件运行。

2.JSP和Servlet区别

JSP以源文件形式部署到容器中。而Servlet需要编译成class文件后部署到容器中。

JSP部署到Web项目的根目录下货目录下的其他子目录和静态同资源位于相同位置。而Servlet需要部署到WEB-INF/classes目录中。

JSP中的HTML代码会被JSP引擎放入到Servlet的out.write()方法中。而在Servlet中我们需要自己通过对字符流输出流的操作生成响应的页面。

JSP更擅长变现于页面显示,Servlet更擅长于逻辑控制。

三、JSP的使用

1.JSP三种标签

 <% java代码 %>

 <body>
  <hr>
  <hr>
  <h2>java脚本1</h2>
  <%
        Object obj = new Object();
        System.out.println(obj );
        out.write(obj.toString());
  %>
  <hr>
  <hr>
  <%
    out.write(obj.toString());
  %>
  </body>

<%=代码 %>

<%--  <%= 相当于out,直接将结果输出到浏览器    --%>
<%=new Object() %>

需求:产生10行表格

<table border="2" align="center">
        <tr>
            <td>ID</td>
            <td>Username</td>
            <td>password</td>
        </tr>
  <%
      for (int i = 0; i < 10; i++) {
  %>
        <tr>
            <td>ID</td>
            <td>Username</td>
            <td>password</td>
        </tr>
  <%
        }
  %>

2.指令标签

指令 描述
<%@ page ... %> 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入标签库的定义,可以是自定义标签

2.1page

page: 设置当前当前jsp的属性

语法: <%@page 属性="值" 属性="值" %>

import: 在当前jsp导入其他java包

 注意

session: true|false,默认是true,设置当前页面是否可以直接使用session对象,false,就是没有session对象,使用时编译报错。

2.2taglib

taglib: 用来给当前jsp引入jstl标签库

语法: <%@ taglib uri="" prefix="" %>

用法: 引入jstl标签库

2.3include

include: 包含,将其他内容包含至当前页面

语法: <%@ include file="路径">

作用: 将file指定路径的文件加入到当前页面,已达到复用的效果

<%@ include file="header.jsp"%>
<%-- 将其他jsp 界面包含到当前界面--%>
<%@include file="content.jsp"%>
<%@ include file="footer.jsp" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<jsp:include page="head.jsp"></jsp:include>
这个是身体
</body>
<jsp:include page="footer.jsp"></jsp:include>
</html>

3.内置对象

内置对象,就是jsp页面中可以直接使用的对象.

4.四大域

解释 值的范围
pageContext 页面域 只有当前页面能使用
request 请求域 在一次请求转发中有效
session 会话域 在一次会话中有效
application 应用域 在整个web应用中有效

5.EL表达式

5.1作用

用于替换作用域对象.getAttribute("name")

5.2应用

${scope.name} 获取具体某个作用域中的数据

${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)

<%
    User user1 = new User();
    user1.setId(100);
    user1.setUsername("xiaoming");
    request.setAttribute("user",user1);

%>
<%--以下三种方式都可获取--%>
user-name:${requestScope.user.username}<br>
user-name:${user.username}<br>
user-name:${user["username"]}<br>
<h2>存入四大域值,key=el</h2>
<%
    application.setAttribute("el","appValue");
    pageContext.setAttribute("el","pageValue");
    request.setAttribute("el","reqValue");
    session.setAttribute("el","seValue");
%>
<h3>el取值结果:${el}</h3>
<h3>指定取某个域的值: ${sessionScope.el}</h3>

5.3取值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>取值</title>
</head>
<body>
<%
    //先向域中存值
    request.setAttribute("str","字符串");
    request.setAttribute("num",100);

    User user = new User( );
    user.setUsername("牛牛");
    user.setPassword("123456");

    request.setAttribute("user",user);

    int[] array = {11,22,33};
    request.setAttribute("array",array);

    Map map = new HashMap();
    map.put("aka","阿浩");
    map.put("ak47","阿卡司机");
    request.setAttribute("map",map);

%>
<h2>取字符串:${str}</h2>
<h2>取数字:${num}</h2>
<h2>取对象:${user}</h2>
<!-- 对象取值是重点 -->
<h2>取对象的属性:${user.username}</h2>  
<h2>取出数组:${array[0]}</h2>
<h2>取出map:${map.get('aka')}</h2>
</body>
</html>

6.JSTL

6.1什么是JSTL

  • JSTL:全称Java Server Pages Standard Tag Library

  • JSP标准标签库(JSTL)是一个JSP标签集合。

6.2JSTL的作用

可对EL获取到的数据进行逻辑操作。

与EL合作完成数据的展示。

6.3JSTL的使用

  • 导入两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下

  • 在JSP页面引入标签库<% @taglib uri="Oracle Java Technologies | Oracle" prefix="c">

6.4核心标签的使用

6.4.1条件标签if判断jstl1.jsp

语法:<c:if test ="条件"> < /c:if>

<%
    request.setAttribute("num",10);
%>
<%-- 判断
    test中写布尔表达式
    如果判断为true,开闭标签内的内容会显示在浏览器
    否则,在浏览器不显示
--%>
<c:if test="${num < 1}">
    num > 1
</c:if>

6.4.2多条件choose判断

语法:<c:choose >

<c:when test="条件1">结果1< /c:when>

<c:when test="条件2">结果2< /c:when>

<c:when test="条件3">结果3< /c:when>

<c:otherwise >结果4< /c:otherwise>

< /c:choose>

<h3>条件标签:choose(等价于java中多重if)</h3>
<%-- 测试成绩等级 >90 优秀   >80  良好    >70 中等   >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
	<c:when test="${score>=90 }">优秀</c:when>
	<c:when test="${score>=80 }">良好</c:when>
	<c:when test="${score>=70 }">中等</c:when>
	<c:when test="${score>=60 }">及格</c:when>
	<c:otherwise>不及格</c:otherwise>
</c:choose>

6.4.3迭代foreach标签

<%--
循环 var是变量
    begin从哪里开始
    end 到哪结束
    step 步长默认为1
--%>
<c:forEach var="i" begin="1" end="10" step="2">
    ${i}<br>
</c:forEach>
<hr>
<%--
循环
    items 就是域中的集合
    var 每次循环得到的对象
--%>
<c:forEach var="user" items="${list}">
    <div>${user}</div>
</c:forEach>

语法

<c:foreach

var="变量名"

items="集合"

begin="起始下标"

end="结束下标"

step="间隔长度"

varstatus="遍历状态">

< /c:foreach>

  <h3>测试list集合遍历获取学生列表</h3>
      <table border="1" width="80%" bordercolor="red" cellspacing="0"
          align="center">
          <tr>
              <th>学号</th>
              <th>姓名</th>
              <th>成绩</th>
              <th>班级</th>
              <th>是否是第一个</th>
              <th>是否是最后一个</th>
              <th>计数count</th>
              <th>索引index</th>
          </tr>
   <!-- varStatus:变量状态:遍历出的每一项内容的状态:
      first 是否是第一行
      last  是否是最后一行
      count 当前行数
      index 当前元素的下标
       -->
       <!-- var :遍历出的每一项使用变量先存储
            items:集合(使用El表达式)
            -->
          <c:forEach var="stu" items="${students}" varStatus="vs">
              <tr>
                  <td>${stu.id}</td>
                  <td>${stu.name}</td>
                  <td>${stu.score}</td>
                  <td>${stu.classes}</td>
                  <td>${vs.first}</td>
                  <td>${vs.last}</td>
                  <td>${vs.count}</td>
                  <td>${vs.index}</td>
              </tr>
          </c:forEach>
   </table>
本文含有隐藏内容,请 开通VIP 后查看