10、JavaWeb启程——JSP

本文详细介绍JSP技术的基本概念、优势及执行过程,并深入探讨JSP的基本语法,包括注释、脚本片段、脚本表达式及声明等内容。此外,还对比分析了JSP中的转发与重定向机制,阐述其原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、JSP概述

【简介】: JSP的全名为Java Server Page,是运行在服务端的Java页面,以前学习的HTML是运行在浏览器端。JSP是运行在服务器上,最终还是解析成静态的HTML,运行在浏览器。我们在浏览器上看到的HTML页面,其实就是JSP在服务器上运行的结果。

1、JSP优势

技术特点
HTML静态页面 :优点:方便美化页面操作,写js和css代码比较方便 缺点:不能写动态内容
Server运行在服务器上的小程序,优点:制作动态内容,缺点:不方便HTML以及css和js代码的书写
JSPJSP=html+servlet 特点:既有HTML的优点,方便美化页面又有servlet的优点:可以在页面中书写Java代码,可以制作动态页面

2、JSP执行过程

【图示】:
在这里插入图片描述
【流程概述】:

  • 1、浏览器请求jsp页面,Tomcat中的JspServlet会先将jsp文件翻译为Servlet文件xxx_jsp.java
  • 2、将翻译的文件 xxx_jsp.java编译为字节码文件xxx_jsp.class
  • 3、加载字节码文件xxx_jsp.class并创建xxx_jsp对象
  • 4、调用xxx_jsp的service()方法处理请求并响应数据

3、JSP基本语法

1、JSP的注释

JSP注释说明
<%-- 注释内容–%>这里的注释不会翻译到servlet中,在翻译到java文件的时候会忽略注释中的内容,所以最终我们在页面源码中是看不到注释内容的

2、JSP脚本片段

JSP脚本片段说明
语法<%java代码;%>
作用在jsp的页面上执行一段Java代码,必须符合Java语法规则,每行代码以分号结束;可以在脚本片段中使用Java的语法;代码会被翻译到service方法中

3、JSP脚本表达式

JSP脚本表达式说明
语法<%= 变量名或表达式%> 翻译成 Servlet 变成 out.print() 打印输出 注意:后面没有分号
作用直接输出变量的值或对表达式进行计算
  • 代码演示
JSP脚本表达式:
<%
String name = "孙悟空";
%>
<%=name%> <br>
<%=3*4%> <br>

4、JSP的声明

JSP声明说明
语法<%! 全局变量或方法 %>
作用用于在JSP页面上声明全局变量或方法 注:很少在页面上声明方法
  • 代码演示
<h2>JSP声明</h2>
<%--JSP脚本片段--%>
<%
String name = "jack";
%>
<%--JSP声明--%>
<%!
String name="rose";
%>
<%=name%><br>
<%=this.name%><br>

4、JSP转发和重定向

1、转发和重定向的作用

  • 用于web组件的跳转,从A组件跳转到另一个组件

2、转发概述

1、跳转位置

  • 发生在服务器端进行资源的跳转

2、转发原理

在这里插入图片描述

3、转发的方法

  • request.getRequestDispatcher(“/要跳转到的地址”).forward(request, response)

4、代码演示

  • OneServlet
package cn.simplelife.work._01forward;

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.io.PrintWriter;

/**
 * @ClassName OneServlet
 * @Description
 * @Author simplelife
 * @Date 2022/10/25 9:43
 * @Version 1.0
 */

@WebServlet(value = "/forward/oneServlet")
public class OneServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        String username = req.getParameter("username");
        System.out.println("one——begin——username = " + username);
        System.out.println("---------------------------------------");
        // 跳转到forward/twoServlet做响应打印用户名
        req.getRequestDispatcher("/forward/twoServlet").forward(req, resp);
        System.out.println("第一个跳转后servlet执行");
        // 第一个servlet做响应 此时的响应不会做出响应
//        PrintWriter writer = resp.getWriter();
//        writer.println("第一个servlet结束");
    }
}

  • TwoServlet
package cn.simplelife.work._01forward;

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.io.PrintWriter;

/**
 * @ClassName OneServlet
 * @Description
 * @Author simplelife
 * @Date 2022/10/25 9:43
 * @Version 1.0
 */

