1.概念:
jsp的全称是java server pages,java的服务器界面
.
2.作用:
代替servlet程序
回传html页面的数据.
因为servlet程序回传html页面的数据是一件非常繁琐的事情,开发成本和维护成本都极高.
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过响应的输出回传html页面数据
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("");
writer.write("\r\n");
writer.write("\r\n");
writer.write("\r\n");
writer.write("Title \r\n");
writer.write("\r\n");
writer.write("\r\n");
writer.write(" 这是html页面数据\r\n");
writer.write("\r\n");
writer.write("\r\n");
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
a.jsp页面
</body>
</html>
本质:
是一个servlet程序
当我们第一次访问jsp页面
的时候,Tomcat服务器
会帮我们把jsp页面
翻译成为一个java源文件
,并对它进行编译成为.class字节码程序
我们打开java源文件发现里面的内容为:
我们跟踪源代码发现,HttpJspBase类
直接的继承了HttpServlet类
.
也就是说,jsp翻译出来java类
,间接的继承了HttpServlet类
,也就是说翻译出来的是一个sevlet程序
.
我们通过对翻译出来的Servlet程序
的观察发现,其底层实现也是通过输出流
,把html页面的数据
回传给客户端
.
1.jsp头部的page指令
jsp的page指令
可以修改jsp页面中一些重要的属性
或者行为
.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language
属性 表示jsp翻译后是什么语言文件,暂时只支持ava
.
contentType
属性 表示jsp返回的数据类型
是什么.也是源码中response.setContentType参数值
pageEncoding
属性 表示当前jsp页面文件本身
的字符集
import
属性 跟java源代码一样,用于导包导类.
autoFlush
属性 设置当out输出流缓冲区
满了之后,是否自动刷新缓冲区,默认值是true
buffer
属性 设置out缓冲区的大小,默认是8kb.
errorPage
属性 设置当jsp页面运行出错时,自动跳转到错误页面的路径.
isErrorPage
属性 设置当前jsp页面是否是错误页面
,默认是false.
session
属性 设置访问当前jsp页面,是否会创建HttpSession对象
,默认是true.
extends
属性 设置jsp翻译出来的java类默认继承谁.
注意:
autoFlush属性和buffer属性是给out输出流使用.
2.jsp中的常用脚本
(1).声明脚本(极少用
)
格式:
<%! 声明java代码 %>
作用:
可以给jsp翻译出来的java类定义属性
和方法
甚至是静态代码块,内部类
等.
<body>
//1.声明类属性
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
//2.声明static静态代码块
<%!
static{
map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
}
%>
//3.声明类方法
<%!
public int abc(){
return 12;
}
%>
//4.声明内部类
<%!
public static class A{
private Integer id = 12;
private String abc = "abc";
}
%>
</body>
(2).表达式脚本(常用
)
格式:
<%=表达式%>
作用:
在jsp页面上输出数据.
特点:
第一点:
所有的表达式脚本,都会被翻译到_jspService方法中
.
第二点:
表达式脚本都会被翻译成为out.print()
输出到页面上.
第三点:
由于表达式脚本翻译的内容都在_jspService方法中
,所以_jspService方法中的对象
都可以直接使用.
第四点:
表达式脚本中的表达式不能以分号结束
.
<%--1.输出整形--%>
<%--2.输出浮点型--%>
<%--3.输出字符串--%>
<%--4.输出对象--%>
<%--5.获得请求参数--%>
<%=12 %> </br>
<%=12.12 %> </br>
<%="我是字符串" %> </br>
<%=map %> </br>
<%=request.getParameter("username")%>
(3).代码脚本
格式:
<% java语句 %>
作用:
可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
特点:
第一点:
代码脚本翻译后都在_jspService方法
中.
第二点:
代码脚本由于翻译到_jspService方法
中,所以在_jspService
方法中的现有对象
都可以直接使用.
第三点:
还可以由多个代码脚本块组合
完成一个完整的java语句.
第四点:``代码脚本
可以和表达式脚本
一起组合
使用,在jsp页面上输出数据.
<%--1.if语句--%>
<%--2.for语句--%>
<%--3.翻译后_jspService方法内的代码都可以写--%>
<%
int i = 12;
if(i == 12){
%>
<h1>你好</h1>
<%
}
%>
<table border="1" cellspacing="0">
<%
for(int j = 0;j < 3;j++){
%>
<tr>
<td>第<%=j + 1%>行</td>
</tr>
<%
}
%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:" + username);
%>
3.jsp中的三种注释
(1).html 注释
html注释会被翻译到java源代码中,在_jspService方法中,以out.writer输出到客户端.
(2).java注释
java注释会被翻译到java源代码中.
(3).jsp注释
jsp注释可以注掉jsp页面中所有代码.
四个与域对象分别是:
pageContext (PageContextimpl类
) 当前jsp页面
范围内有效.
request (HttpServletRequest类
) 一次请求内
有效.
session (HttpSession类
) 一个会话范围内
有效,(打开浏览器
访问服务器,直到关闭浏览器
).
application (ServletContext类
) 整个web工程范围内
有效(只要web工程不停止,数据都在).
注意:
域对象可以像Map一样是存取数据的对象
,四个域对象功能一样,但对数据的存取范围不同
.
使用上的优先顺序:
pageContext—request—session—application
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
pageContext:<%= pageContext.getAttribute("key") %></br>
request:<%= request.getAttribute("key")%></br>
session:<%= session.getAttribute("key")%></br>
application:<%= application.getAttribute("key")%></br>
<%
request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>
<h1>scope2.jsp页面</h1>
pageContext:<%=pageContext.getAttribute("key")%></br>
request:<%=request.getAttribute("key")%></br>
session:<%=session.getAttribute("key")%></br>
application:<%=application.getAttribute("key")%></br>
</body>
response
中表示响应,经常用于设置
返回给客户端的内容
(输出).
out
也是给用户做输出使用的.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.write("输出");
out.flush();
response.getWriter().write("输出r");
%>
</body>
</html>
注意:
(1).由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出
,避免打乱页面输出内容的顺序
.
(2).
out.write() 输出字符串没有问题
out.print() 输出任何数据都没有问题.(统一使用
)
1.jsp静态包含
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%--
<%@ include file="" %> 就是静态包含
file 属性指定你要包含的jsp页面的路径
地址中第一个斜杠 / 表示为http://ip:port/工程路径/ 映射到代码的web目录
静态包含的特点:
1.静态包含不会翻译被包含的jsp页面
2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出.
--%>
<%@ include file="/include/footer.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
页脚信息<br>
</body>
</html>
2.jsp动态包含
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%--
<jsp:include page=""></jsp:include> 动态包含
page 属性是指你要包含的jsp页面的路径
动态包含和静态包含一样,把被包含的内容执行输出到包含位置
动态包含的特点:
1.动态包含会把被包含的jsp页面也翻译成java代码
2.动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出.
JsRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
3.动态包含还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="root"/>
<jsp:param name="password" value="root1"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
页脚信息<br>
<%=request.getParameter("password")%>
</body>
</html>
3.jsp标签-转发
<%
// request.getRequestDispatcher(“/scope2.jsp”).forward(request,response);
%>
<%- -
就是请求转发标签 功能就是请求转发
page
属性设置请求转发的路径
–%>
请求转发的使用说明:
Listener监听器
是JavaWeb的三大组件之一Servlet程序
、Filter过滤器
、Listener监听器
JavaEE
的规范(接口
)回调函数
,反馈给客户(程序)去做一些相应的处理.1.ServletContextListener监听器
ServletContextListener
可以监听ServletContext对象
的创建和销毁.ServletContext对象
在web工程启动的时候创建,在web工程停止的时候销毁.创建
和销毁
之后都会分别调用ServletContextListener监听器
的方法反馈.contextInitialized(ServletContextEvent sce)
contextDestroyed(ServletContextEvent sce)
ServletContextListener监听器监听ServletContext对象的步骤
1.编写一个类去实现ServletContextListener
2.实现其两个回调方法
3.到web.xml中配置监听器
public class Listener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被销毁了");
}
}
<listener>
<listener-class>com.servlet.listener.Listener</listener-class>
</listener>