Java Server Page
放在除WEB-INF(放web项目的隐私文件)外的其他任何目录中。
Java服务器端网页,实现在HTML页面编写Java代码实现动态内容,一种简化Servlet编写的技术(不用在java里拼写html)
本质上是一个Servlet,每个JSP页面在第一次被访问时
,JSP引擎会将它翻译成一个Servlet程序(java文件),接着编译为class文件,然后由web容器(Servlet引擎,tomcat)去装载、执行。
workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\项目名\org\apache\jsp\xxx_jsp.java
运行tomcat后,被装载在:
tomcat_home\work\Catalina\localhost\项目名\org\apache\xxx_jsp.java
整个过程在Servlet容器的控制下将请求的JSP资源转变为Servlet之后,同样会经历Servlet的实例化、初始化、就绪、销毁四部分的生命周期。从图中可以看到,之所以第一次请求一个JSP页面会比之后的请求响应慢一些,就是要经过转译成Servlet,编译成class这样一个过程。
JSP页面的隐含对象
没有声明就可以引用的,源码:
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
//...
//使用 <% %> 编写的代码在此位置. 可以用到 request, response, pageContext, session
//application, config, out, page 这 8 个隐含对象. (实际上还可以使用一个叫 exception 的隐含对象)
}
1.request:HttpServletRequest,属性的作用范围仅限于同一个请求。
2.response:HttpServletResponse,JSP页面里几乎不用。
3.pageContext:PageContext,页面的上下文,可以从该对象中获取其他8个隐含对象和当前页面其他信息(标签),属性作业范围仅限于当前JSP页面。
4.session:HttpSession,代表浏览器和服务器的一次会话(浏览器打开直到关闭即一次会话)
5.application:ServletContext,代表当前Web应用,属性作业范围仅限于当前Web应用。只要在一处设置属性, 在其他各处的 JSP 或 Servlet 中
都可以获取到。
6.config:当前JSP对应的Servlet的ServletConfig对象(几乎不用)。若需访问当前JSP配置的初始化参数,需要通过映射地址(url-pattern)。
7.out:JspWriter对象,调用out.print(),直接把字符串打印在浏览器上。
8.page:指向当前JSP对应的Servlet对象的引用,但为Object类型,只能调用Object类的方法(几乎不用)。
9.exception:在声明了page指令的isErrorPage="true"时才可用。
<%@ page isErrorPage="true" %>
pageContext, request, session, application(对属性的作用域的范围从小到大) ,都有这些方法!这四个对象也称之为域对象:
void setAttribute(String name, Object o): 设置属性
Object getAttribute(String name): 获取指定的属性
Enumeration getAttributeNames(): 获取所有的属性的名字组成的 Enumeration 对象
removeAttribute(String name): 移除指定的属性
pageContext, request, session, application 对象
JSP模版元素:
JSP页面中的静态HTML内容称 。
JSP脚本片断(scriptlet)
是指嵌套在<% 和 %>之中的一条或多条Java程序代码。 多个脚本片断中的代码可以相互访问。
<%
String ageStr = request.getParameter("age");
Integer age = Integer.parseInt(ageStr);
if(age >= 18){
%>
成人...
<%
}else{
%>
未成人...
<%
}
%>
JSP表达式
提供了将一个 java 变量或表达式的计算结果输出到客户端
的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中。
<%
Date date = new Date();
out.print(date);
%>
<!--jsp表达式-->
<%= date %>
JSP 声明
JSP 声明将 Java 代码封装在<%!和 %>之中,它里面的代码将被插入进 Servle t的 _jspService 方法的外面(在 JSP 页面中几乎从不这样使用)。
JSP指令
JSP注释
<%-- JSP 注释 --%>
区别: JSP 注释可以阻止 Java 代码的执行.。
JSP标签
JSP标签可代替java代码,使JSP文件变得简洁,便于维护和代码复用。
include标签
1).
2). 动态引入: 并不是像 include 指令生成一个 Servlet 源文件, 而是生成两个 Servlet 源文件, 然后通过一个方法的方式把目标页面包含进来.
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "b.jsp", out, false);
forward标签
1).
相当于.
<%
request.getRequestDispatcher("/include/b.jsp").forward(request, response);
%>
2). 但使用 jsp:forward 可以使用 jsp:param 子标签向 b.jsp 传入一些参数. 同样 jsp:include 也可以使用 jsp:param 子标签.
<jsp:forward page="/include/b.jsp">
<jsp:param value="abcd" name="username"/>
</jsp:forward>
OR
<jsp:include page="/include/b.jsp">
<jsp:param value="abcd" name="username"/>
</jsp:include>
在 b.jsp 页面可以通过 request.getParameter("username") 获取到传入的请求参数.