JavaWeb开发知识总结(JSP,EL,JSTL)
1. JSP概述
JSP技术:Java服务器端页面(Java Server Pages),是一种动态网页开发技术。
JSP的组成:HTML+Java代码+JSP自身元素。
JSP自身元素包括JSP指令,JSP动作标签和JSP的内置对象。
2. JSP执行流程
JSP的本质是Servlet,tomcat服务器会将jsp文件进行编译生成一个servlet.java文件和对应的servlet.class文件,执行的是.class文件。在tomcat服务器的\work\Catalina\localhost
目录下对应的项目目录中可以看到jsp页面被翻译成java文件和class文件,查看java文件可以发现JSP页面经过编译后的java类是继承HttpJspBase
类,而该类是继承至HttpServlet
类,则JSP本质是Servlet。通过查看jsp翻译后的java源文件可知,jsp被翻译成的Servlet其实就是使用jsp内置的out(是JspWriter类型)对象中的Write()
方法将jsp页面中的内容进行逐行输出到客户端浏览器中的。
3. JSP的脚本
JSP的脚本就是在jsp页面中编写Java代码的方式;由于jsp页面会被翻译成Servlet的java文件并重写Servlet中service方法,java类有成员位置和局部位置(参数位置和方法内部),则针对jsp页面编写Java代码就有三种方式,这三种方式编写的代码会被翻译成Java类中对应的部分。
JSP脚本 | JSP被编译成Servlet后对应的位置 |
---|---|
<%! java代码; %> | 翻译成Servlet类中的成员内容,可以定义变量,方法,类 – 不建议使用 |
<% java代码; %> | 翻译成Servlet类中的service方法内部,可以定义变量和类,必须加分号 |
<%= java代码 %> | 翻译成Servlet类中的service方法的out.write()方法的参数,相当于是直接输出,不能加分号 |
注意事项:<%= java代码 %>
中输出的是变量时,如果变量值为空时,输出的null字符串。
4. JSP文件中的注释
由于JSP是结合HTML和JAVA并定义自身的内置对象,则其注释方式有三种:html的注释,Java代码的注释,及JSP自身的注释。
注释类型 | 注释格式 | 注释格式说明 | 注意事项 |
---|---|---|---|
HTML注释 | 输出到客户端还存在 | 不能注释jsp的脚本内容 | |
Java注释 | // 单行 /多行注释*/ /*文档注释*/ | 一般用在在jsp脚本中 | 存在于翻译后Servlet中,输出到客户端的html页面时消失 |
jsp注释 | <%– jsp注释 –%> | 只存在于JSP的源代码中 | 翻译成Servlet后,JSP的注释就消失了 |
5. JSP指令
JSP指令就是设置JSP页面属性的,JSP有三个指令:page
,include
,taglib
。
5.1 JSP指令的语法
<%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” …%>,指令名称可以为page,include和taglib。
5.2 JSP的page指令
page指令是设置jsp页面的参数信息。page指令常用的属性有以下几个:
page属性值 | 属性值说明 | 使用时注意事项 |
---|---|---|
language | JSP脚本中使用的语言 | 目前只写java |
contentType | 设置浏览器打开这个JSP的时采用的默认的字符集编码 | |
pageEncoding | 设置jsp文件保存到本地硬盘,以及生成Servlet后,Servlet保存到硬盘上的编码 | |
import | 在JSP中引入java类对象 | import可以出现多次,其他属性只能出现一次 |
extends | 设置JSP翻译成Servlet后继承的类 | 默认值是HttpJspBase,设置时的类必须是HttpServlet的子类.继承后自定义的类中会没有jsp的一些功能 |
autoFlush | 设置JSP的缓存自动刷出 | 默认是true:自动刷出 |
buffer | 设置JSP的缓冲区的大小,默认8kb | |
session | 设置JSP中是否可以直接使用session对象 | 默认值是true,设置后直接使用session变量进行Session的操作 |
isELIgnored | 设置在JSP中是否忽略EL表达式 | 默认值是false不忽略 |
errorPage | 设置错误友好页面的提示 | 和isErrorPage一起使用,jsp出错后跳转(转发方式)到指定页面,路径是服务器端路径,不能加上工程名 |
isErrorPage | 通过这个设置显示JSP的错误信息 | 和errorPage一起使用,在errorPage跳转到页面使用 |
扩展:在web项目下配置全局的错误友好提示
当整个页面出现错误时,系统会跳到指定的页面。在项目的web.xml文件中配置如下:
<!--web.xml配置文件-->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 配置错误友好页面 -->
<error-page>
<error-code>错误的状态码</error-code>
<location>/出错后跳转到指定的jsp页面</location>
</error-page>
<!-- 配置出现500错误时友好页面 -->
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
</web-app>
5.3 JSP的include指令
include指令是使得当前jsp页面去包含其他的jsp页面,使用的包含使用的文件的相对路径。包含的方式是静态包含。其本质就是直接将被包含的jsp页面直接放在此jsp页面使用include指令包含页面的位置,因此使用此种包含时,被包含的页面只需要有内容题就可以了,不需要再定义一个完整的jsp的结构。
格式:<%@ include file=”被包含的jsp文件”%> 文件使用的相对路径。
5.4 JSP的taglib指令
taglib指令是用来为jsp页面引入jsp标签库的。一般引入的是jstl标签库。
格式:<%@ taglib uri=”标签库uri” prefix=”标签的别名” %>
6. JSP动作标签
JSP动作标签的作用是用来进行简化代码编写的。JSP常用的6个标签如下:
JSP动作标签 | 说明 |
---|---|
< jsp:forward page=”转发的页面”>< /jsp:forward> | 页面的转发,使用服务器端路径 |
< jsp:include page=”被包含的jsp页面”>< /jsp:include> | 用于页面包含(动态包含) |
< jsp:param value=”参数值” name=”参数名”/> | 一般和带有路径的标签一起使用,传递参数,常用上述两个标签 |
< jsp:useBean id=”javabean类的id”>< /jsp:useBean> | 用于在JSP中使用JavaBean |
< jsp:setProperty property=”属性值” name=”属性名”/> | 用于在JSP中向JavaBean设置属性 |
< jsp:getProperty property=”属性值” name=”属性名”/> | 用于在JSP中获得JavaBean的属性 |
JSP页面的静态包含(include指令)和动态包含(include标签)的区别:
<%@ include file="被包含的jsp文件"%>
是静态包含jsp页面,< jsp:include page="被包含的jsp页面">< /jsp:include>
是动态包含jsp页面。 静态包含是直接包含jsp页面的全部内容,而动态包含只是包含被包含jsp页面的运行结果。
7. JSP内置对象(重点)
JSP内置对象:在jsp页面中可以直接使用的对象(9大内置对象)。在jsp页面翻译成的Servlet的java文件中可以查看到。
7.1 JSP的9大内置对象
内置对象名称 | 内置对象的数据类型 | 内置对象常用API |
---|---|---|
request | HttpServletRequest | getParameter(String name),setAttribute(String name,Object value),getAttribute(String name); |
response | HttpServletResponse | setHeader(String name,String value),getOutputStream();getWriter() |
session | HttpSession | setAttribute(String name,Object value),getAttribute(String name); |
application | ServletContext | setAttribute(String name,Object value),getAttribute(String name); |
page | Object | toString();wait();(是jsp页面翻译成Servlet后对象引用) |
pageContext | PageContext | setAttribute(String name,Object value),getAttribute(String name); |
config | ServletConfig | getServletName();getServletContext(); |
out | JspWriter | write(),print(); |
exception | Throwable | getMessage(),getCause();(设置isErrorPage=”true”后才有效) |
7.1.1 out内置对象和response.getWriter()的区别:
out内置对象的数据类型是JspWriter,response获取的Writer的数据类型是PrintWriter。