JSP
1. 什么是jsp,它有什么用?
- jsp的全称是java server pages(Java的服务器页面)。
- jsp的主要作用是代替 Servlet 程序回传html页面的数据。
因为servlet 程序回传html页面数据是一件非常繁锁的事情。开发成本和维护本都极高。
2. jsp的本质是什么
-
jsp页面本质上是一个servlet程序。
当我们第一次访问jsp页面的时候。Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件。并且对它进行编译成为.class字节码程序。
打开java源文件会发现它继承了HttpServlet类。
3. jsp的三种语法
A)jsp头部的page 指令
jsp的page指令可以修改sp页面中一些重要的属性,或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language属性
表示jsp翻译后是什么语言文件。暂时只支持java。
contentType属性
表示jsp返回的数据类型是什么。也是源码中response.setContentType()参数值
pageEncoding 属性
表示当前jsp页面文件本身的字符集。
import 属性
跟java源代码中一样。用于导包,导类。
*问题:IDEA提示 Cannot resolve class or package 'utill
<%@ page import="java.util.*" %>
-解决:
修改设置File->Project Structure->Project,把该改的改了
- 这两个属性是给out 输出流使用,一般不修改
autoFlush属性
当out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。
buffer属性
设置out缓冲区的大小。默认是8kb
*修改后 :报错500 jsp.error.autoFlush.invalid
errorPage属性:设置当jsp页面运行时出错,自动跳转去的错误页面路径。
设置错误页面为同目录下的errorPage.jsp,发生错误即可跳转到这个页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="/errorPage.jsp"
pageEncoding="UTF-8"%>
isErrorPage属性
设置当前sp页面是否是错误信息页面。默认是false。如果是true可以通过源代码获取异常信息。
session属性
设置访问当前jsp页面,是否会创建HttpSession对象。默认是true。
extends属性
设置jsp翻译出来的java类默认继承谁。
B)jsp中常用的脚本
a)声明脚本(极少用)
格式:<%! ... %>
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 0;
}
%>
4.声明内部类
<%!
public static class A{
private Integer id = 1;
private String name = "aaa";
}
%>
b)表达式脚本(常用)
-
表达式脚本的格式是:
<%=表达式%>
-
表达式脚本的作用是:在jsp页面上输出数据。
-
表达式脚本的特点:
-
所有的表达式脚本都会被翻译到_jspService()方法中
-
表达式脚本都会被翻译成为out.print()输出到页面上
-
由于表达式脚本翻译的内容都在jspService()方法中,所以jspService()方法中的对象都可以直接使用。
-
<%=request.getParameter("username") %>
-
-
表达式脚本中的表达式不能以分号结束。
-
- 练习:
1.输出整型
2.输出浮点型
3.输出字符率
4.输出对象
<%=12 %><br>
<%=12.12 %><br>
<%="String" %><br>
<%=map %><br>
c)代码脚本
-
代码脚本的格式是:
<%java语句%>
-
代码脚本的作用是:
可以在jsp页面中,编与我们自己需要的功能(写的是java语句)。
-
代码脚本的特点是:
- 1、代码脚本翻译之后都在_jspService()方法中
2、代码脚本由于翻译到_jspService()方法中,所以在_jspService方法中的现有对象都可以直接使用。
3、还可以由多个代码脚本块组合完成一个完成的java语句。
4、代码脚本还可以和表达式脚本一起组合使用。在jsp页面上输出数据
- 1、代码脚本翻译之后都在_jspService()方法中
<%
for(int j=0;j<5;j++){
%>
<%= j %>
<%
}
%>
-
示例
1.代码脚本--if语句
2.代码脚本----for循环语句
3.翻译后java文件中_jspService方法内的代码都可以写<% for(int j=0;j<3;j++){ System.out.println(j); } %> <% String username=request.getParameter("username"); System.out.println("用户的请求参数是:"+username); %>
C)jsp中三种注释
1.html注释
<!--这是html注释-->
html 注释会被翻译到java源代码中。在jspService方法里,以out.writer输出到客户端。
2.java注释
<%
//单行java注释
/*多行java注释*/
%>
java 注释会被翻译到java源代码中。
3.jsp注释
<%--这是jsp注释--%>
jsp注释可以注掉jsp页面中所有代码。
4. jsp九大内置对象
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中可以直接使用这9个对象
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息, |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
5. jsp四大域对象
-
四个的数据存取范围不同
-
pageContext域:当前jsp页面范围
-
request域:一次请求内
-
session域:一次会话内(打开浏览器访问服务器,直到关闭该浏览器)
-
application域:整个web工程范围内(只要web工程不停止,数据都在)
-
- 四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
pagecontexI --> request -->session --> application
-
测试用:
- scope.jsp
<h1>scope页面</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); %>
- scope.jsp
<!-- 取数据 --> pageContext取数据:<%= pageContext.getAttribute("key")%><br> request取数据:<%= request.getAttribute("key")%><br> session取数据:<%= session.getAttribute("key")%><br> application取数据:<%= application.getAttribute("key")%><br>
6. jsp中的out输出和response.getWriter输出的区别
-
response中表示响应,我们经常用于设置返回给客户端的内容(输出)
out 也是给用户做输出使用的。
-
当jsp页面中所有代码执行完成后会做以下两个操作:
-
执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲区末尾
-
会执行response的刷新操作。把全部数据写给客户端。
-
-
由于jsp翻译之看,底层源代码都是使用out 来进行输出。所以一般情况下。我们在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序。
-
示例:不管out写在responese的前面还是后面,最后显示out都会在后面。
<%
out.write("out输出1 <br>");
out.write("out输出2 <br>");
%>
<%
response.getWriter().write("response输出1 <br>");
response.getWriter().write("response输出2 <br>");
%>
- 在jsp页面中,统一使用out.print()来进行输出
- out.write() :只能输出字符串
out.print() :输出任意数据类型都没有问题(先转换为字符串,再调用write输出)
- out.write() :只能输出字符串
7.jsp的常用标签
a) 静态包含
<%@ include file=" "%>
file属性指定要包含的jsp页面的路径
-
静态包含的特点:
1.静态包含不会翻译被包含的jsp页面。
2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出。 -
例子:
main.jsp(指向同目录下的footer.jsp)
头<br> 身体<br> <%@ include file="./footer.jsp"%>
footer.jsp
尾巴
b)动态包含
-
<jsp:include page=""></jsp:include>
page属性指向要包含的jsp页面路径
-
动态包含的特点:
- 动态包含会把包含jsp页面翻译成java代码
- 动态包含 底层使用如下代码去调用 被包含jsp页执行输出。
JspRuntimetibrary.incLude(request,response,"/include/footer.jsp",out,false);
- 动态包含,可以传递参数。
-
示例:
main.jsp
头<br> 身体<br> <jsp:include page="./footer.jsp"> <jsp:param name="username" value="hell" /> <jsp:param name="psw" value="root" /> </jsp:include>
footer.jsp
尾巴<br> <%=request.getParameter("psw")%>
2)请求转发:<jsp:forward page="要转发的资源" />
c)请求转发
-
<jsp:forward page=""></jsp:forward>
-
示例:
<jsp:forward page="/scope2.jsp"></jsp:forward>
-
和这个作用一样
<% request.getRequestDispatcher("/scope2.jsp").forward(request,response); %>
-
8. 什么是Listener监听器?
- Listener 监听器,它是lavaWeb的三大组件之一。JavaWeb的三大组件分别是:Servlet 程序、Filter 过滤器、Listener监听器。
- Listener它是JavaEE的规范,就是接口。
- 监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
8.1 ServletContextListener 监听器
-
ServletContextListener 它可以监听 ServletContext对象的创建和销毁。
ServletContext 对象在web工程启动的时候创建,在web工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContextListener监听器的方法反馈。
-
示例:
注意要加上注解
@WebListener
@WebListener public class MyServletContextListenerImpl implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext对象被创建了"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContext对象被销毁了"); } }