1、JSP概述
【简介】: JSP的全名为Java Server Page,是运行在服务端的Java页面,以前学习的HTML是运行在浏览器端。JSP是运行在服务器上,最终还是解析成静态的HTML,运行在浏览器。我们在浏览器上看到的HTML页面,其实就是JSP在服务器上运行的结果。
1、JSP优势
技术 | 特点 |
---|
HTML | 静态页面 :优点:方便美化页面操作,写js和css代码比较方便 缺点:不能写动态内容 |
Server | 运行在服务器上的小程序,优点:制作动态内容,缺点:不方便HTML以及css和js代码的书写 |
JSP | JSP=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、转发和重定向的作用
2、转发概述
1、跳转位置
2、转发原理

3、转发的方法
- request.getRequestDispatcher(“/要跳转到的地址”).forward(request, response)
4、代码演示
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;
@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("---------------------------------------");
req.getRequestDispatcher("/forward/twoServlet").forward(req, resp);
System.out.println("第一个跳转后servlet执行");
}
}
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;
@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");
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、代码演示
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;
@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("---------------------------------------");
resp.sendRedirect("/redirect/twoServlet");
System.out.println("第一个跳转后servlet执行");
}
}
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;
@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");
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、作用域的选择
- 先考虑作用范围小的作用域,如果小作用范围的作用域能满足需求就使用小作用范围的作用域。
- 考虑顺序:请求域–>会话域–>上下文域