@WebServlet(value = "/forward/twoServlet")
public class TwoServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置响应格式
        resp.setContentType("text/html;charset=utf-8");
        // 获取/forward/oneServlet携带的用户名信息
        String username = req.getParameter("username");
        System.out.println("two——获取——one的username = " + username);
        // 获取输出流对象
        PrintWriter writer = resp.getWriter();
        // 响应给浏览器
        writer.println("第二个servlet响应的数据:" + username);
    }
}

3、重定向概述

1、跳转位置

  • 在浏览器端进行页面跳转

2、重定向原理

在这里插入图片描述

3、重定向方法

  • response.sendRedirect(“要跳转的地址”)

4、代码演示

  • OneServlet
package cn.simplelife.work._02redirect;

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.io.PrintWriter;

/**
 * @ClassName OneServlet
 * @Description
 * @Author simplelife
 * @Date 2022/10/25 9:43
 * @Version 1.0
 */

@WebServlet(value = "/redirect/oneServlet")
public class OneServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        String username = req.getParameter("username");
        System.out.println("one——begin——username = " + username);
        System.out.println("---------------------------------------");
        // 跳转到forward/twoServlet做响应打印用户名
        resp.sendRedirect("/redirect/twoServlet");
        System.out.println("第一个跳转后servlet执行");
        // 转发可以访问到WEB-INF下的资源文件 重定向不能访问
        // 因为重定向是在浏览器端重新发起请求,转发是在服务器端进行
        // 重定向可以进行跨域访问,地址栏会发生变化
        // 转发不可以进行跨域访问,因为是在本服务器内进行转发,地址栏不会发生变化,只发生一次请求
//        req.getRequestDispatcher("/WEB-INF/hello.jsp").forward(req, resp);
        // 第一个servlet做响应 此时的响应不会做出响应
//        PrintWriter writer = resp.getWriter();
//        writer.println("第一个servlet结束");
    }
}
  • TwoServlet
package cn.simplelife.work._01forward;

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.io.PrintWriter;

/**
 * @ClassName OneServlet
 * @Description
 * @Author simplelife
 * @Date 2022/10/25 9:43
 * @Version 1.0
 */

@WebServlet(value = "/forward/twoServlet")
public class TwoServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置响应格式
        resp.setContentType("text/html;charset=utf-8");
        // 获取/forward/oneServlet携带的用户名信息
        String username = req.getParameter("username");
        System.out.println("two——获取——one的username = " + username);
        // 获取输出流对象
        PrintWriter writer = resp.getWriter();
        // 响应给浏览器
        writer.println("第二个servlet响应的数据:" + username);
    }
}

4、转发和重定向的区别

区别转发重定向
目录服务器的根目录浏览器的根目录
地址栏地址栏不发生变化地址栏发生变化
跳转位置在服务器端跳转在浏览器端跳转
请求对象请求数据不会丢失,因为是同一个请求请求数据有可能丢失,因为不是同一个请求
WEB-INF下的资源可以跳转到不可以跳转到
跨域问题请求转发不可以跳转到其他域名或项目下的资源可以进行跨域访问

5、转发和重定向的选择

  • 如果需要保留请求域中的数据就使用转发
  • 如果想访问WEB-INF下的资源就使用转发
  • 要跳转到其他域使用重定向

6、请求和转发之后的代码会不会执行

  • 无论是请求转发还是重定向,后续代码都会执行,但是一般情况下转发和重定向之后不会再有代码,因为没有实际意义了。

5、三大作用域

1、什么是作用域

  • 用于Servlet之间数据的共享的服务器内存区域,作用域结构是一个Map<String,Object>

2、作用域的类型

作用域类型作用域范围
请求域HttpServletRequest只在同一次请求中起作用
会话域HttpSession同一个会话中起作用,第一次访问到浏览器关闭的整个过程
上下文作用域ServletContext同一个应用中起作用,服务器启动知道服务器关闭的整个过程都起作用

3、作用域方法

与作用域有关的方法作用
Object getAttribute(“键”)从中得到一个值
void setAttribute(“键”,Object数据)向作用域中存储键值对数据
void removeAttribute(“键”)删除作用域中的键值对数据

4、作用域的选择

  • 先考虑作用范围小的作用域,如果小作用范围的作用域能满足需求就使用小作用范围的作用域。
  • 考虑顺序:请求域–>会话域–>上下文域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执手天涯@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值