7.JSP技术
JSP和Servlet一样,都是用于开发动态web资源的技术
JSP的两个特性:1.写JSP代码就像是在写HTML代码,但JSP技术允许在页面中编写java代码(理解为一种特殊的HTML)
2.JSP中可以使用 request response等web开发常用对象,实现与浏览器的交互 (JSP也可以理解为Servlet)
通过查看JSP的源文件(服务器中的work目录下,就是一个java文件),可以清楚的知道,在JSP中,可以用到哪些web开发常用对象
工作原理:访问jsp,服务器是如何调用这个jsp的?(将JSP翻译成servlet,其实就是调用这个servlet(响应请求) /*即浏览器访问任何资源,都是通过servlet来实现*/
页面内容通过 out.write() (这里的out相当于Servlet中的PrintWriter)(除了这个,还有很多对象可以类似Servlet去使用) 写给浏览器
注:JSP最佳实践:servlet只负责响应请求产生数据 ,把数据通过 /*转发*/技术带给(一般通过request)jsp 数据的显示jsp来做
/*JSP语法*/
1.JSP模板元素 JSP页面中的HTML内容
2.JSP脚本表达式 <%= 变量或表达式 %>
3.JSP脚本片段 <% 多行java代码 %> 多个脚本片段可以相互访问 (如下面的脚本片段,访问上面的脚本片段的某个变量) (两个片段之间也可以嵌入其他元素)
4.JSP声明 <%! 多行java代码 %> 使用JSP声明, 将这多行java代码翻译到 _jspService方法的外面
5.JSP注释 <%-- 内容 --%> <!-- --> (HTML注释) 两者区别:JSP注释了的内容在浏览器的源文件中也不会出现,而HTML注释则是会原封不动的出现,
只不过浏览器能够识别,不显示到网页上 (这样会有很多数据垃圾,产生多余的网络流量),另外java代码的注释,必须使用JSP注释,因为服务器不认得HTML注释
6.JSP指令 <%@ 指令 属性名="值" %> (不产生任何可见的输出,只是告诉JSP引擎(理解为tomcat)如何输出JSP页面中的其余部分) page指令 include指令 taglib指令
7.JSP标签
8.JSP内置对象
9.如何查找JSP页面中的错误
/*page指令*/
<%@ page import="java.util.*" %>
1.language (指定嵌入的语言(脚本))
2.extends(继承哪个类,一般不修改)
3.import (会自动导入一些包)
4.session (true false) (设置false(需要自己手动获取session对象) ,默认为true,会在jsp中翻译的servlet文件中创建session对象,可以直接使用)
5.buffer (none 8KB sizekb) 设置缓冲 默认为8KB (一般不改)
6.autoFlush (true false) 默认为true 缓冲满了,自动刷新 (一般不改)
7.isThreadSafe (true false) 线程是否安全的 默认为true(不安全的) ,设置为false后 (实现SingThreadModel接口) ,(线程安全的)
8.info (通过info带信息)
9.errorPage (url (给服务器用)) (指定jsp的错误处理页面)
可以在相应的web工程的web.xml文件中使用 <error-page> 元素为整个web应用程序设置错误处理页面,
其中的<exception-type>子元素指定异常类的完全限定名 (如:404 500,java.io.Exception)
<location> 元素 指定 错误处理页面的路径 (/(给服务器用)(不带工程名))
注意:在jsp中 设置了 errorPage ,web.xml文件中也设置了<error-page>的话, /* JSP中的page指令优先级更高 */
10.isErrorPage (是否为错误处理页面) (true false) 如果是错误处理页面的话,最好设置为 true,(好处:能够传递异常对象,在后台记录)
11.contentType (告诉JSP引擎,页面的类型) ("text/html;charset=UTF-8")
12.pageEncoding ("UTF-8") /*实际在Eclipse开发中,只需要把这个定义好,就可以了*/
(设置好之后,会将jsp文件以UTF-8 编码保存,jsp翻译成的servlet,也是通过UTF-8 把数据发给ie,然后ie以UTF-8 打开,)
13.isELIgnored (是否忽略EL表达式) (默认为false)
/*include 指令*/ (保存网站公共页面)
1.静态包含 (<%@ include file = "/public/head.jsp" %>)
2.动态包含 (<% request.getRequestDispatcher("/public/head.jsp").include(request,response) %>)
注: 1.静态比动态性能更好 静态包含是在编译时包含,把包含时涉及到的jsp翻译成一个servlet
动态包含是在运行时包含,把包含时涉及的每一个jsp都翻译成一个servlet,
2.公共页面需要删除一些创建模板中固定出现的东西
/*九大隐式对象*/
1.request 2.response 3.session(page指令第2点) 4.application(ServletConext) 5.config
6.page(this) 7.exception (设置isErrorPage,jsp对应的servlet中就会创建这个对象) (page指令第10点)
8.out (类似于servlet中的 PrintWriter (区别:out带缓冲功能))
1.设置page指令的buffer属性关闭out对象的缓存功能
2.out对象的缓冲区已满 满足这三个条件中的一个,便将out对象缓冲区的内容, /*写到response对象中*/
3.整个JSP页面结束
9.pageContext (JSP中最重要的一个对象)(生命周期:JSP页面启动到整个JSP页面结束)
1.这个对象封装了对其他八大对象的引用 pageContext. /*pageContext1.jsp*/
2.自身是一个域对象,可以用来保存数据 /*pageContext2.jsp*/
3.封装了web开发中经常涉及的一些常用操作 (例如引入和跳转其他资源(forword) ,检索其他对象域中的属性等) /*pageContext2.jsp*/
注: /*${ data } 等价于 pageContext.findAttribute("data"); 依次查找各个域中是否有名字是data的属性,一旦找到,就不找了,返回它的值
查找顺序: page(pageContext(称之为page域)) -> request -> session -> application */
/*JSP标签*/ (避免在jsp中写java代码)
jsp常用标签:1. <jsp:include>标签 2.<jsp:forward>标签 3.<jsp:param>标签 ( 传递数据 )
/*映射jsp*/ (向servlet那样去映射) (<servlet-class> 改成<jsp-file>)