Java EE期末总结(第二章)

发布于:2025-04-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

一、JSP页面里的page指令

二、JSP脚本元素

 1、全局声明<%!……%>

2、表达式<%=……%>

3、脚本程序段<%……%>

三、文件包含指令include

四、引入标签库指令taglib

五、JSP动作标签

1、包含文件动作标签

2、请求转发动作标签

3、JavaBean动作标签

4、Java插件动作标签

六、向客户端输出信息对象out

七、响应对象response

八、请求对象request

九、会话对象session

十、全局对象application 

十一、上下文对象pageContext

十二、Cookie信息的建立与使用

十三、表达式语言EL

十四、JSP标准标签库JSTL


一、JSP页面里的page指令

JSP页面中page指令是必须的:

        language属性:定义服务器的脚本语言类型。

        import属性:JSP程序需要导入的类和接口。

        pageEncoding属性:页面的字符编码。

例如:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

二、JSP脚本元素

 1、全局声明<%!……%>

        <%! 声明变量或方法%>

2、表达式<%=……%>

        <%=变量或返回值的方法名%>

3、脚本程序段<%……%>

        <%java语言%>

三、文件包含指令include

 <%@ include file="文件名.jsp"%> 

注意:

1、页面包含指令可以出现在<body>标签内的任何位置

2、避免JSP文件与当前页面定义相同的变量

四、引入标签库指令taglib

 taglib的使用格式如下:

<%@ taglib prefix="标签前缀" uri="标签库描述符"%>

 

五、JSP动作标签

1、包含文件动作标签<jsp:include>

        用于在当前JSP页面中嵌入另一个页面,基本格式如下(flush="true"表示清除保存在缓冲区的数据):

<jsp:include page="页面" flush=true/>

 示例:

header.jsp

此文件用于定义网站的头部内容。

<!-- 文件路径:WEB-INF/pages/header.jsp -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>网站头部</title>
</head>
<body>
    <h1>这是网站的头部</h1>
    <hr>
</body>
</html>

footer.jsp

该文件用于定义网站的底部内容。

<!-- 文件路径:WEB-INF/pages/footer.jsp -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>网站底部</title>
</head>
<body>
    <hr>
    <p>版权所有 &copy; 2024</p>
</body>
</html>

index.jsp

此文件为主页,使用 <jsp:include> 标签包含 header.jsp 和 footer.jsp

<!-- 文件路径:index.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
    <!-- 包含头部页面 -->
    <jsp:include page="WEB-INF/pages/header.jsp" />
    <h2>欢迎访问我的网站</h2>
    <p>这是网站的主要内容。</p>
    <!-- 包含底部页面 -->
    <jsp:include page="WEB-INF/pages/footer.jsp" />
</body>
</html>

2、请求转发动作标签<jsp:forward>

        用于转发请求,基本格式如下:

<jsp: forward page="页面"/>

        向转发的JSP页面传递参数时,格式如下:

<jsp forward page="JSP页面"/>
    <jsp:param name="user" value="hello">
    ……
</jsp:forward>

 示例:

source.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>源页面</title>
</head>
<body>
    <h2>这是源页面,即将转发请求...</h2>
    <jsp:forward page="target.jsp">
        <jsp:param name="username" value="John"/>
        <jsp:param name="age" value="25"/>
    </jsp:forward>
    <!-- 下面的内容不会被显示,因为请求已经被转发 -->
    <p>这部分内容不会显示。</p>
</body>
</html>

target.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>目标页面</title>
</head>
<body>
    <h2>这是目标页面,接收到转发的请求。</h2>
    <p>用户名: <%= request.getParameter("username") %></p>
    <p>年龄: <%= request.getParameter("age") %></p>
</body>
</html>

3、JavaBean动作标签

示例:

创建一个名为 User.java 的 JavaBean 类,放在 com.example.beans 包下。

package com.example.beans;

public class User {
    private String username;
    private int age;

    // 无参构造函数
    public User() {}

    // Getter 和 Setter 方法
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

创建一个名为 userInfo.jsp 的 JSP 页面,使用 JavaBean 动作标签操作 User 对象。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JavaBean 示例</title>
</head>
<body>
    <!-- 
        使用 <jsp:useBean> 标签创建或查找 User 对象。
        - id 属性:为创建或查找的 JavaBean 对象指定一个唯一的标识符,在后续代码中可通过该标识符引用此对象。
        - class 属性:指定 JavaBean 类的全限定名,即包含包名和类名,这里是 com.example.beans.User。
        - scope 属性:指定 JavaBean 对象的作用域,request 表示该对象仅在当前请求范围内有效。
        如果在当前请求作用域中已经存在具有相同 id 的 User 对象,则直接使用;若不存在,则创建一个新的 User 对象。
    -->
    <jsp:useBean id="user" class="com.example.beans.User" scope="request" />
    <!-- 使用 <jsp:setProperty> 标签设置 User 对象的属性 -->
    <jsp:setProperty name="user" property="username" value="Alice" />
    <jsp:setProperty name="user" property="age" value="20" />

