一、概念
1、何为jsp,它有什么用
jsp是Java的服务器页面,jsp的主要作用是代替Servlet程序回传html页面的数据
2、jsp如何访问
jsp文件和html文件一样,都是放到web目录下。访问也和html页面一样。
http://ip:port/工程路径/b.jsp
3、jsp的本质是一个Servlet程序
二、jsp的三种语法
1、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页面,是否会创建HttpSession对象。默认是true
- extends属性 设置jsp翻译出来的Java类默认继承谁
2、jsp中常用脚本
1) 表达式脚本(常用)
- 格式:<%=表达式%>
- 表达式脚本的作用是:在jsp页面上输出数据
- 表达式脚本的特点:
- 所有的表达式脚本都会被翻译到_jspService方法中
- 表达式脚本都会被翻译成out.print()输出到页面上 (即:只要被<%%>包裹起来就会输出到页面)
- 由于表达式脚本翻译的内容都在_jspService方法中的对象都可以直接使用
- 表达式脚本中的表达式不能以分号结束
<%=12%> <br /> <%=12.12%> <br/> <%="我是字符创"%> <br/> <%=map%> <br/> <%=request.getParameter("username")%> <br/>
2)代码脚本
- 格式:<% Java语句 %>
- 作用:可以在jsp页面中,编写我们自己需要的功能(其实就是Java代码)
- 代码脚本的特点是:
- 代码脚本翻译之后都在_jspService方法中
- 可以由多个代码脚本快组合挖按成一个完整的Java语句
- 代码脚本由于翻译到_jspService()方法中,所以在_jspService方法中的对象都可以直接使用
- 代码脚本还可以和表达式一起组合使用,在jsp页面上输出数
<%--代码脚本for语句--%> <table border="1" cellspacing="0"> <% for(int i=0;i<3;i++){ %> <tr> <td>第<%=i+1%>行</td> </tr> <% } %> </table> <%--翻译后Java文件中_jspService方法内的代码都可以写--%> <% String name = request.getParameter("name"); System.out.println("用户请求的参数:"+name); %>
3、jsp九大内置对象
jsp中的内置对象,是指tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象,叫内置对象
如何找到jsp的源代码--->通过Tomcat启动后的日志查找路径
4、jsp四大域对象
四大域对象分别是:
- pageContext (PageContextImpl类), 当前jsp页面范围内有效
- request (HttpServletRequest类), 一次请求内有效
- session (HttpSession类), 一个会话范围内有效(打开浏览器访问服务器,知道关闭浏览器 这个过程叫会话)
- application (ServletContext类) 整个web工程范围内都有效(只要web工程不停止,数据都在)
域对象是可以像Map一样存取数据的对象。四个域对象功能一样。不同的是他们对数据的存取范围
虽然四个域对象都可以存取数据。在使用上他们是有优先顺序的
从小到大的范围顺序:
pageContext --> request ---> session ---> application
scpe.jsp页面代码
<%-- Created by IntelliJ IDEA. User: wufq Date: 2021/6/30 Time: 10:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Scope jsp页面</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>
scpe2.jsp页面代码
<%-- Created by IntelliJ IDEA. User: wufq Date: 2021/6/30 Time: 10:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Scope jsp页面</title> </head> <body> <h1>scope.jsp页面</h1> //取数据 pageContext域是否有值<%=pageContext.getAttribute("key")%><br> request域是否有值<%=request.getAttribute("key")%><br> session域是否有值<%=session.getAttribute("key")%><br> application域是否有值<%=application.getAttribute("key")%><br> </body> </html>
5、jsp中out输出和response.getWriter输出的区别
response中表示响应,我们经常用于设置返回给客户端的 内容(输出)
out也是给用户做输出使用的
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% out.write("out输出1<br>"); out.write("out输出2<br>"); response.getWriter().write("response输出1<br>"); response.getWriter().write("response输出1<br>"); %> </body> </html>
上面的代码,按照正常的代码运行逻辑是先输出out打印的内容,后输出response内容,但是实际的执行结果先输出response后输出out
导致这样结果的原因是?
由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下。我们在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序
out.write()输出字符串没有问题
out.print()输出任意数据都没有问题(都转换成字符串后调用的write输出)
在jsp页面中,可以统一使用out.print()来进行输出
6、jsp的常用标签
适用场景:一个网站一般分为三个部分,最上面一层的导航栏,中间一层是网页主体,最下面一层是联系方式等。网站会分为多层,每一层的底部都是一样的,为了防止多次修改,我们只需要引入一个公用的jsp即可
1)静态包含
<%@include file="/include/footer.jsp"%>
<%@include file""%>就是静态包含,file属性指定你要包含的jsp页面的路径(地址中的第一个斜杠 / 表示http://ip:port/工程路径/ 映射到代码的web目录)
2)动态包含
<jsp:include page="/scope2.jsp"> <jsp:param name="username" value="root"/> <jsp:param name="password" value="root"/> </jsp:include>
foolter.jsp文件的代码
<%= request.getParameter("username")%>
<jsp:include page=""> </jsp:include> 是动态包含
动态包含和静态包含一样,把被包含的内容执行输出到包含位置
3)jsp标签-转发
<jsp:forward page="/scope2.jsp"></jsp:forward>
请求转发标签,功能是请求转发
#案例:遍历输出多个学生信息到表格中
students类
public class Stuents { private Integer id; private String name; private Integer age; private String phone;
stuServlet类
package com.wufq.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @Description * @Author wufq * @Version * @Date 2021/6/30 14:22 */ public class StuServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Object> stuList = new ArrayList<>(); for(int i = 0; i <10; i++){ int t = i+1; stuList.add(new Stuents(t,"name"+t,18+t,"phone"+t)); } // 保存查询到的学生信息到request域中 req.setAttribute("stuList",stuList); // 请求转发到test1.jsp页面 req.getRequestDispatcher("/stu/test1.jsp").forward(req, resp); } }
这里需要注意一点:编写servlet程序以后,一定要在web.xml文件内配置即:如上图的流程,客户端通过servlet程序访问,然后才能访问jsp文件。如果直接访问jsp文件 就会报空指针异常
test1.jsp文件
<%@ page import="java.util.List" %> <%@ page import="com.wufq.servlet.Stuents" %><%-- Created by IntelliJ IDEA. User: wufq Date: 2021/6/30 Time: 14:14 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 black solid; 600px; border-collapse: collapse; } tr,td{ border: 1px black solid; } </style> </head> <body> <% List<Stuents> stuentsList = (List<Stuents>)request.getAttribute("stuList"); %> <table> <tr> <td>编号</td> <td>姓名</td> <td>年龄</td> <td>电话</td> <td>操作</td> </tr> <%for(Stuents stu:stuentsList){%> <tr> <td><%=stu.getId()%></td> <td><%=stu.getName()%></td> <td><%=stu.getAge()%></td> <td><%=stu.getPhone()%></td> <td>删除、修改</td> </tr> <%}%> </table> </body> </html>
访问:
http://localhost:8080/08_jsp/stuServlet
结果:
7、Listener监听器
7.1 ServletContextListener监听器
ServletContextListener它可以监听ServletContext对象的创建和销毁
ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁
监听到创建和销毁之后斗湖分别调用ServletContextListener监听器的方法反馈
两个方法分别是:
web.xml中配置