1、什么是jsp,有什么作用?
jsp的全称是java server pages。java的服务器页面。
jsp的主要作用是代替Servlet程序回传html页面的数据。
因为Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都极高。
html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是一个html页面数据
</body>
</html>
web.xml配置Servlet程序的代码如下
<servlet>
<servlet-name>PringHtml</servlet-name>
<servlet-class>servlet.PringHtml</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PringHtml</servlet-name>
<url-pattern>/pringHtml</url-pattern>
</servlet-mapping>
1)普通Servlet程序回传html页面数据
public class PringHtml extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过响应的回传流回传html页面数据
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(" <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");
writer.write("\r\n");
}
}
页面输入:http://localhost:8080/08_jsp/pringHtml 可用观察到回传数据
2)jsp文件页面数据 - - - 可以看出本质是Servlet程序
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是jsp页面数据
</body>
</html>
页面输入:http://localhost:8080/08_jsp/a.jsp 可用观察到回传数据
总结:
jsp页面和html页面一样,都是存放在web目录下。访问也跟访问html页面一样。
比如:
在web目录下有如下文件:
web目录
a.html页面 访问地址是 http://ip:port/工程路径/a.html
b.jsp页面 访问地址是 http://ip:port/工程路径/b.jsp
2、jsp的本质是什么
jsp页面本质是一个Servlet程序。
当第一次访问jsp页面的时候。Tomcat服务器会把jsp页面翻译成为一个java源文件,并且对它进行编译成为.class字节码程序,打开java源文件不难发现其里面的内容是:
跟踪源代码发现,HttpjspBase类,直接继承了HttpServlet类。也就是说,jsp翻译出来的java类,间接继承了HttpServlet类,即翻译出来是一个Servlet程序。
总结:
通过翻译的java源代码可得到结果:jsp就是Servlet程序。
可以观察发现翻译出来的Servlet程序的源代码,其底层实现,也是通过输出流,把html页面数据回传给客户端。
3、jsp的三种语法
3.1 jsp头部的page指令
jsp的page指令可以修改jsp页面中一些重要的属性,或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
3.2 jsp中的常用脚本
1)声明脚本- - - 极少使用
声明脚本的格式是:<%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性、方法、静态代码块、内部类等。
练习:
① 声明类属性
② 声明static静态代码块
③ 声明类方法
④ 声明内部类
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
④ 声明内部类--%>
<%--① 声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%--② 声明static静态代码块--%>
<%!
static {
map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");
map.put("key5","value5");
}
%>
<%--③ 声明类方法--%>
<%!
public int abc(){
return 0;
}
%>
<%--④ 声明内部类--%>
<%!
public static class A{
private Integer id=12;
private String abc="abc";
}
%>
</body>
</html>
2)表达式脚本- - - 常用
表达式脚本的格式是:<%= 表达式 %>
作用:在jsp页面上输出数据。
练习:
① 输出整型
② 输出浮点型
③ 输出字符串
④ 输出对象
<%=12 %> <br/>
<%=12.12 %> <br/>
<%="字符串" %> <br/>
<%=map %> <br/>
表达式脚本的特点:
① 所有的表达式脚本都会被翻译到 _jspService()方法中
② 表达式脚本都会被翻译成为out.print()输出到页面上
③ 由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
④ 表达式脚本中的表达式不能以分号结束
3)代码脚本
表达式脚本的格式是:<%java语句%>
作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)。
练习:
① 代码脚本---if语句
② 代码脚本---for循环语句
③ 翻译后java文件中_jspService放啊内的代码都可以写
<%--① 代码脚本---if语句--%>
<%
int i=0;
if (i==0){
System.out.println("0");
}else {
System.out.println("1");
}
%>
<%--② 代码脚本---for循环语句--%>
<%
for (int j=0;j<10;j++){
System.out.println(j);
}
%>
<%--③ 翻译后java文件中_jspService放啊内的代码都可以写--%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:"+username);
%>
代码脚本的特点:
① 代码脚本都会被翻译到 _jspService()方法中
② 代码脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
③ 还可以由多个代码脚本块组合完成一个完整的java语句。
④ 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据
3.3 jsp中三种注释
1)html注释
<!--这是html注释-->
html注释会被翻译到java源代码中,在_jspService方法里,以out.writer输出到客户端。
2)java注释
<%
// 单行注释
/* 多行注释 */
%>
java注释会被翻译到java源代码种
3)jsp注释
<%--这是jsp注释--%>
jsp注释可以注解掉jsp页面种的所有代码
3.4 jsp中九大内置对象
jsp中的内置对象,指Tomcat在翻译jsp页面称为Servlet源代码后,内部提供的九大对象,叫内置对象。
3.5 jsp 四大域对象
四个域对象分别是:
pageContext (PageContextImpl类) 当前jsp页面范围内有效
request (HttpServletRequest类) 一次请求内有效
session (HttpSession类) 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext类) 整个web工程范围内都有效(只要web工程不停止,数据都在)
域对象是可以像Map一样存取数据的对象,四个域对象功能一样。不同的是它们对数据的存取范围。
四个域在使用的时候,优先顺序分别是,从小到大的范围的顺序。
pageContext ---> request ---> session ---> application
3.6 jsp 中的out输出和response.getWriter输出的区别
response中表示响应,经常用于设置返回给客户端的内容(输出),out也是给用户做输出使用的。- - -如果前面执行中出现out.flush()操作,之前的out就会写入到response中,最后执行完所有的jsp中的代码,自动执行out.flush()把剩下的out写到后面。
由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序。
out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用write输出)
深入源码,浅出结论:在jsp页面中,可以统一使用out.print()来进行输出。
3.7 jsp 的常用标签
1)jsp静态包含 - - -常用
静态包含的特点:
1、静态包含不会翻译被包含的jsp页面
2、静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出
举例:使得访问main时,可以输出footer中的尾部信息。
footer代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
尾部信息<br/>
</body>
</html>
main代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br/>
主体内容<br/>
<%--以下就是静态包含,file属性指定要包含的jsp页面的路径
地址中第一个斜杠/ 表示为http://ip:port/工程路径/ 映射到代码的web目录
--%>
<%@include file="/include/footer.jsp"%>
</body>
</html>
2)jsp动态包含
动态包含的底层原理:
动态包含的特点:
1、动态包含会把包含的jsp页面也翻译成为java代码
2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出。
JspRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
3、动态包含,还可以传递参数。
举例:使得访问main时,可以输出footer中的尾部信息。*
footer代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
尾部信息<br/>
<%=request.getParameter("password")%>
</body>
</html>
main代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br/>
主体内容<br/>
<%--动态包含如下所示 page属性指定要包含的jsp页面的路径
动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
<jsp:param name="password" value="root"/>
</jsp:include>
</body>
</html>
3)jsp标签-转发
下面举例请求转发:
两种方式演示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--请求转发方式一:--%>
<%
request.getRequestDispatcher("/a.jsp").forward(request,response);
%>
<%--请求转发方式二:--%>
<%--<jsp:forward page=""></jsp:forward>是请求转发标签
它的功能就是请求转发 page属性设置请求转发的路径
--%>
<jsp:forward page="/a.jsp"></jsp:forward>
</body>
</html>
4、jsp的练习题
4.1 在jsp页面输出九九乘法表
test1.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style type="text/css">
table{
width: 650px;
}
</style>
</head>
<body>
<%--练习在jsp页面中输出九九乘法表--%>
<h1 align="center">九九乘法表</h1>
<table align="center">
<% for (int i=1;i<=9;i++){ %>
<tr>
<% for (int j=0;j<i;j++){ %>
<td> <%=j+"x"+i+"="+(i*j)%> </td>
<% } %>
</tr>
<% } %>
</table>
</body>
</html>
4.2 在jsp输出一个表格,里面有10个学生的信息
学生类:
public class Student {
private Integer id;
private Integer age;
private String name;
private String phone;
public Student() {
}
public Student(Integer id, Integer age, String name, String phone) {
this.id = id;
this.age = age;
this.name = name;
this.phone = phone;
}
...get、set、toString...
test2.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style type="text/css">
table{
border: 1px blue solid;
width: 600px;
border-collapse: collapse;
}
td,th{
border: 1px blue solid;
}
</style>
</head>
<body>
<%--练习:jsp输出一个表格,里面有10学生信息--%>
<%
ArrayList<Student> studentList = new ArrayList<>();
for (int i=0;i<10;i++){
int t=i+1;
studentList.add(new Student(t,18+t,"name"+t,"phone"+t));
}
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
<% 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>
5、请求转发的使用说明
注意:
实现的原因是一次请求中request域中的数据是共享的。
SearchStudentServlet代码如下:其中1、2是通过for循环模拟查询到的数据
public class SearchStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、获取请求的参数
// 2、发sql语句查询学生的信息
// 1、2的操作使用for循环生成查询到的数据做模拟
ArrayList<Student> studentList = new ArrayList<>();
for (int i=0;i<10;i++){
int t=i+1;
studentList.add(new Student(t,18+t,"name"+t,"phone"+t));
}
// 3、保存查询到的结果(学生信息)到request中
request.setAttribute("stuList",studentList);
// 4、请求转发到showStudent.jsp页面
request.getRequestDispatcher("/Test/showStudent.jsp").forward(request,response);
}
showStudent.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style type="text/css">
table{
border: 1px blue solid;
width: 600px;
border-collapse: collapse;
}
td,th{
border: 1px blue solid;
}
</style>
</head>
<body>
<%--练习:jsp输出一个表格,里面有10学生信息--%>
<%
ArrayList<Student> studentList = (ArrayList<Student>) request.getAttribute("stuList");
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
<% 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>
6、什么是Listener监听器
1)Listener监听器是JavaWeb的三大组件之一。JavaWeb三大组件分别是:Servlet程序、Filter过滤器、Listener监听器
2)Listener是JavaE的规范,就是接口
3)监听器的作用是,监听某种事物的变化,然会通过回调函数,反馈给客户(程序)去做一些相应的处理。
6.1 ServletContextListener监听器
ServletContextListener可以监听ServletContext对象的创建和销毁。
ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁。
监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈
两个方法分别是:
public interface ServletContextListener extends EventListener {
// 在ServletContext对象创建之后马上调用,做初始化
default void contextInitialized(ServletContextEvent sce) {
}
// 在ServletContext对象销毁之后调用
default void contextDestroyed(ServletContextEvent sce) {
}
}
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对象被销毁了");
}
}
web.xml配置代码如下:
<!--配置监听器-->
<listener>
<listener-class>listener.MyservletContextListenerImpl</listener-class>
</listener>