通过Servlet进行整个网站的开发是可以的。 不过在Servlet中输出html代码,特别是稍微复杂一点的html代码,就会给人一种很酸爽的感觉。
如果能够直接使用Html代码,然后在html中写java代码,就好了~
JSP … 就可以干这个事情。
工作原理
当第一次访问jsp页面时,会向一个servlet容器(tomcat等)发出请求,servlet容器先要把 jsp页面转化为servlet代码(.java),再编译成.class 文件 再进行调用。当再次访问jsp页面时 跳过翻译和编译的过程 直接调用
接着来看源码
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent{
.......
}
而这的org.apache.jasper.runtime.HttpJspBase继承的正是HttpServlet类,诶!是不是哪见过,所以可以说jsp就是一个Servlet类。既然是本质是servlet,那就好理解多了。
和servlet一样,jsp也有生命周期
1.转换:web容器将Jsp文件转换成一个包含了Servlet类定义的java源文件。
2.编译:把在转换阶段创建的java源文件编译成.class类文件。
3.之后四步和Servlet生命周期相同
页面组成
jsp由这些页面元素组成:
- 静态内容
就是html,css,javascript等内容
- 指令
以<%@开始 %> 结尾,比如<%@page import=“java.util.*”%>
表达式 <%=%>
用于输出一段html
- Scriptlet
在<%%> 之间,可以写任何java 代码
- 动作
<jsp:include page=“Filename” > 在jsp页面中包含另一个页面。在包含的章节有详细的讲解
- 注释
<%-- – %>
不同于 html的注释
通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了
例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%="hello jsp"%>
<br>
<% out.println("hello jsp");%>
这段内容 就是输出了hello jsp这么一句话(有=号的时候不加分号,没有的时候要加)
include
jsp有Include指令和include动作,
include动作,也就是所谓动态包含,代码格式为<jsp:include page="文件路径" flush="true"/>
include指令,也就是静态包含,代码格式为<%@ include file="被包含的文件地址"%>
介绍一下两者区别:
- 静态包含在转换成为java文件的时候将要包含的文件包含进来,作为一个整体编译。动态包含是各个包含文件分别转换,分别编译。
- 静态包含在两个文件中不能有相同的变量,动态包含允许
- 静态包含只能包含文件,动态包含还可以包含servlet输出的结果
- 静态包含不能使用变量作为文件名,动态包含可以使用变量作为文件名
- 动态包含文件发生变化,包含文件会感知变化。(JSP引擎会及时发现并重新编译,而静态包含如果插入的文件发生了变化,包含这个文件的jsp文件需要被重新编译,在我理解就是自动和手动的区别)
部分参考与https://www.cnblogs.com/wxgblogs/p/5602689.html
可以辅助理解。
四大作用域
pageContext 当前页面,通过pageContext.setAttribute(key,value)的数据,只能在当前页面访问,在其他页面就不能访问了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%**加粗样式**
pageContext.setAttribute("name","vince");
%>
<%=pageContext.getAttribute("name")%>
此时会输出vince。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=pageContext.getAttribute("name")%>
此时啥也没有,会输出null
requestContext
一次请求 只有一次请求中保存,服务器跳转依然有效
sessionContext
当前会话 在一次会话中,就是同一个浏览器不管开什么页面都可以使用,但新开的就不行了
applicationContext
全局,所有用户共享 在整个服务器都可以使用,全局共享。
九大内置对象
request HttpServletRequest 接口的实例
response HttpServletResponse 接口的实例
out JspWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page 类似于Java类中的this关键字
Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象
所谓内置对象,就是可以在<% %>中直接使用的对象
参考https://www.runoob.com/jsp/jsp-implicit-objects.html