一、jsp
1、作用
jsp(全称 java server pages),java的服务器页面
jsp的主要作用是代替Servlet程序回传html页面的数据
Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都极高
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过响应的回传流回传html页面数据
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write("<html lang=\"en\">\r\n");
writer.write("<head>\r\n");
writer.write(" <meta charset=\"UTF-8\">\r\n");
writer.write(" <title>Title</title>\r\n");
writer.write("</head>\r\n");
writer.write("<body>\r\n");
writer.write(" 这是html页面数据\r\n");
writer.write("/body>\r\n");
writer.write("</html>\r\n");
}
2、jsp如何访问
jsp页面和html页面一样,都是存放在web目录下。访问也跟访问html页面一样
如:
在web目录下有如下文件:
web目录:
a.html页面 访问地址是=====>>>http://ip:port/工程路径/a.html
b.jsp页面 访问地址是=====>>>http://ip:port/工程路径/b.jsp
3、jsp的本质是什么
jsp页面本质上是一个Servlet程序
当第一次访问jsp页面时,Tomcat服务器会帮我们把jsp页面翻译成一个java源文件,且对它进行编译成为.class字节码程序,打开java源文件发现其中的内容是:
总结:通过翻译的java源代码可以得到结果:jsp就是Servlet程序
4、jsp头部的page指令
jsp的page指令可以修改jsp页面中的一些重要属性,或者行为
<%@ page contentType = “text/html;charset = UTF-8” language = “java”%>
①language属性:表示jsp翻译后是什么语言文件,暂时只支持java
②contentType属性:表示jsp返回的数据类型是什么,也是源码中response.setContentType{}参数值
③pageEncoding属性:表示当前jsp页面文件本身的字符集
④import属性:跟java源代码中一样,用于导包,导类
两个属性是给out输出流使用
⑤autoFlush属性:设置当out输出流缓冲区满了之后,是否自动刷新缓冲区,默认值是true
⑥buffer属性:设置out缓冲区的大小,默认是8kb
缓冲区溢出错误:
⑦errorPage属性:设置当jsp页面运行时出错,自动跳转去的错误页面路径
⑧isErrorPage属性:设置当前jsp页面是否是错误信息页面,默认是false。如果是true,可以获取异常信息
⑨session属性:设置访问当前jsp页面,是否会创建HttpSeesion对象,默认是true
⑩extends属性:设置jsp翻译出来的java类默认继承谁
5、jsp中的常用脚本
①声明脚本
格式:
<%! 声明java代码 %>
作用:可以给jsp翻译出来的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");
}
%>
声明类方法
<%!
public int abc(){
return 12;
}
%>
声明内部类
<%!
public static class A{
private Integer id = 12;
private String abc = "abc";
}
%>
②表达式脚本
格式:<%=表达式%>
作用:在jsp页面上输出数据
练习:
输出整型
输出浮点型
输出字符串
输出对象
<%=12%>
<%=12.12%>
<%="我是字符串"%>
<%=map%>
表达式脚本的特点:
1.所有的表达式脚本都会被翻译到_jspServlet方法中
2.表达式脚本都会被翻译成为out.print()输出到页面上
3.由于表达式脚本翻译的内容都在_jspServlet方法中,所以_jspServlet()方法中的对象都可以直接使用
4.表达式脚本中的表达式不能以分号结束
③代码脚本
格式:
<%
java语句
%>
代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
练习:
代码脚本—if语句
<%
int i = 12;
if (i == 12){
System.out.println("帅哥");
}else {
System.out.println("骗人");
}
%>
代码脚本----for循环语句
<%
for (int j = 0;j < 10;j++){
System.out.println(j);
}
%>
翻译后java文件中_jspServlet方法内的代码都可以写
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数是:" + username);
%>
代码脚本的特点:
1.代码脚本翻译之后都在_jspServlet方法中
2.代码脚本由于翻译到_jspService()方法中,所以在_jspServlet()方法中的现有对象都可以直接使用
3.还可以由多个代码脚本块组合完成一个完成的java语句
4.还可以和表达式脚本一起组合使用,在jsp上输出数据
④jsp中的三种注释
①html注释
<!-- -->
html注释会被翻译到java源代码中,在_jspService方法里,以out.write输出到客户端
②java注释
<%
//单行java注释
/*多行java注释*/
%>
java注释会被翻译到源代码中
③jsp注释
<%--这是jsp注释--%>
6、jsp九大内置对象
内置对象:Tomcat在翻译jsp页面称为Servlet源代码后,内部提供的九大对象
request:请求对象
response:响应对象
pageContext:jsp的上下文对象
session:会话对象
application:ServletContext对象
config:ServletConfig对象
out:jsp输出流对象
page:指向当前jsp对象
exception:异常对象
7、jsp四大域对象
四个域对象分别是:
pageContext(PageContentimpl类):当前jsp页面范围内有效
request(HttpServletRequest类):一次请求内有效
session(HttpSession类):一个会话范围内有效(打开浏览器访问服务器,知道关闭浏览器)
application(ServletContext类):整个web工程范围内都有效(只要web工程不停止,数据都在)
域对象是可以像Map一样存取数据的对象,四个域对象功能一样,不同的是它们对数据的存取范围
虽然四个域对象都可以存取对象,在使用上他们是有优先顺序的
四个域在使用时,优先顺序分别是,它们从小到大的范围的顺序
<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")%>
session域是否有值:<%=session.getAttribute("key")%>
application域是否有值:<%=application.getAttribute("key")%>
<%
request.getRequestDispatcher("/scope.jsp").forward(request,response);
%>
</body>
8、jsp中的out输出和response.getWriter输出的区别
response中表示响应,经常用于设置返回给客户端的内容(输出)
out也是给用户做输出使用
out.write("out输出1 <br/>");
out.write("out输出2 <br/>");
9、jsp的常用标签
①jsp静态包含
<%@ include file=""%>
file属性指定你要包含的jsp页面的路径
地址中第一个斜杠表示为http://ip:port/工程路径/ 映射到代码的web目录
静态包含的特点:
1.静态包含不糊翻译被包含的jsp页面
2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出
②jsp动态包含
<jsp:include page = ""></jsp:include>
page属性是指定你要包含的jsp页面的路径
动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置
动态包含的特点:
1.动态包含会把包含的jsp页面也翻译成java代码
2.动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出
jspRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
3.还可以传递参数
③常用标签之请求转发
<jsp:forward page = ""></jsp:forward>
10、jsp练习一:九九乘法表
<html>
<head>
<title>Title</title>
<style type="text/css">
table{
width:650px;
}
</style>
</head>
<body>
<%-- 在就是骗页面中输出九九乘法口诀表--%>
<table align="center">
<%
for (int i = 1;i <= 9;i++){ %>
<tr>
<%for (int j = 1;j <= i;j++){ %>
<td><%=i + "x" + j + "=" + (i*j)%></td>
<% } %>
</tr>
<% } %>
</table>
</body>
</html>
11、jsp练习二:输出一个表格,里边有10个学生信息
<html>
<head>
<title>Title</title>
<style>
table{
border: 1px red solid;
width: 600px;
border-collapse: collapse;
}
td,th{
}
</style>
</head>
<body>
<%
List<Student> studentList = new ArrayList<Student>();
for (int i = 0;i < 10;i++){
int t = i+1;
studentList.add(new Student(i+1,"name"+t,18+t,"phone"+t));
}
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
</table>
<table>
<% for (Student student :studentList){ %>
<tr>
<td><%=student.getId()%></td>
<td><%=student.getName()%></td>
<td><%=student.getAge()%></td>
<td><%=student.getPhone()%></td>
<td>删除、修改</td>
</tr>
<% } %>
</table>
</body>
</html>
二、监听器
1、Listener监听器
①是javaweb三大组件之一,三大组件:Servlet程序、Filter过滤器、Listener监听器
②是javaEE的规范,就是接口
③监听器的作用:监听某种事务的变化,然后通过回调函数,反馈给客户(程序)做一些相应的处理
2、ServletContextListener监听器
可以监听ServletContext对象的创建和销毁
ServletContextListener对象在wen工程启动时创建,在web工程停止时销毁
监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈
两个方法分别是:
public interface ServletContextListener extends EventListener{
/**
*在ServletContext对象创建之后马上调用,做初始化
*/
public void contextInitialized(ServletContextEvent sce);
/**
*在ServletConext对象销毁之后调用
*/
public void contextDestroyed(ServletContextEvent sce);
}
如何使用ServletContextListener监听器监听ServletContext对象?
步骤:
①编写一个类实现
②实现其两个回调方法