[Java 学习] JSP详解

前言

虽然JSP这项技术已经被大部分的公司淘汰了,但一些老项目中还是存在很多JSP的,假如某天你接手一个政府的老项目,可能你就会崩溃,因为人家可能老到连Servlet都没有纯JSP开发。所以懂还是要的,但是东西又比较多,就记下这篇笔记,以后忘了自己翻自己的,不香么?

一、JSP

1、 概念

Java Server Pages:Java服务器页面

本身一个服务器的技术,本质上是一个Servlet

大白话:就是 HTML + Java 代码

2、 脚本

2.1 <% 编写的内容其实是在service方法中 %>

2.2 <%! 写的是申明全局变量和方法,编写的内容其实是JSP翻译的Servlet的全局变量和方法%>

2.3 <%= 输出内容【就是一个表达式】%>

3、 include标签跟指令的区别

3.1 标签jsp:include

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

可以在一个JSP页面中包含其他JSP页面的内容

此方式:是通过方法调用其他JSP内容,是动态的包含,推荐使用

3.2 指令include

<%@ include file="head.jsp"%>

可以在一个JSP页面中包含其他JSP页面内容

此方式:是通过把其它JSP内容直接写到当前页面中,是静态包含,不推荐

4、其他标签

4.1 操作对象

<jsp:useBean id="user" class="com.qf.entity.User" />
等同于
<% User user = new com.qf.entity.User(); %>

<jsp:setProperty name="user" property="name" value="gavin" />
等同于
<% user.setName("gavin"); %>

<jsp:getProperty name="user" property="name" />
等同于
<% user.getName("name"); %>

4.2 转发带参数

<jsp:forward page="index.jsp">
    <!-- http请求参数传递-->
    <jsp:param name="sex" value="nan" />
</jsp:forward>

<% 转发到index.jsp页面,并且携带参数sex=nan %>

5、内置对象

由JSP自动创建的对象,可以直接使用,总共有9个

对象名 类型 说明
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession 由session=“true”开关
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
exception java.lang.Throwable 由isErrorPage=“false”开关
out javax.servlet.jsp.JspWriter javax.servlet.jsp.JspWriter
pageContext javax.servlet.jsp.PageContext
page java.lang.Object当前对象this 当前servlet实例

5.1 pageContext内置对象【掌握】

pageContext获取其他八大内置对象

5.2 四大域对象【掌握】

JSP有四大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别

  • pageContext (javax.servlet.jsp.PageContext) 当前JSP页面范围
  • request (javax.servlet.http.HttpServletRequest) 一次请求有效
  • session (javax.servlet.http.HttpSession) 一次会话有效(关闭浏览器失效)
  • application (javax.servlet.ServletContext) 整个Web应用有效(服务器重启或关闭失效)

6、指令【掌握】

6.1 page指令

  • 语法:<%@ page attribute1="value1" attribute2="value2" %>

  • Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。

属性 描述
contentType 指定当前JSP页面的MIME类型和字符编码格式
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
import 导入要使用的Java类
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session。默认为true立即创建,false为使用时创建
pageEncoding 指定JSP页面的解码格式

6.1.1 page指令需要注意的几个属性

contentType="text/html;charset=UTF-8"

import : 导入Java类的全类名

language:java

6.2 taglib

  • 语法:<%@ taglib uri="外部标签库路径" prefix="前缀" %>

  • 引入JSP的标准标签库

<!-- jstl标签库: 需要导入jar包,在jstl-1.2.jar之后只需要一个jar包就可以了 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 格式化相关的,时间,字符串 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

6.2.1 taglib的属性

uri:标签库的地址

prefix:标签库的前缀,在使用该标签时,必须加前缀

二、EL表达式

1、概念

EL使JSP写起来更简单、简洁。主要用于获取域对象中的数据

2、原生获取域数据中数据和EL获取域中对象的数据的差别

<%--
  Created by IntelliJ IDEA.
  User: ghy
  Date: 2021/1/11
  Time: 16:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    session.setAttribute("age", 12);
    request.setAttribute("name", "lucy");
    application.setAttribute("gender", "男");
    pageContext.setAttribute("birth", "1999-12-12");
%>

<hr>
<%= request.getAttribute("name")%>
<br>
<%= session.getAttribute("age")%>
<br>
<%= application.getAttribute("gender")%>
<br>
<%= pageContext.getAttribute("birth")%>
<br>

<%= request.getAttribute("aa")%>   <%--  null --%>
<br>

<hr>
${requestScope.name} -- ${name}
<br>
${sessionScope.age} -- ${age}
<br>
${applicationScope.gender}   -- ${gender}
<br>
${pageScope.birth}   -- ${birth}
<br>
${requestScope.aa}   -- ${aa}
<br>
<br>
<br><br><br>

<%
    session.setAttribute("bb", 12);
    request.setAttribute("bb", "lucy");
    application.setAttribute("bb", "男");
    pageContext.setAttribute("bb", "1999-12-12");
%>

${requestScope.bb}  -- lucy
<br>
${bb}   --  作用域的范围从小到大开始检索,如果查到了,就返回并中断

