文章目录
jsp
- 本质上是一个servlet程序
- 当第一次访问jsp程序 tomcat会帮我们把jsp翻译称为一个Java源文件 冰帝他编译称为class字节程序
jsp头部的page指令
jsp的page指令可以修改jsp页面中的一些重要属性 或者行为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
language 属性 表示jsp翻译后是什么语言文件 暂时只支持Java
-
contentype 属性 表示jsp返回的数据类型是什么 也是源码中 resp.setContenType
-
pageEncoding 属性 表示当前jsp页面的字符集 utf-8
-
import 属性 与Java源代码一样 用于导包导类
-
=以下两个属性是给out输出流使用============
-
autoFlush 属性 设置当out输出流缓冲区满了之后 是否自动刷新缓冲区 默认值是true
-
buffer 属性 设置out缓冲区大小 默认是8kb
-
===================================================================
-
errorPage 属性 表示错误后自动跳转去的路径 如 /error.jsp 这个路径一般以斜杠打头 表示请求地址 为http://ip:port/工程路径/
-
isErrorPage 属性 设置当前jsp是否是错误信息页面 默认是false 如果是true 可以获取异常信息
-
session 属性 设置访问当前jsp页面 是否会创建httpSession对象 默认是true
-
extends 属性 设置jsp翻译称为servlet程序 翻译出来的Java类默认继承 谁
jsp常用脚本
声明脚本 格式 <%! 声明Java代码 %>
-
作用 可以给翻译出来的Java类 定义属性 甚至是静态代码块 内部类等
<%-- 声明类的属性--%> <%! private Integer id; private String name; private static Map<String,Object>map; %> <%-- 声明static静态代码块--%> <%! static { map=new HashMap<String,Object>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); map.put("key4","value4"); } %> <%-- 声明类方法--%> <%! public int abc(){ return 1; } %> <%-- 生成内部类--%> <%! public static class A{ private int id=12; private String a="zhanghai"; } %>
表达式脚本
表达式脚本 格式 <%= 表达式脚本 %>
-
作用 在jsp页面上输出数据 输出整型 输出浮点型 输出字符串 输出对象
-
<%-- 输出整型--%> <%= 12%><br> <%= 12.12%><br> <%= "我是字符串"%> <%= map%>
-
特点 所有的表达式脚本都会被翻译到 _jspService方法中
表达式脚本都会被翻译成out.print() 输出到页面上
由于表达式脚本翻译的内容都在_jspService() 方法中 所以_jspService方法中对象都可以直接 使用
表达式脚本中的表达式不能以分号 ; 结束
代码脚本
格式 <% Java语句 %>
作用 可以在jsp页面中 编写我们需要的功能 写的是Java语句 if for循环 _jspService方法内的代码都可以写
<%-- 代码脚本--%>
<%-- if语句--%>
<%
int i=1;
if (i==1){
System.out.println("善人zh");
}else {
System.out.println("伟人zh");
}
%>
<%-- for循环--%>
<%
for (int j=0;j<10;j++){
//循环遍历
}
%>
<%-- _jspService方法内的代码都可以写--%>
<%
String user=request.getParameter("username");
System.out.println("用户的请求参数值是 "+user);
%>
代码脚本特点
1. 代码脚本翻译之后都在_jspService方法中
2. 由于代码脚本翻译到_jspService方法中 所以在_jspService方法中 现有的对象都可以直接使用
3. 还可以由多个代码脚本块组合完成一个Java语句
4. 代码脚本可以和表达式脚本一起使用 在jsp页面上输出数据
jsp 几种注释
- 单行注释 // 放在<% %> Java注释
- 多行注释 /* */ 放在<% %> Java注释
- html注释 会发送到客户端 表面不显示 html注释
- jsp注释 <%-- --%> 表面不显示 只在服务器端可以看到不会发送到客户端 jsp注释
jsp 九大内置对象
内置对象 指tomcat在翻译jsp页面成为 servlet源代码 后 内部提供的九大对象 也叫内置对象
- request 请求对象
- response 响应对象
- pageContext jsp上下文对象
- session 会话对象
- application servletContext对象
- config servletConfig对象
- out jsp输出流对象
- page 指向当前jsp对象
- exception 异常对象
jsp 九大对象中的 四大域对象
四大域对象 分别是 pageContext request session application
域对象 是可以像mao一样存储数据的对象 四个域对象功能一样 不同的是他们对数据的存取范围
pageContext 当前jsp页面范围内有效
request 一次请求内有效
session一个会话范围内有效 (打开浏览器 访问浏览器 直到关闭浏览器)
application 整个 web工程范围内 都有效 只要web工程不停止 数据都在
<%-- 四个域对象中存数据--%>
<%
pageContext.setAttribute("key","pagecontext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
//取数据
pageContext.getAttribute("key");
%>
四个域对象 优先顺序 从小到大的范围的顺序
jsp中 out输出 和response.getWriter 输出的区别
response 表示响应 经常用于设置返回给客户端的内容(输出)
out 也是给用户做输出使用的
当jsp页面中所有的代码执行完毕后 会做以下两个操作
- 执行out.flush()操作 会把out缓冲区中的数据 追加写入 response缓冲区末尾
- 会执行response 的刷新操作 把全部数据 写给客户端
由于 jsp翻译后 底层源代码都是使用out输出 所以一般情况下 我们在jsp页面中统一使用out输出 避免打乱
out.write 输出字符串没有问题
out.print 输出任何数据都没有问题 都转换成字符串后 调用 write输出
在jsp页面中 可以统一使用 out.print 来进行输出
jsp常用标签
静态包含
<%@ include file="footer.jsp"%>
<%--上面那个就是静态包含 file属性 指定你要包含的jsp页面的路径--%>
静态包含的特点
- 静态包含不会翻译被包含的jsp页面
- 静态包含 其实是把被包含的 jsp页面的代码 拷贝到包含的位置进行输出
jsp动态包含
<jsp:include page="footer.jsp"/>
<%-- 上边这就是动态包含 page 属性 是指定你要包含的jsp页面的路径
动态包含也可以像静态包含一样 把被包含的内容 执行输出到包含位置执行输出--%>
特点
- 动态包含会把包含的jsp页面也翻译成Java代码
- 动态包含 还可以传递参数
传递
<jsp:include page="footer.jsp">
<jsp:param name="password" value="20000923"/>
</jsp:include>
获取
<%= request.getAttribute("password")%>
jsp标签 转发
<%--jsp请求转发标签 功能就是请求转发 page属性 设置请求转发的路径--%>
<jsp:forward page="footer.jsp">
</jsp:forward>
练习 输出一个表格
package com.zh.demo1;
public class Student {
private Integer id;
private String name;
private Integer age;
private String phone;
public Student() {
}
public Student(Integer id, String name, Integer age, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
'}';
}
}
<%@ page import="java.util.List" %>
<%@ page import="com.zh.demo1.Student" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: relieved
Date: 2021/9/11
Time: 15:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
table{
border:1px red;
width: 600px;
border-collapse: collapse;
}
td,th{
border:1px red;
}
</style>
</head>
<body>
<%
List<Student> list=new ArrayList<Student>();
for (int i=0;i<10;i++){
int t=i+1;
list.add(new Student(t,"name"+t,18+t,"phone:"+t));
}
%>
<table>
<%for (Student student:list){ %>
<tr>
<td><%=student.getId()%></td>
<td><%=student.getAge()%></td>
<td><%=student.getName()%></td>
<td><%=student.getPhone()%></td>
</tr>
<%}%>
</table>
</body>
</html>
listener 监听器
listener监听器是Javaweb 的三大组件之一 三大组件:servlet程序 filter过滤器 listener 监听器
listener 是javaee的规范 就是接口
监听器作用 监听某种事物的变化 然后 通过回调函数 反馈给客户(程序) 去做一些相应的处理
ServletContextListener 监听器
ServletContextListener可以监听 ServletContext对象的创建和销毁
ServletContext对象在web工程启动的时候创建 在web工程停止的时候销毁
监听到创建和销毁之后 都会分别调用ServletContextListener监听器的方法反馈
两个方法分别是
contextInitialized(ServletContextEvent var1);
在servletContext对象创建之后 马上调用 做初始化
contextDestroyed(ServletContextEvent var1);
在ServletContext对象销毁之后调用
如何使用监听器监听servletContext对象?
- 编写一个类去实现ServletContextListener
- 实现两个回调方法
- 到webxml中去配置监听器
package com.zh.demo1;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener 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.zh.demo1.MyListener</listener-class>
</listener>