    <h2>用户信息</h2>
    <!-- 使用 <jsp:getProperty> 标签获取 User 对象的属性 -->
    <p>用户名: <jsp:getProperty name="user" property="username" /></p>
    <p>年龄: <jsp:getProperty name="user" property="age" /></p>
</body>
</html>

4、Java插件动作标签<jsp:plugin>

示例:

以下是 ParamApplet.java 文件的代码:

import java.applet.Applet;
import java.awt.Graphics;

// 继承 Applet 类创建一个能接收参数的 Applet
public class ParamApplet extends Applet {
    private String message;

    // 重写 init 方法,在 Applet 初始化时获取传递的参数
    public void init() {
        // 获取名为 "message" 的参数值,如果参数不存在则使用默认值 "No message provided"
        message = getParameter("message");
        if (message == null) {
            message = "No message provided";
        }
    }

    // 重写 paint 方法,用于在 Applet 窗口中绘制文本
    public void paint(Graphics g) {
        g.drawString("Received message: " + message, 20, 20);
    }
}

将上述代码保存为 ParamApplet.java,然后使用 javac 命令进行编译:

javac ParamApplet.java

下面是 paramApplet.jsp 文件的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>使用 <jsp:plugin> 传递参数给 Java Applet</title>
</head>
<body>
    <h2>这是一个使用 <jsp:plugin> 标签传递参数给 Java Applet 的示例</h2>
    <!-- 
        <jsp:plugin> 标签用于嵌入 Java Applet
        - type 属性:指定嵌入的类型为 "applet"
        - code 属性:指定 Applet 类的名称,这里是 ParamApplet.class
    -->
    <jsp:plugin type="applet" code="ParamApplet.class" width="300" height="100">
        <jsp:params>
            <jsp:param name="message" value="Hello from JSP!">
        </jsp:params>
        <!-- <jsp:fallback> 标签用于在 Applet 无法正常显示时提供替代内容 -->
        <jsp:fallback>
            <p>无法加载 Java Applet,请确保你的浏览器支持 Java 插件。</p>
        </jsp:fallback>
    </jsp:plugin>
</body>
</html>

六、向客户端输出信息对象out

        JSP内置对象out,不仅可以输出对象内容,还可以管理页面中的缓冲区,它的常用方法如下:

out.println(exp) // 其中exp可以是普通文本、含有变量的表达式,甚至是作为特殊字符串的JS脚本

 示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>out.println 示例</title>
</head>
<body>
    <%
        // 1. 输出普通文本
        out.println("<h2>普通文本输出</h2>");
        out.println("这是一段普通的文本。<br>");

        // 2. 输出含有变量的表达式
        String name = "John";
        int age = 25;
        out.println("<h2>含有变量的表达式输出</h2>");
        out.println("姓名: " + name + "<br>");
        out.println("年龄: " + age + "<br>");

        // 3. 输出作为特殊字符串的 JS 脚本
        out.println("<script>alert('这是一个来自 JSP 的 JavaScript 弹窗!');</script>");
    %>
</body>
</html>

七、响应对象response

        response代表服务器对客户端请求进行响应的对象。

示例 1:设置响应状态码和响应头

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>设置响应状态码和响应头</title>
</head>
<body>
    <%
        // 设置响应状态码为 200,表示请求成功
        response.setStatus(200);
        // 设置响应头,指定内容类型为 HTML,字符编码为 UTF-8
        response.setContentType("text/html; charset=UTF-8");
        // 设置自定义响应头
        response.setHeader("Custom-Header", "This is a custom header");