</body>
</html>

3、EL取值的语法

${ EL表达式 }

4、常规运算

$

算术运算、逻辑运算、三目运算都可以

<%@ page import="java.util.*" %><%--
  Created by IntelliJ IDEA.
  User: ghy
  Date: 2021/1/11
  Time: 16:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    request.setAttribute("age", 12);
    request.setAttribute("gender", "1");
%>

${age > 10}   --- 运算过程写{}中间   <br>
-- 错误的写法 ${age} > 10

<hr>
${age > 10 and gender == '123'}
<!--
逻辑运算
    && and
    || or
    !  not
    -->

<br><br>
not:  ${!(age > 10)}  -- ${not (age > 10)}

<br><br>
or : ${age > 10 || gender == '123'}
<br><br>
<!-- 算术运算 -->
${age * 2}  -- 计算得到的结果:24
<br><br>
${gender == '1' ? '男' : '女'}
<br><br>

<br><br>


<%
    List<String> list = new ArrayList<>();
    List<String> list2 = null;

    request.setAttribute("list", list);
    request.setAttribute("list2", list2);

    request.setAttribute("desc", "");
    request.setAttribute("desc1", null);
%>

<br><br>
<%-- empty判断当前对象是否为空: null值
    如果是字符串,还会额外判断是否为空串:""
    如果是集合或数组,还会判断集合中是否有元素
        如果是null或者""或者[],均返回true
    --%>
list: ${empty list}  -- ${not empty list}

<br><br>
list2: ${empty list2}  -- ${not empty list2}
<br><br>

字符串: ${empty desc}
<br><br>
字符串: ${empty desc1}
<br><br>



${age gt 12}   -- >
<br>
${age ge 12}   -- >=
<br><br>
lt : <
le : <=
eq : ==


<br><br>
<%
    Map<String,String> maps = new HashMap<>();
    maps.put("CN","中国");
    maps.put("FK","法国");
    maps.put("US","美国");
    request.setAttribute("maps",maps);

    List names = Arrays.asList("lucy","jack");

    request.setAttribute("names", names);


%>
获取map中的数据:${requestScope.maps['CN']}
<br>
获取list中的数据: ${names[0]}


</body>
</html>

5、隐式对象

5.1 pageContext

<!-- 获取当前应用的虚拟路径 -->
虚拟路径:<br>
方式一: <%= request.getContextPath() %><br>
方式二: ${pageContext.request.contextPath}

5.2 其他

<%
    Cookie cookie = new Cookie("username", "lucy");
    response.addCookie(cookie);
    response.sendRedirect(request.getContextPath() + "/pages/cookie-demo.jsp");

%>
<%--
    ${cookie.username} : 获取key为username的cookie对象
    ${cookie.username.name} : 获取key为username的cookie对象的键值
    ${cookie.username.value} : 获取key为username的cookie对象的value值
--%>
${cookie.username} - ${cookie.username.name} - ${cookie.username.value}

三、JSTL标签

C标签

就是配合EL表达式,完成替代JSP页面上的Java代码

将来在写JSP页面时,就应该让JSP页面只完成视图工作【展示】,不处理业务

1、JSTL使用步骤

  1. 导入jar包【jstl-1.2.jar】
  2. 在JSP页面使用taglib指令引入
  3. 直接使用
导入jar包【jstl-1.2.jar】
在JSP页面使用taglib指令引入
  • 使用
<%@ page import="com.java2007.pojo.Person" %>
<%@ page import="java.util.*" %><%--
  Created by IntelliJ IDEA.
  User: ghy
  Date: 2021/1/11
  Time: 17:44
  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>Title</title>
</head>
<body>

<%
    List<Person> list = new ArrayList<>();
    list.add(new Person(10, "小张","1"));
    list.add(new Person(20, "xiaoming","0"));
    list.add(new Person(30, "xiaowang","1"));
    request.setAttribute("list", list);
%>

    <table border="1" cellspacing="0" cellpadding="10">
        <tr>
            <td>序号</td>
            <td>ID</td>
            <td>NAME</td>
            <td>性别</td>
        </tr>

        <c:forEach items="${list}" var="person" varStatus="vs">
            <tr>
                <td>${vs.index + 1}</td>
                <td>${person.id}</td>
                <td>${person.name}</td>
                <td>${person.gender == "1" ? '男' : '女'}</td>
            </tr>
        </c:forEach>

    </table>

<ul>
    <c:forEach begin="1" end="10" var="num" step="1">
        <li>${num}</li>
    </c:forEach>
</ul>

<c:if test="${10 > 2}" >
    true
</c:if>

<c:if test="${10 <= 2}">
    false
</c:if>

<%
    request.setAttribute("age",10);
%>

<c:choose>
    <c:when test="${age > 8}">8</c:when>
    <c:when test="${age == 9}">9</c:when>
    <c:when test="${age == 10}">10</c:when>
    <c:otherwise>100</c:otherwise>
</c:choose>


</body>
</html>

笔记来源:千锋教育-ghy

posted @ 2021-01-11 20:55  AzureSky_X  阅读(279)  评论(0)    收藏  举报