概述

JSP其实是一个Servlet,它提供了一个比较直观的编写动态网页的方式,因为写JSP就像在写Html。
Jsp页面在第一次被用户访问时,Servlet容器会通过其JSP引擎将jsp页面翻译成一个Servlet。之后都是调用该servlet的service方法,进而对用户的请求做出动态响应。除非jsp页面做了修改,否则容器不会重新翻译jsp页面。

语法

  1. JSP模板元素:即指JSP中的HTML标签,一般地,先写好HTML模板之后,再往里套JSP脚本。
  2. JSP脚本表达式:
    语法:<%=表达式%>,将表达式结果输出到页面上,会被翻译成out.print(表达式);
  3. JSP脚本片段:
    语法:
    1
    2
    3
    4
    <%
    // Java代码...
    // ...
    %>
    这段java代码会原样加到翻译的Servlet中service方法内部。
    注意;因为嵌套太多JSP脚本片段,会使JSP难以阅读、逻辑混乱,故而实际开发中不建议在JSP页面中使用,可以用自定义标签替代。而JSP表达式则可以用EL表达式来替代。所以有:JSP中最好不要有一句JSP脚本
  4. JSP声明:
    语法:
    1
    2
    3
    4
    <%!
    // 成员声明代码
    // ...
    %>

    用于定义JSP中的成员(成员变量、成员方法),翻译成对应的Servlet时,会将这段声明放在service方法外部
  5. JSP注释
    语法:<%-- 注释内容 --%>,用于注释JSP中的元素(包括HTML标签),被注释的内容不会被翻译到Servlet中
  6. JSP指令:
    语法:<%@ 指令名称 属性1="值" ... %>,是给Servlet容器的JSP解析引擎翻译时用的。
    指令有:
  • page:定义JSP页面的各种属性

    language,JSP中使用的脚本语言,默认是Java;
    extends,指定JSP对应的Servlet的父类;
    import,导入JSP中所使用到的类;
    session,JSP内部要不要创建HttpSession对象(即调用getSession())默认值是true;
    buffer,指定JSP用的字符输出流(JSPWriter)的缓存大小,默认值为8KB;
    autoFlush,页面是否自动刷新,默认是true;
    isThreadSafe,指定JSP对应的Servlet是否实现SingleThreadModel接口,为false时才实现。默认是true;
    errorPage,指定如果页面出错时请求转发到哪个页面;
    isErrorPage,标志JSP要不要创建记录错误日志的exception对象;
    contentType,指定JSP内容的MIME类型。即response.setContentType()
    pageEncoding,指定JSP引擎读取JSP代码时使用的编码,默认是ISO-8859-1;
    isELIgnored,是否忽略EL表达式。默认值false。

  • include:静态包含另一个页面的输出内容
    静态包含:<%@ include file="url" %>,将目标资源的输出内容原封不动的包含到自己内部,翻译成一个Servlet。
    动态包含:<jsp:include >,将目标资源的输出内容与自己的输出内容合并后再输出,翻译为两个servlet。

  • taglib:引入外部定义的标签
    <%@ taglib uri="标签所在的名称空间" prefix="标签的短名字" %>

9个内置对象

即在JSP中的JSP脚本可以直接使用的对象,其实就是翻译后的Servlet中的service方法里的那些预定义的对象。











































内置对象名对应的类型
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
sessionjavax.servlet.http.HttpSession
pagethis
configjavax.servlet.ServletConfig
applicationjavax.servlet.ServletContext
exceptionjava.lang.Throwable
outjavax.servlet.jsp.JspWriter
pageContextjavax.servlet.jsp.PageContext



## 4个域对象
域对象,就是对象中维护了一个Map用来存储和传递一些数据,key一般为String类型的,value为Object类型的。


























域对象名对应的类型有效范围
pageContextjavax.servlet.jsp.PageContextpage,当前页面
requestjavax.servlet.http.HttpRequestrequest,一次请求
sessionjavax.servlet.http.HttpSessionsession,一次会话
applicationjavax.servlet.ServletContextapplication,当前应用

pageContext对象详解:
1、本身是一个域对象,范围为当前页面有效(page)。它还能操作其他的3个域对象中的内容。

demo - 1.jsp
1
2
3
4
5
6
7
8
9
10
11
<body>
<%
pageContext.setAttribute("a","aa"); //page域中放数据
pageContext.setAttribute("a","request",PageContext.REQUEST_SCOPE);//request域中放数据
pageContext.setAttribute("a","session",PageContext.SESSION_SCOPE);//session域中放数据
pageContext.setAttribute("a","app",PageContext.APPLICATION_SCOPE);//application域
// ...
%>
...
<%=pageContext.findAttribute("a")%> 从page到application域中寻找key为"a"的数据
</body>

2、获取其他8个内置对象的引用,当普通类需要用到Jsp中的内置对象时,只需将其传入即可
demo - Demo2.java
1
2
3
4
5
6
7
8
9
10
11
// import 略
public class Demo {
private PageContext pageContext;
public Demo(PageContext pageContext) {
this.pageContext = pageContext;
}
public void out(){
pageContext.getOut().write("test");
}
// ...
}

3、提供转发和包含的简洁方法
1
2
3
4
5
6
request.getRequestDisPathcer("/1.jsp").forward(request,response);
//简化为
pageContext.forward("/1.jsp");
request.getRequestDisPathcer("/2.jsp").include(request,response);
//简化为
pageContext.include("/2.jsp");

常用动作元素

  1. <jsp:forward>:转发
  2. <jsp:include>:动态包含
  3. <jsp:param>:定义转发和包含中的请求参数
  4. <jsp:usebean>:在指定的域中查找给定名称的JavaBean对象,如果没有,则创建一个新对象,并将其放到指定的域中
    id:域中对象的名称。
    class:域中对象的类型。
    scope:域范围。默认值是page。可选值page|request|session|application
  5. <jsp:setProperty>:调用JavaBean中对应的setter方法,设置属性值。
    property:属性名称。setter方法去掉set后,把第一个字母变小后的名称。
    支持通配符*:把同名的请求参数的值设到对象对应的属性中去。
    name:哪个JavaBean。对应的是jsp:useBean中的id。
    value:设置的值
    param:请求参数的名称
    注:
    1、不仅能设置值。还能自动类型转换(仅限基本类型)
    2、可以匹配请求参数。
  6. <jsp:getProperty>:调用getter方法,把值输出到页面上。
    property:属性名称。去掉get后,把第一个字母变小后的名称。
    name:哪个JavaBean。对应的是jsp:useBean中的id。
    注:如果一个对象的某个属性的值是null,界面上就显示null。