JSP
1、JSP简介
jsp全称Java Server Page, 一种动态网页开发技术。它允许使用el表达式、jstl来获取Java代码中的数据,同时允许在jsp中编写html代码,使得jsp可以非常容易的显示页面。Jsp本质是Servlet,最终以Servlet方式运行,所以可以说Jsp是一种特殊的Servlet。
2、JSP组成结构
2.1、静态内容
html静态文本
2.2、注释
第1种: <!-- HTML注释 -->
第2种: <%-- JSP注释 --%>
第3种: <% //java注释 %>
2.3、表达式
表达式的结果会直接被输出到页面中。要注意表达式的后面不能有;号
<%=Math.PI %>
2.4、代码段Scriptlet
<% java代码 %>
2.5、声明
JSP用来定义页面级变量,以保存信息或定义JSP页面的其余部分可能需要的方法。
<%! int a = 0; %>
2.6、指令
用于将有关的页面的特殊处理信息传送到JSP容器。常见的JSP指令分为三种:
- page指令用来导入指定类、编码等等。缺省情况下JSP默认自动导入以下四个包中的所有类:java.lang、javax.servlet、javax.servlet.http、javax.serlvet.jsp
<%@ page ... %>
属性 | 值 | 缺省值 |
---|---|---|
import | 类名或包名 | 无 |
language | 脚本语言名称 | “java” |
contentType | MIME类型和字符集 | “text/html” |
extends | 类名 | 无 |
info | 文本字符串 | 无 |
session | 布尔值 | “true” |
buffer | 缓冲器大小,或none | “8kb” |
autoFlush | 布尔值 | “true” |
isThreadSafe | 布尔值 | “true” |
errorPage | 本地URL | 无 |
isErrorPage | 布尔值 | “false” |
错误页面的配置除了通过page指令中的errorPage跟isErrorPage来配置外,还可以通过web.xml中来配置全局的错误页面。可以通过错误代码跟错误类型来配置。
- 通过错误码来配置error-page
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
-
通过异常的类型配置error-page
<error-page> <exception-type>java.lang.NullException</exception-type> <location>/error.jsp</location> </error-page>
- include指令用来在JSP文件转换成Servlet时引入其他文件。
<%@ include file="URL" %>
- taglib指令是为了定义标签。
<%@ taglib ... %>
2.7、动作
JSP中定义了若干个标准动作,可以在页面中使用JavaBean组件和有条件的把页面的控制权移到其他页面。
- jsp:useBean:寻找或者实例化一个JavaBean
声明一个JavaBean:
<jsp:useBean id=“sevenbean” class=“com.seven.MyBean” scope=“request” />
id表示JavaBean的标识,代表了一个JavaBean实例对象
class属性值表示JavaBean实例的类的名字,大小写要完全一致
scope属性值表示指定JavaBean实例的作用域。取值是page(默认)、request、session、application
整体表示在request范围中获取名称为“sevenbean”的对象,如果能获取到则直接使用,如果获取的是null则新创建一个MyBean对象。
- jsp:setProperty:设置JavaBean的属性
<jsp:setProperty property=“age” name=“sevenbean” value=“18” />
表示给sevenbean这个实例对象的age属性赋值18
<jsp:setProperty property=“age” name=“sevenbean” param=“ageParam” />
表示给sevenbean这个实例对象的age属性赋值,值通过请求参数request.getParameter(“ageParam” ) 获取到。
<jsp:setProperty property="*" name=“sevenbean” />
表示给sevenbean这个实例对象的所有属性进行赋值,值通过请求参数中获取,所以要求请求参数中的参数名称跟bean的属性名必须一样才能自动映射上。
注意:jsp:setProperty标签不能单独使用,必须在之前使用<jsp:useBean />标签。
-
jsp:getProperty:输出某个JavaBean的属性
<jsp:getProperty name=“sevenbean” property=“name” />
表示获取sevenbean对象的name属性值并输出,会依次从pageConext、request、session、application范围中寻找。
注意:jsp:getProperty 标签不能单独使用,必须在之前使用<jsp:useBean />标签。
jsp:include:在页面被请求的时候引入一个文件
<jsp:include page=“URL” flush=“true” />
page属性包含的是一个相对的URL,可以是HTML页面、JSP页面或者是Servlet的url-pattern。flush属性作用是在包含页面前清空在缓冲区中的数据,默认值是true。可以在标签内通过 <jsp:param > 标签来传递参数。
jsp:forward:把请求转到一个新的页面
<jsp:forward page=“new URL”>
forward动作用于将控制权从JSP页面传递给本地服务器的另一个位置。丢弃当前页面生成的任何内容,并在替换位置上重新处理请求。forward标签只有一个page属性。page属性包含的是一个相对URL ,可以是HTML页面、JSP页面或者是Servlet的url-pattern。page的值既可以直接给出,也可以在请求的时候动态计算,通过表达式来实现,如:
<jsp:forward page=’<%=“new”+newNo+".html"%>’ >
此标签在传递页面的控制权到另外的页面的时候,可以把相应的参数值传递到目的页面。如果需要传递参数,使用<jsp:param >标签,注意这时必须要使用对标签。把<jsp:param >标签包含在里面。
<jsp:forward page="a_02.jsp">
<jsp:param value="zhangsan" name="name"/>
<jsp:param value="123" name="pwd"/>
</jsp:forward>
问题:静态包含(指令)跟动态包含(动作)有什么区别?
- 原理不同:
静态包含:先合并再翻译
动态包含:先翻译在包含
-
最终编译成java文件的数目不同。
静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。
-
静态包含在两个文件中不能有相同的变量,动态包含允许
-
语法不同:
静态包含语法: <%@include file=“被包含的页面”%>
动态包含语法: <jsp:include page=“被包含的页面”>
-
参数传递不同 :
静态包含不能向被包含页面传递参数
动态包含可以使用jsp:param标签向被包含页面传递参数
3、JSP使用
查看Jsp生成的文件
4、JSP生命周期
jsp本质是一个Servlet,它比Servlet的生命周期多了一个编译阶段。
翻译阶段
编译阶段
实例化阶段
初始化阶段
执行阶段
销毁阶段
回收阶段
5、Jsp九大隐式对象(内置对象)
- request:HttpServletRequest对象,代表请求
- response:HttpServletResponse对象,代表响应
- out:JspWriter对象,代表输出
- session:HttpSession对象,代表每个会话
- application:ServletContext应用对象,代表整个应用程序
- config:ServletConfig配置对象,代表配置文件中的信息
- pageContext:PageContext对象页面上下文对象,包含页面信息
- page:当前页面对象(this)(基本不使用)
- exception:Throwable异常对象,包含jsp异常信息
问题:JSP的内置对象有哪些?
6、JSP四大作用域
request:作用在请求阶段
设置参数
request.setAttribute("key", "value");
获取参数
request.getAttribute("key");
page:作用在某个页面
设置参数
pageContext.setAttribute("key", "value");
获取参数
pageContext.getAttribute("key");
session:作用在整个会话
servlet中设置参数
request.getSession().setAttribute("key", "value");
jsp中设置参数
session.setAttribute("key", "value");
获取参数
session.getAttribute("key");
application:作用在整个应用程序
Servlet设置参数
request.getServletContext().setAttribute("key", "value");
jsp设置参数
application.setAttribute("key", "value");
获取参数
application.getAttribute("key");
7、MVC模式
MVC不是一种技术,而是一种思想,一种架构模式,它主要用来将页面、数据、逻辑代码进行分离,更是责任分工的一种体现。
M:Model(模型)
V:View(视图)
C:Controller(控制器)
M:JavaBean
V:显示jsp
C:servlet