        // 输出响应内容
        out.println("<h2>响应状态码和响应头已设置</h2>");
    %>
</body>
</html>

代码解释

response.setStatus(200):将响应的状态码设置为 200,代表请求成功处理。

response.setContentType("text/html; charset=UTF-8"):设置响应的内容类型为 HTML,字符编码为 UTF - 8,避免中文等字符显示乱码。

response.setHeader("Custom - Header", "This is a custom header"):添加一个自定义的响应头,客户端可以通过查看响应信息获取该自定义值。

示例 2:重定向到另一个页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>重定向示例</title>
</head>
<body>
    <%
        // 立即重定向到百度页面
        response.sendRedirect("https://www.baidu.com");
    %>
</body>
</html>

示例 3:设置响应体并输出文本信息

<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>设置响应体示例</title>
</head>
<body>
    <%
        // 设置响应的内容类型为纯文本,字符编码为 UTF-8
        response.setContentType("text/plain; charset=UTF-8");
        // 通过输出流输出响应内容
        response.getWriter().println("这是一个简单的文本响应示例。");
    %>
</body>
</html>

八、请求对象request

        request主要封装了表单提交的数据、超链接时传递的参数、客户端的IP地址和Cookie等信息。

示例 1:获取表单提交的数据

创建两个 JSP 文件,一个用于提供表单让用户输入信息,另一个用于接收并处理表单数据。

创建表单页面 form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>表单提交示例</title>
</head>
<body>
    <h2>请输入你的信息</h2>
    <form action="processForm.jsp" method="post">
        <label for="name">姓名:</label>
        <input type="text" id="name" name="name" required><br><br>
        <label for="email">邮箱:</label>
        <input type="email" id="email" name="email" required><br><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

创建处理表单数据的页面 processForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>处理表单数据</title>
</head>
<body>
    <%
        // 使用 request 对象获取表单提交的姓名和邮箱
        String name = request.getParameter("name");
        String email = request.getParameter("email");

        out.println("<h2>你提交的信息如下:</h2>");
        out.println("<p>姓名: " + name + "</p>");
        out.println("<p>邮箱: " + email + "</p>");
    %>
</body>
</html>

代码解释

   request.getParameter("name") 和 request.getParameter("email"):通过 request 对象的 getParameter 方法获取表单中 name 和 email 字段的值。

示例2:获取 URL 参数

创建一个 JSP 文件,用于接收 URL 中传递的参数并显示。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>获取 URL 参数</title>
</head>
<body>
    <%
        // 使用 request 对象获取 URL 中的参数
        String param = request.getParameter("param");

        if (param != null) {
            out.println("<h2>你传递的参数值是: " + param + "</h2>");
        } else {
            out.println("<h2>未传递参数。</h2>");
        }
    %>
</body>
</html>

九、会话对象session

        session是存储与服务端的、用于记录和保持某些状态的一种会话跟踪机制。从而实现一个会话期间多个页面间的数据共享。

示例:

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <form action="welcome.jsp" method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required>
        <input type="submit" value="登录">
    </form>
</body>
</html>    

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="javax.servlet.http.HttpSession" %>
<!DOCTYPE html>
<html>
<head>
    <title>欢迎</title>
</head>
<body>
    <%
        // 获取当前请求的 session 对象
        HttpSession session = request.getSession();
        String username = request.getParameter("username");
        if (username != null && !username.isEmpty()) {
            session.setAttribute("username", username);
        }
        // 从 session 中获取用户名
        username = (String) session.getAttribute("username");
        if (username != null) {
            out.println("欢迎, " + username);
            out.println("<a href='logout.jsp'>注销</a>");
        } else {
            response.sendRedirect("login.jsp");
        }
    %>
</body>
</html>    

logout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="javax.servlet.http.HttpSession" %>
<%
    // 获取当前请求的 session 对象,如果不存在则返回 null
    HttpSession session = request.getSession(false);
    if (session != null) {
        // 使 session 失效,销毁其中存储的所有信息
        session.invalidate();
    }
    response.sendRedirect("login.jsp");
%>    

十、全局对象application 

        定义application 对象代表整个 Web 应用程序,在服务器启动时创建,服务器关闭时销毁。

        作用范围:整个 Web 应用程序,所有用户和所有请求都能共享这个对象。

常用方法:

  setAttribute(String name, Object value):向 application 对象中存储数据,name 是键,value 是值。

  getAttribute(String name):根据键 name 从 application 对象中获取存储的数据。

  removeAttribute(String name):根据键 name 从 application 对象中移除存储的数据。

  getInitParameter(String name):获取在 web.xml 中配置的初始化参数。

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>Application 对象示例</title>
</head>
<body>
    <%
        // 存储数据到 application 对象
        application.setAttribute("message", "这是一个全局消息");

        // 从 application 对象中获取数据
        String message = (String) application.getAttribute("message");

        // 输出数据
        out.println("从 application 对象中获取的消息: " + message);
    %>
</body>
</html>

十一、上下文对象pageContext

