文章目录
什么是 jsp, 它有什么用?
- jsp 的全换是 java server pages。 Java 的服务器页面
- jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。
- 因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。 开发成本和维护成本都极高。
jsp 的本质是什么。
jsp的本质是一个servlet程序
当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,并且对它进行编译成为.class字节码程序,
跟踪原代码发现, HttpjspBase 类。 z直接继承了HttpServlet类,也即是说,jsp 翻译出来的 java 类, 它间接了继承了 HttpServlet 类。 也就是说, 翻译出来的是一个 Servlet 程序
总结: 通过翻译的 java 源代码我们就可以得到结果: jsp 就是 Servlet 程序
去观察翻译出来的 Servlet 程序的源代码, 不难发现。 其底层实现, 也是通过输出流。 把 html 页面数据回传给客户端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmlXWcKA-1613905972909)(tu/04-1.png)]
jsp 头部的 page 指令
表达式脚本(常用)
表达式脚本的格式是: <%=表达式%>
表达式脚本的作用是: 的 jsp 页面上输出数据。
表达式脚本的特点:
1、 所有的表达式脚本都会被翻译到_jspService() 方法中
2、 表达式脚本都会被翻译成为 out.print()输出到页面上
3、 由于表达式脚本翻译的内容都在_jspService() 方法中,所以_jspService()方法中的对象都可以直接使用。
4、 表达式脚本中的表达式不能以分号结束。
代码脚本
脚本代码的特点:
- 翻译之后都在_jspService 方法中
- 翻译到_jspService()方法中, 所以在_jspService() 方法中的现有对象都可以直接使用
- 还可以由多个代码脚本组合完成一个完整的java语句
- 代码脚本还可以和表达式脚本一起组合使用,子啊jsp页面上输出数据
jsp 九大内置对象
jsp中的内置对象,是指Tomcat在翻译jsp页面成为Servlet 源代码后,内部提供的九大内置对象,叫内置对象。
request | 封装客户端的请求,其中包含来自GET或POST请求的参数; | 1 |
response | 封装服务器对客户端的响应 | 2 |
pageContext | 通过该对象可以获取其他对象 | 3 |
session | 封装用户会话的对象 | 4 |
application | 封装服务器运行环境的对象 | 5 |
out | 输出服务器响应的输出流对象; | 6 |
config | Web应用的配置对象; | 7 |
page | JSP页面本身(相当于Java程序中的this); | 8 |
exception | 封装页面抛出异常的对象。 | 9 |
jsp 四大域对象
1 | pageContext | (PageContextImpl 类) | 当前 jsp 页面范围内有效 |
2 | request | (HttpServletRequest 类) | 一次请求内有效….一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。 |
3 | session | (HttpSession 类) | 一个会话范围内有效(打开浏览器访问服务器, 直到关闭浏览器) |
4 | application | (ServletContext 类) | 整个 web 工程范围内都有效(只要 web 工程不停止, 数据都在) |
域对象是可以像 Map 一样存取数据的对象。 四个域对象功能一样。 不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据。 在使用上它们是有优先顺序的。
由小到大
pageContext == request ==session >>> application
jsp 中的 out 输出和 response.getWriter 输出的区别
response中表示响应:设置返回给客户端的内容(输出)
out 也是给用户做输出使用的。
总结:
当前jsp页面中所有代码执行完成后会
- 执行out.flush()操作:会把out缓冲区的数据追加写入到response缓冲区
- 会执行response的刷新操作,把全部数据写给客户端
由于 jsp 翻译之后, 底层源代码都是使用 out 来进行输出, 所以一般情况下。 我们在 jsp 页面中统一使用 out 来进行输出。 避免打乱页面输出内容的顺序
out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)
jsp 的常用标签
jsp 的常用标签
JSP静态包含
jsp 动态包含
动态包含的特点:
- 1、 动态包含会把包含的 jsp 页面也翻译成为 java 代码
- 2、 动态包含底层代码使用如下代码去调用被包含的 jsp 页面执行输出。
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
- 3、 动态包含, 还可以传递参数
动态包含的底层原理
jsp 标签-转发
JSP和Servlet是什么关系?
Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容,jsp的本质是Servlet的一种简易形式,JSP会被服务器处理成为一个类似Servlet的Java程序.可以简化页面内容的生成,
Servlet和JSP最主要的不同点在于
- servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML分离开来,而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
- Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
如何实现JSP或Servlet的单线程模式?
对于JSP页面,可以通过page指令进行设置。
对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
SingleThreadModel
如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做