一、JSP组成结构二、JSP的原理1.JSP的运行原理2.分析JSP所生成的Servlet代码3.JSP的执行过程三、JSP生命周期四、JSP九大内置对象五、JSP四大作
一、JSP组成结构 二、JSP的原理 1.JSP的运行原理 2.分析JSP所生成的Servlet代码 3.JSP的执行过程 三、JSP生命周期 四、JSP九大内置对象 五、JSP四大作用域 1.request:作用在请求阶段 2.page:作用在某个页面 3.session:作用在整个会话 4.application:作用在整个应用程序 六、MVC模式 jsp全称Java Server Page, 一种动态网页开发技术。它允许使用el表达式、jstl来获取Java代码中的数据,同时允许在jsp中编写html代码,使得jsp可以非常容易的显示页面。Jsp本质是Servlet,最终以Servlet方式运行,所以可以说Jsp是一种特殊的Servlet 。
静态内容 : HTML静态文本
注释 : ①
②<%-- JSP注释 --%>
③<% //Java注释 %>
表达式 &#xff1a; <%&#61;Math.PI %>
表达式的结果会直接被输出到页面中。要注意表达式的后面不能有;号
代码段Scriptlet &#xff1a; <% Java代码 %>
声明 &#xff1a; <%! int a &#61; 0; %>
JSP用来定义页面级变量&#xff0c;以保存信息或定义JSP页面的其余部分可能需要的方法。
指令 &#xff1a; 用于将有关的页面的特殊处理信息传送到JSP容器。常见的JSP指令分为三种。
①<%&#64; page ... %>
page指令&#xff1a;用来导入指定类、编码等
缺省情况下JSP默认自动导入以下四个包中的所有类&#xff1a;java.lang、javax.servlet、javax.servlet.http、javax.serlvet.jsp
属性 值 缺省值 import 类名或包名 无 language 脚本语言名称 “java” contentType MIME类型和字符集 “text/html” extends 类名 无 info 文本字符串 无 session 布尔值 “true” buffer 缓冲器大小&#xff0c;或none “8kb” autoFlush 布尔值 “true” isThreadSafe 布尔值 “true” errorPage 本地URL 无 isErrorPage 布尔值 “false”
错误页面的配置除了通过page指令中的errorPage跟isErrorPage来配置外&#xff0c;还可以通过web.xml中来配置全局的错误页面。可以通过错误代码跟错误类型来配置。 通过错误代码配置错误页面:
< error-page> < error-code> 500 error-code> < location> /error.jsp location> error-page>
通过错误类型来配置错误页面:
< error-page> < exception-type> java.lang.NullException exception-type> < location> /error.jsp location> error-page>
②<%&#64; include file&#61;"URL" %>
include指令&#xff1a;用来在jsp文件转换成Servlet时引入其他文件 ③<%&#64; taglib ... %>
taglib指令&#xff1a;用来定义标签
动作 &#xff1a; JSP中定义了若干个标准动作&#xff0c;可以在页面中使用JavaBean组件和有条件的把页面的控制权移到其他页面。
①jsp:useBean&#xff1a;寻找或者实例化一个JavaBean
< jsp: useBean id&#61; "sevenbean" class &#61; "com.blb.MyBean" scope&#61; "request" / >
id表示JavaBean的标识&#xff0c;代表了一个JavaBean实例对象 class属性值表示JavaBean实例的类的名字&#xff0c;大小写要完全一致 scope属性值表示指定JavaBean实例的作用域。取值是page&#xff08;默认&#xff09;、request、session、application 整体表示在request范围中获取名称为“sevenbean”的对象&#xff0c;如果能获取到则直接使用&#xff0c;如果获取的是null则新创建一个MyBean对象。 ②jsp:setProperty&#xff1a;设置JavaBean的属性
< jsp: setProperty property&#61; "age" name&#61; "sevenbean" value&#61; "18" / >
表示给sevenbean这个实例对象的age属性赋值18。
< jsp: setProperty property&#61; "age" name&#61; "sevenbean" param&#61; "ageParam" / >
表示给sevenbean这个实例对象的age属性赋值&#xff0c;值通过请求参数request.getParameter(“ageParam” ) 获取到。
< jsp: setProperty property&#61; "*" name&#61; "sevenbean" / >
表示给sevenbean这个实例对象的所有属性进行赋值&#xff0c;值通过请求参数中获取&#xff0c;所以要求请求参数中的参数名称跟bean的属性名必须一样才能自动映射上。
注意&#xff1a;标签不能单独使用&#xff0c;必须在之前使用 标签。
③jsp:getProperty&#xff1a;输出某个JavaBean的属性
< jsp: getProperty name&#61; "sevenbean" property&#61; "name" / >
表示获取sevenbean对象的name属性值并输出&#xff0c;会依次从pageConext、request、session、application范围中寻找。
注意&#xff1a; 标签不能单独使用&#xff0c;必须在之前使用 标签。
④jsp:include&#xff1a;在页面被请求的时候引入一个文件
< jsp: include page&#61; "URL" flush&#61; "true" / >
page属性包含的是一个相对的URL&#xff0c;可以是HTML页面、JSP页面或者是Servlet的url-pattern。flush属性作用是在包含页面前清空在缓冲区中的数据&#xff0c;默认值是true。可以在标签内通过 标签来传递参数。
⑤jsp:forward&#xff1a;把请求转到一个新的页面
< jsp: forward page&#61; "new URL" >
forward动作用于将控制权从JSP页面传递给本地服务器的另一个位置。丢弃当前页面生成的任何内容&#xff0c;并在替换位置上重新处理请求。forward标签只有一个page属性。page属性包含的是一个相对URL &#xff0c;可以是HTML页面、JSP页面或者是Servlet的url-pattern。
page的值既可以直接给出&#xff0c;也可以在请求的时候动态计算&#xff0c;通过表达式来实现&#xff0c;如&#xff1a;
< jsp: forward page&#61; &#39;<%&#61;"new"&#43;newNo&#43;".html"%>&#39; >
此标签在传递页面的控制权到另外的页面的时候&#xff0c;可以把相应的参数值传递到目的页面。如果需要传递参数&#xff0c;使用标签&#xff0c;注意这时必须要使用对标签。把标签包含在里面。
< jsp: forward page&#61; "a_02.jsp" > < jsp: param value&#61; "zhangsan" name&#61; "name" / > < jsp: param value&#61; "123" name&#61; "pwd" / > < / jsp: forward>
静态包含&#xff08;指令&#xff09;跟动态包含&#xff08;动作&#xff09;的区别&#xff1a; 静态包含 动态包含 原理 先合并再翻译 先翻译再包含 最终编译成java文件的数目 一个 多个 多个文件中能否有相同变量 不允许 允许 语法 <%&#64;inclue file&#61;“被包含的页面”%> 参数传递 不能向被包含页面传递参数 可以使用jsp:param标签向被包含页面传递参数
二、JSP的原理 1.JSP的运行原理 WEB容器&#xff08;Servlet引擎&#xff09;接收到以.jsp为扩展名的URL的访问请求时&#xff0c;它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序&#xff0c;它负责解释和执行JSP页面。
每个JSP 页面在第一次被访问时&#xff0c;JSP引擎将它翻译成一个Servlet源程序&#xff0c;接着再把这个Servlet源程序编译成Servlet的class类文件&#xff0c;然后再由WEB容器&#xff08;Servlet引擎&#xff09;像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“\work\Catalina<主机名><应用程序名>\”目录中。 其他版本Tomcat的JSP页面翻译成的Servlet的包名为org.apache.jsp. 。
JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言&#xff0c;JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写&#xff0c;但是&#xff0c;JSP页面最终必须转换成Java Servlet程序。
可以在WEB应用程序正式发布之前&#xff0c;将其中的所有JSP页面预先编译成Servlet程序&#xff0c;可以加快页面加载速度。事实上&#xff0c;很多公司在将项目给客户演示前都会把页面先访问一遍&#xff0c;使JSP事先编译成Servlet。
2.分析JSP所生成的Servlet代码 JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类&#xff0c;HttpJspBase类是HttpServlet的一个子类&#xff0c;因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法&#xff0c;因此&#xff0c;HttpJspBase类是抽象的。
SUN公司为JSP的WEB容器开发商和JSP页面开发人员提供了一套专门应用于开发JSP程序的Java类&#xff0c;这套Java类被称为JSP API。HttpJspPage接口和JspPage接口属于JSP API&#xff0c;在HttpJspPage接口中只定义了一个_jspService方法&#xff0c;但它继承了JspPage接口&#xff0c;JspPage接口中定义了两个方法&#xff1a;jspInit()和jspDestroy()。 HttpJspBase的init方法调用了jspInit和_jspInit方法&#xff0c;destroy方法内部调用了jspDestroy和_jspDestroy方法&#xff0c;service方法内部调用了_jspService方法。在HttpJspBase中实现的init、service和destroy方法都被声明成了final类型。
JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句&#xff0c;JSP脚本片断&#xff08;位于<%%>内的一段java代码&#xff09;中的java代码被原封不动地搬移进了_jspService方法中的相应位置处&#xff0c;JSP表达式&#xff08;位于<%&#61;和%>之中的内容&#xff09;则是被转换成以其中的变量或表达式作为参数的out.print语句。
3.JSP的执行过程 JSP的执行过程主要可以分为以下几点&#xff1a;
客户端发出请求。 Web容器将JSP转译成Servlet源代码。 Web容器将产生的源代码进行编译。 Web容器加载编译后的代码并执行。 把执行结果响应至客户端。 三、JSP生命周期 jsp本质是一个Servlet&#xff0c;它比Servlet的生命周期多了一个编译阶段。
翻译阶段 编译阶段 实例化阶段 初始化阶段 执行阶段 销毁阶段 回收阶段 四、JSP九大内置对象 内置对象 说明 request HttpServletRequest对象&#xff0c;代表请求 response HttpServletResponse对象&#xff0c;代表响应 out JspWriter对象&#xff0c;代表输出 session HttpSession对象&#xff0c;代表每个会话 application ServletContext应用对象&#xff0c;代表整个应用程序 config ServletConfig配置对象&#xff0c;代表配置文件中的信息 pageContext PageContext对象页面上下文对象&#xff0c;包含页面信息 page 当前页面对象&#xff08;this&#xff09;&#xff08;基本不使用&#xff09; exception Throwable异常对象&#xff0c;包含jsp异常信息
五、JSP四大作用域 1.request&#xff1a;作用在请求阶段 设置参数&#xff1a;request.setAttribute("key","value");
获取参数&#xff1a;request.getAttribute("key");
2.page&#xff1a;作用在某个页面 设置参数&#xff1a;pageContext.setAttribute("key","value");
获取参数&#xff1a;pageContext.getAttribute("key");
3.session&#xff1a;作用在整个会话 Servlet中设置参数&#xff1a;request.getSession().setAttribute("key","value");
jsp中设置参数&#xff1a;session.setAttribute("key","value");
获取参数&#xff1a;session.getAttribute("key");
4.application&#xff1a;作用在整个应用程序 Servlet设置参数&#xff1a;request.getServletContext().setAttribute("key","value");
jsp设置参数&#xff1a;application.setAttribute("key","value");
获取参数&#xff1a;application.getAttribute("key");
六、MVC模式 MVC不是一种技术&#xff0c;而是一种思想&#xff0c;一种架构模式&#xff0c;它主要用来将页面、数据、逻辑代码进行分离&#xff0c;更是责任分工的一种体现。 M&#xff1a;Model &#xff08;模型&#xff09; JavaBean V&#xff1a;View &#xff08;视图&#xff09; 显示jsp C&#xff1a;Controller &#xff08;控制器&#xff09; Servlet