一、jsp解决了一个什么样的问题
1、servlet回传数据实例
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("<!DOCTYPE html>\n\t");
writer.write("<html lang=\"en\">\n\t");
writer.write("<head>\n\t");
writer.write(" <meta charset=\"UTF-8\">\n\t");
writer.write(" <title>hello</title>\n\t");
writer.write("</head>\n\t");
writer.write("<body>\n\t");
writer.write(" 些许郑希\n\t");
writer.write("</body>\n\t");
writer.write("</html>\n\t");
}
- 显而易见:这样很麻烦
2、用jsp回传数据
<%--
Created by IntelliJ IDEA.
User: 86186
Date: 2021/3/6
Time: 11:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
些许郑希
</body>
</html>
- jsp需要url为http://localhost:8080/jsp01/hello.jsp
- jsp文件放置在webapp目录下
二、JSP的本质
- 在运行tomcat之后(这是还不会编译),我们访问到这个jsp时tomcat就会编译这个jsp成servlet程序
- 在这个地方找编译好的文件在哪
三、JSP三大语法
1、头部page指令
-
jsp的头部page指令主要修改jsp页面中一些重要的属性,或者行为
-
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
属性:
- language属性:jsp翻译之后的是什么语言文件,暂时只支持java。
- contentType属性:表示放回的数据类型是什么,对应代码时response.getContentType()参数
- pageEncoding属性:当前jsp页面本身字符集
- import属性:用于导包
- autoFlush属性:out输出流,缓冲区满了就刷新,默认为true。
- buffer属性:设置缓冲区大小,默认为8kb
- errorPage属性:设置出错时的跳转界面
- errorPage表示识别错误之后自动跳转界面中url的“/”表示http://ip:port/工程路径
- isErrorPage属性:设置当前jsp页面是否为错误界面,默认为false,true时可以获取异常信息
- session属性:设置访问jsp页面,是否创建HttpSession对象,默认为true
- extends属性:设置jsp对应的servlet程序默认继承类
2、三大脚本
i、声明脚本
-
格式:
<%! 声明式 %>
-
作用:可以给jsp翻译出来的java类定义属性、方法,静态代码块,内部类
-
内部代码
- 声明类属性
- 声明static静态代码块
- 声明类方法
- 声明内部类
-
ii、表达式脚本
-
格式:
<%= 表达式 %>
-
作用:在jsp页面上输出数据
-
内部代码:
- 输出整数
- 输出浮点数
- 输出字符串
- 输出对象
-
-
示例代码在翻译生成的Servlet程序中是如何实现的?
-
注意点:
-
使用对象:
-
<%= request.getParameter("username")%>
-
-
输出:zz
-
_jspService方法专门用来响应页面
-
iii、代码脚本
-
格式:
<% java语句 %>
-
作用:
- 可以在jsp页面中,编写我们自己需要的功能(java语句)
-
内部代码
- if语句
- for语句
3、三种注释
四、jsp九大内置对象
-
- request:请求对象(一次请求才有用,可以跳转时传给下一个页面)
- response:响应对象
-
- pageContext:jsp的上下文对象(仅这个jsp页面
-
- session:会话对象(一次会话:浏览器打开到关闭)
-
- application:ServletContext类的对象(web服务器打开到停止,数据都在)
- config:ServletConfig类的对象
- out:jsp输出流对象
- page:指向当前jsp对象
- exception:异常对象(iserrorpage属性为true时)
五、四大域对象
- 优先顺序
- pageContext ==>> request ==>> session ==>> application
- 尽量使用小的可以让数据内存得到最快的释放
六、out输出和response.getwriter()
-
两个都是内置的输出流他们一起用会出现问题
-
实例:
-
<% out.write("out输出1 <br/>"); out.print("out输出2 <br/>"); response.getWriter().println("response输出1 <br/>"); response.getWriter().println("response输出2 <br/>"); %>
-
按理应该先输出out,后输出response
-
结果:
-
可以看处先出现了response打印
-
-
先了解原理:
-
我们测试一下
-
<% out.write("out输出1 <br/>"); out.flush(); out.print("out输出2 <br/>"); response.getWriter().println("response输出1 <br/>"); response.getWriter().println("response输出2 <br/>"); %>
-
这里我们提前把第一个out输出缓冲区放到了response(甚至比下面的response语句还要先进入response缓冲区),这时会出现啥情况?
-
结果:
-
-
由于jsp底层使用out输出,所以我们也最好使用out输出,避免输出内容打乱
-
另外
- out.write(参数)
- 参数会被转换成对应的ASCLL码(故若不是字符就会对应不知道的字符)是一个字符流,最好不要用其他的参数
- out.prite(参数)
- 参数会被转换成字符串,然后又传给write方法
- out.write(参数)
七、常用标签
1、静态包含
- 即一个jsp页面中调用另外一个jsp页面作为一部分
- 格式:<%@include file="/include/footer.jsp"%>
- 特点:
- file属性指定你要包含的jsp页面的路径
- 第一个斜杆“/”表示http://ip:port/工程路径,映射到代码的web目录
- 被包含的jsp页面不会被翻译,而是直接被拷贝到主要jsp页面中的源码中,主要jsp页面再被翻译
2、动态包含
-
格式:<jsp:include page="/include/footer.jsp"></jsp:include>
-
与静态包含主要区别:
- 被包含的jsp也同样会被翻译
- 在本来放置被包含jsp页面里的被拷贝代码处变成了一行代码:
-
两个jsp的关系:
-
主要jsp会把req、resp、out对象传给被包含jsp,所以他们的缓冲区也几乎一致
-
main.jsp也可以把参数传给footer.jsp
<jsp:include page="/include/footer.jsp"> <jsp:param name="username" value="bbj"/> <jsp:param name="password" value="123456"/> </jsp:include> //footer.jsp界面获取参数数据 <%request.getParameter("username");%>
-
3、转发
- 格式:<jsp:forward page=“footer.jsp”></jsp:forward>
八、练习题
1、九九乘法表
<%="<br/>九九乘法表<br/>"%>
<%
for (int a=1;a<=9;a++){
for (int b =1;b<=a;b++){
out.print(a+"*"+b+"="+a*b+" ");
}
out.print("<br/>");
}
%>
2、跳转的使用
暂时不需要
九、Listerner监听器
-
ServletContextListener监听器监听servletcontext对象
-
ServletCOntextListener监听器的两个方法
- contextInitialized(ServletContextEvent sce)
- contextDestroyed(ServletContextEvent sce)
-
使用步骤:
-
编写一个类
-
实现其两个方法
public class MyServletContextListener 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>com.wang.jsp.MyServletContextListener</listener-class> </listener> @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("servletContext对象销毁了"); } }
-
到web.xml文件中配置监听器
<!-- 配置监听器--> <listener> <listener-class>com.wang.jsp.MyServletContextListener</listener-class> </listener>
-