JSP入门
JSP全称为Java Server Pages,java服务器页面,特点是HTML代码和Java代码共同存在。
为什么需要JSP
Servlet输出HTML比较麻烦,代码量比较多,很不方便,JSP就是替代Servlet输出HTML的。
JSP工作原理
Tomcat访问任何资源其实都是在访问Servlet,JSP也不例外。JSP本身就是一种Servlet,为什么呢?其实JSP在第一次被访问时会被编译成HttpJspPages类,是HttpServlet的一个子类。
编译过程是:浏览器第一次请求jsp文件时,Tomcat会将jsp文件转换为java一个类,然后编译为class文件,然后再运行class文件来响应浏览器请求。
以后在访问该jsp文件就不会重新编译了,直接调用class文件,如果tomcat检测出jsp页面改动的话,就会重新编译。
JSP是一个Servlet,那么jsp页面中html是如何发送到浏览器的呢》其实就是使用write方法发送的。所以JSP就是封装了Servlet的java程序而已。
那么JSP的代码服务器是怎么执行的呢?HttpJspPages类中有一个方法叫_jspService(),由jsp转换的java代码就在该方法中。
JSP之所以比Servlet更方便简单的一个原因是:JSP内置了9个对象:out、session、response、request、config、page、application、pageContext、exception。
JSP生命周期
JSP也是一个Servlet,运行时也只有一个实例,JSP初始化和销毁时会调用Servlet的init和destroy方法。另外,JSP还有自己初始化和销毁的方法。
JSP基本语法
JSP代码分为两部分:
- HTML代码
- 元素:JSP页面中的java代码、JSP指令、JSP标签
JSP脚本
JSP脚本就是java代码,也叫做scriptlet。JSP的脚本必须使用<%%>括起来,不然JSP文件无法识别。
JSP脚本有三种方式:
- <%%>:定义局部变量,编写语句
- <%!%>:定义类或方法,但是没有人这样用
- <%=%>:表达式输出输出各种类型变量,例如<%=num1%>,就是输出num1变量
JSP指令
JSP指令用来声明JSP页面相关属性,例如编码方式,文档类型等。
JSP指令的语法格式为:
<%@ 指令 属性=“值” %>
例如,page指令常见的属性:
- language=“java”
- extends=“package.class”
- import=“{package.class | package.*},…”
- session=“true | false”
- buffer=“none | 8kb | size kb”
- autoFlush=“true | false”
- info=“text”
- errorPage=“relatice_url”
- isErrorPage=“true |false”
- contentPage=“mineType; charset=charracterSet” | “text/html”;charset=ISO-8859-1"
- pageEncoding=“characterSet | ISO-8859-1”
- isELIgnored=“true | false”
一般在高级开发工具上例如IDEA开发,只需要在page指令中指定contentType=“text/html;charset=utf-8”,就不会出现中文乱码问题。当然contentType不仅可以指定以text/html方式显示出来,还可以使用其他形式。
使用errorPage属性可以指定如果当前页面出错,要跳转到哪个页面,isErrorPage指定该页面是否为要跳转的错误页面。例如:
1 |
|
执行结果为:
但是发现,地址栏并没有改变,说明这次跳转是在服务器内发生的。
但是,这样一个一个jsp去设置错误页面太麻烦了,我们可以在web.xml文件中去指定全局错误页,无论哪个jsp发生错误,都会转到该页。
代码为:
1 |
|
将HTML代码和Java代码混合使用
例如:
1 |
|
多个<%%>可以看成是一个<%%>标签,使用if else语句来进行选择输出。
再例如使用for循环:
1 |
|
include指令
在学request对象时,曾经使用request.getRequestDispatcher(String url).include(request, response)来对页头和页尾进行包括。
include指令也是相同的作用。
include指令是静态包含,意思就是:比文件的代码内容都包含进来,再进行编译。
例如:
1.jsp文件和2.jsp文件分别为:
1 |
|
然后index.jsp为:
1 |
|
输出内容为前两个文件的内容。
taglib指令
JSP支持标签技术,要使用标签技术就要先声明标签库和标签前缀,taglib指令就是用来指明JSP页面内使用标签库技术。
后面再细说。
### JSP行为
JSP行为是一组内置的标签,只需要书写少量标记代码就能够使用JSP提供的丰富功能。JSP行为是对常用的JSP功能的抽象和封装。
这些其实就是标签。但之所以把这些内置标签称为行为,是因为要把JSTL标签区分开。当然,也可以直接把它称之为JSP标签。
include行为
刚才说了,include指令是静态包含,include行为是动态包含。include行为就是封装了request.getRequestDispatcher(String url).include(request, response)
include行为语法格式为:<jsp:include page=“” />
现在有静态包含和动态包含,但是推荐使用动态包含。
原因是:动态包含可以向被包含的页面传递参数(但是用处不大),并且分别处理包含页面(就是先将包含页面编译再写入),如果有相同名称的参数,使用静态包含就会报错(因为静态包含是先写入再编译),使用动态包含就不会出错。
param行为
当使用jsp:include和jsp:forward行为引入或请求转发其他资源时,可以使用jsp:param行为向这个资源传递参数
forward行为
学习request对象时,使用request.getRequestDispatcher(String url).forward(request, response)进行跳转,forward行为就是对其进行封装。
语法为:
<jsp:forward page=“” />
如果要传递参数,就需要在forward行为嵌套param行为
1 |
|
在2.jsp页面中获取到传递的参数
<%
String ss = request.getParameter(“username”);
%>