        虽然 pageContext 和 application 都是用于在 Web 应用中存储和共享数据的对象,但不能简单地将 pageContext 理解为作用域小一点的 application。二者在作用域、功能、生命周期等方面存在明显差异。

十二、Cookie信息的建立与使用

        Cookie 是在客户端(通常是浏览器)存储数据的一种机制,由服务器发送到用户浏览器并保存在本地,下次向同一服务器再发起请求时,浏览器会自动携带这些 Cookie 信息。

示例:

deleteCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // 创建一个名为 visitCount 的 Cookie
    javax.servlet.http.Cookie deleteCookie = new javax.servlet.http.Cookie("visitCount", "");
    // 将 Cookie 的有效期设置为 0 以删除它
    deleteCookie.setMaxAge(0);
    response.addCookie(deleteCookie);
    // 重定向到显示 Cookie 信息的页面
    response.sendRedirect("showCookie.jsp");
%>  

showCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>显示 Cookie</title>
</head>
<body>
    <%
        int count = 0;
        // 从请求中获取所有的 Cookie
        javax.servlet.http.Cookie[] cookies = request.getCookies();
        // 检查请求中是否包含 Cookie
        if (cookies != null) {
            // 遍历所有的 Cookie
            for (javax.servlet.http.Cookie c : cookies) {
                // 查找名为 "count" 的 Cookie
                if ("count".equals(c.getName())) {
                    // 将找到的 Cookie 的值转换为整数并赋值给 count
                    count = Integer.parseInt(c.getValue());
                    break;
                }
            }
        }

        count++;

        // 创建一个新的 Cookie,名称为 "count",值为更新后的访问次数
        javax.servlet.http.Cookie newCookie = new javax.servlet.http.Cookie("count", String.valueOf(count));
        // 设置该 Cookie 的有效期为 3600 秒(即 1 小时)
        newCookie.setMaxAge(3600);
        // 将新创建的 Cookie 添加到响应中,以便发送给客户端浏览器
        response.addCookie(newCookie);
    %>
    <!-- 显示当前的访问次数 -->
    <h2>你访问此页面的次数为: <%= count %></h2>

    <!-- 提供一个链接,点击后跳转到 deleteCookie.jsp 页面以删除 Cookie -->
    <a href="deleteCookie.jsp">删除 Cookie</a>
</body>
</html>    

十三、表达式语言EL

        使用EL表达式时,会从指定域对象读取关键字对应的内容,并写入响应体,其用法格式如下:

${域对象.关键字}

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>EL 表达式示例</title>
</head>
<body>
    <%
        // 在 page 作用域中设置属性
        pageContext.setAttribute("pageMessage", "这是 page 作用域的消息");
        // 在 request 作用域中设置属性
        request.setAttribute("requestMessage", "这是 request 作用域的消息");
        // 在 session 作用域中设置属性
        session.setAttribute("sessionMessage", "这是 session 作用域的消息");
        // 在 application 作用域中设置属性
        application.setAttribute("applicationMessage", "这是 application 作用域的消息");
    %>

    <!-- 使用 EL 表达式读取 page 作用域的数据 -->
    page 作用域的消息: ${pageScope.pageMessage}<br>
    <!-- 使用 EL 表达式读取 request 作用域的数据 -->
    request 作用域的消息: ${requestScope.requestMessage}<br>
    <!-- 使用 EL 表达式读取 session 作用域的数据 -->
    session 作用域的消息: ${sessionScope.sessionMessage}<br>
    <!-- 使用 EL 表达式读取 application 作用域的数据 -->
    application 作用域的消息: ${applicationScope.applicationMessage}<br>

    <!-- 省略域对象,EL 表达式会按顺序查找 -->
    省略域对象时查找的消息: ${pageMessage}<br>
</body>
</html>

十四、JSP标准标签库JSTL

<c:out>:用于在页面上输出数据,同时可以对特殊字符进行转义,防止 XSS 攻击。例如:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:out value="${message}" />

​​​​​​​<c:set>:用于在不同作用域中设置变量。比如在 session 作用域中设置变量:

<c:set var="userName" value="John" scope="session" />

<c:if>:实现条件判断。根据条件的真假来决定是否执行标签体内容:

<c:if test="${user.role == 'admin'}">
    <p>欢迎管理员!</p>
</c:if>

<c:forEach>:用于遍历集合或数组。可以迭代输出列表中的元素:

<c:forEach var="product" items="${productList}">
    <p>${product.name}</p>
</c:forEach>