6.1 JSP简介
什么是JSP:
JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。
在JSP中java代码与HTML共同存在,其中HTML代码用于展示静态的内容,java代码用来展示动态的内容。
为什么出现JSP技术:
1997年Java Web中只有servlet,生成html技术也需要在servlet中完成,虽然servlet也可以完成所有输出工作,但是使用过程比较麻烦,部署也比较复杂,为了克服这些缺点,1999年SUN公司推出了JSP技术,该技术在生成HTML代码的时候相比servlet方便了许多。
对于servlet和JSP技术的理解:
servlet:在java代码中嵌入html代码,更擅长编写java业务代码JSP,在html中嵌入java代码,更擅长页面展示。
package net_zixue.JSP;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "HTMLServlet",urlPatterns = "/html")
public class HTMLServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("<!DOCTYPE html>");
writer.write("<html lang=\"en\">");
writer.write("<head>");
writer.write("<meta charset=\"UTF-8\">");
writer.write("<title>home</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("<h2>我是网站的首页,欢迎访问</h2>");
writer.write("</body>");
writer.write("</html>");
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>我是网站的首页,欢迎访问</h2>
</body>
</html>
6.2 JSP运行原理
JSP的运行原理:
jsp在第一次被访问时会被Web容器翻译成servlet,即jsp本质上就是Servlet。
过程:
第一次访问----->helloServlet.jsp------>helloServlet_jsp.java------->编译运行
被翻译后的servlet在Tomcat的work目录中可以找到,使用IDEA会单独为项目维护一个目录。
通过观察发现jsp会转化为java文件,并且间接的继承了HttpServlet,实现了其中的主要方法,init、service、destory,并且将html代码通过java方式输出给浏览器。
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<%@include file="/include.jsp" %>
<%@taglib uri="xxx" prefix="c"%>
<%@taglib uri="xxx" prefix="a"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>hello jsp</h2>
<jsp:include page="include1.jsp"></jsp:include>
<%
// Map map = new HashMap<>();
//
// response.getHeaders();
// request.getAttribute();
// session.setAttribute();
//java单行注释
/*
java多行注释
*/
String str = "hello jsp";
int i=0;
i++;
%>
<%-- jsp注释 --%>
<%="变量i="+i
%>
<%!
int x = 0;
%>
</body>
</html>
6.3 JSP脚本与注释
JSP脚本:
- <%java代码%>
- <%=java变量或表达式%>
- <%!java代码%>
JSP注释:
- Html注释:
<!--注释内容-->
- java注释:
//单行注释 /*多行注释*/
- jsp注释:
<%--注释内容--%>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%--
Created by IntelliJ IDEA.
User: 随身汀
Date: 2021/4/14
Time: 19:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<%@include file="/include.jsp" %>
<%@taglib uri="xxx" prefix="c"%>
<%@taglib uri="xxx" prefix="a"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>hello jsp</h2>
<jsp:include page="include1.jsp"></jsp:include>
<%
// Map map = new HashMap<>();
//
// response.getHeaders();
// request.getAttribute();
// session.setAttribute();
//java单行注释
/*
java多行注释
*/
String str = "hello jsp";
int i=0;
i++;
%>
<%-- jsp注释 --%>
<%="变量i="+i
%>
<%!
int x = 0;
%>
</body>
</html>
JSP脚本
- <%java代码%>-----内部的java代码翻译到service方法的内部
- <%=java变量或表达式%>-----会被翻译成service方法内部的out.print()
- <%!java代码%>------会被翻译成service的成员的内容
6-4 JSP指令
jsp指令(3个):
jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:
page指令-----属性最多的指令(实际开发中page指令默认),属性最多的一个指令,根据不同的属性,指导整个页面特性格式:<%@ page 属性名1=“属性值1” 属性名2=“属性值2”…%>
常用属性如下:
language:jsp脚本可以嵌入的语言种类
contentType:response.setContentType(text/html.charset=UTF-8)
session:是否jsp在翻译时自动创建session
import:导入java的包
errorPage:当当前页面出错后跳转到哪个页面
include指令
页面包括(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=“被包含的文件地址”%>
taglib指令
在jsp页面中引入标签库(jstl标签库,structs2标签库)
格式:<%@ taglb url=“标签库地址” prefix=""%>
<%@include file="/include.jsp" %>
<%@taglib uri="xxx" prefix="c"%>
6-5 JSP隐式对象概述
什么是JSP隐式对象:
当jsp被翻译成servlet的时候,service方法内部由九个对象定义并初始化,这九个对象被称为隐式对象
out
<%@ page contentType="text/html;charset=UTF-8" language="java" buffer="0kb" %>
<html>
<head>
<title>Title</title>
</head>
<body>
1111111111
<%
response.getWriter().write("2222222");
out.write("333333333333");
%>
<%="44444444444"
%>
</body>
</html>
6-7 JSP九大隐式对象-pageContext
pageContext对象:
pageContext对象就是jsp页面的上下文对象
pageContext是一个域对象:
- setAttribute(String name,Object obj)
- getAttribute(String name)
- removeAttribute(String name)
pageContext可以向指定的其他域中存取数据:
- setAttribute(String name,Object obj,int scape)
- getAttribute(String name,int scape)
- removeAttribute(String name,int scape)
- findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
可以获得其他8大隐式对象:
例如:pageContext.getRequest()
pageContext.getSession()
<%--
Created by IntelliJ IDEA.
User: 随身汀
Date: 2021/4/14
Time: 20:32
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>
<%
// pageContext.setAttribute("name","xiaoming");
// pageContext.setAttribute("name","zhangsan",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name","lisi",PageContext.SESSION_SCOPE);
pageContext.setAttribute("name","wangwu",PageContext.APPLICATION_SCOPE);
%>
<%=pageContext.getAttribute("name",PageContext.REQUEST_SCOPE)%>
<%=pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE)%>
<%=
pageContext.findAttribute("name")
%>
</body>
</html>
四大作用域的区别:
page域:当前jsp页面范围
request域:一次请求
session域:一次会话
application域:整个web应用
6-8 JSP标签
什么是JSP标签:
JSP标签用来控制JSP的行为,执行一些常用的JSP页面动作,通过标签可以实现很多行java代码才能够实现的功能,比如请求转发的功能。
常用的JSP标签:
- 页面包含(动态包含):<jsp:include page=“被包含的页面”/>
- 请求转发:<jsp:forward page=“要转发的资源”>
JSP指令:
import:导入java的包
errorPage:当当前页面出错后跳转到哪个页面
include指令
页面包括(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=“被包含的文件地址”%>
taglib指令
在jsp页面中引入标签库(jstl标签库,structs2标签库)
格式:<%@ taglb url=“标签库地址” prefix=""%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="hello.jsp"></jsp:forward>
</body>
</html>