jsp特点

1)jsp的运行必须交给tomcat服务器!!!!

tomcat的work目录: tomcat服务器存放jsp运行时的临时文件

2)jsp页面既可以写html代码,也可以写java代码。
    (html页面不能写java代码 。而jsp页面可以写java代码)

<%
    //写java代码
    //获取当前时间
    SimpleDateFormat sdf = new SimpleDateFormat();
    String curDate = sdf.format(new Date());
    //输出内容到浏览器
    out.write("当前时间为2:"+curDate);
 %>

Jsp的执行过程

问题: 访问http://localhost:8080/day12/01.hello.jsp 如何显示效果?

1)访问到01.hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
    (01.hello.jsp   ->   _01_hello_jsp.java) (翻译)
2)tomcat服务器把java源文件编译成class字节码文件 (编译)
    (_01_hello_jsp.java  ->  _01_hello_jsp.class)
3)tomcat服务器构造_01_hello_jsp类对象
4)tomcat服务器调用_01_hello_jsp类里面方法,返回内容显示到浏览器。

Jsp语法

语法:<%=变量或表达式%>

作用: 向浏览器输出变量的值或表达式计算的结果
    注意:     
        1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
        2)表达式后面不需要带分号结束。

Jsp的脚本

语法:<%java代码 %>

作用: 执行java代码    
    注意:
        1)原理把脚本中java代码原封不动拷贝到_jspService方法中执行。
 脚本中不能声明方法

Jsp的声明

语法:<%! 变量或方法 %>

作用: 声明jsp的变量或方法
注意:
    1)变量翻译成成员变量,方法翻译成成员方法。
可以声明方法
 <!-- 穿插html代码 -->
 <%
    for(int i=1;i<=6;i++){  
  %>
    <h<%=i %>>标题<%=i %></h<%=i %>>
 <%
  }
  %>

Jsp的注释

语法: <%!– jsp注释 –%>

注意;
    1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。

include指令

作用: 在当前页面用于包含其他页面

语法: <%@include file="common/header.jsp"%>
注意:
    1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一                  个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
    2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、                     body)

page指令

作用: 告诉tomcat服务器如何翻译jsp文件

<%@ page 
    language="java"   --告诉服务器使用什么动态语言来翻译jsp文件
    import="java.util.*" --告诉服务器java文件使用什么包
                    导入包,多个包之间用逗号分割
    pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件(成java文件)
    contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
        注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
    errorPage="error.jsp" 指定当前jsp页面的错误处理页面。
    isErrorPage="false" 指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用                                exception内置对象;true,是错误处理页面,可以使用exception内置对象。
    buffer="8kb" jsp页面的缓存区大小
    session="true" 是否开启session功能。false,不能用session内置对象;true,可以使用session内                             置对象。
    isELIgnored="false" 是否忽略EL表达式。
%>

配置全局的错误处理页面:

 <!-- 全局错误处理页面配置 -->
<error-page>
    <error-code>500</error-code>
    <location>/common/500.jsp</location>
</error-page>
 <error-page>
    <error-code>404</error-code>
    <location>/common/404.html</location>
</error-page>

9大内置对象

内置对象名          类型
  request      HttpServletRequest
response      HttpServletResponse
config        ServletConfig
application        ServletContext
 session         HttpSession
exception        Throwable
page            Object(this)
out             JspWriter
pageContext     PageContext 

Out对象

out对象类型,JspWriter类,相当于带缓存的PrintWriter

PrintWriter:

    wrier(内容): 直接向浏览器写出内容。

JspWriter

    writer(内容): 向jsp缓冲区写出内容

当满足以下条件之一,缓冲区内容写出:

                    1)缓冲区满了
                    2)刷新缓存区
                    3)关闭缓存区
                    4)执行完毕jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" buffer="1kb"%><%
    for(int i=1;i<=1024;i++){
        out.write("a");
    }
    //查看缓存区大小
    System.out.println("当前缓存区大小:"+out.getBufferSize());
    //查看缓存区剩余大小
    System.out.println("缓存区剩余大小:"+out.getRemaining());
    //刷新缓存
    //out.flush();
    response.getWriter().write("123");
 %>

pageContext对象

pageContext对象的类型是PageContext,叫jsp的上下文对象

可以获取其他八个内置对象

JspWriter out =pageContext.getOut();
HttpServletRequest rquest =     pageContext.getRequest();

本身是一个域对象

ServletContext context域
HttpServletRequet  request域
HttpSession    session域     --Servlet学习的
PageContext   page域        --jsp学习的

作用: 保存数据和获取数据,用于共享数据

保存数据

1)默认情况下,保存到page域
pageContext.setAttribute("name");
2)可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)



//保存数据。默认情况下,保存在page域中
    pageContext.setAttribute("message","page's message");
    pageContext.setAttribute("message","request's messsage",PageContext.REQUEST_SCOPE);//保存到request域中

    request.setAttribute("message","request's message"); 等价于上面的代码

    pageContext.setAttribute("message","session's messsage",PageContext.SESSION_SCOPE);//保存到sessio域中
    pageContext.setAttribute("message","application's messsage",PageContext.APPLICATION_SCOPE);//保存到context域中

获取数据

1)默认情况下,从page域获取
    pageContext.getAttribute("name")
2)可以从四个域中获取数据
    pageContext.getAttribute("name",域范围常量)

    域范围常量:
            PageContext.PAGE_SCOPE
            PageContext.REQUEST_SCOPE
            PageContext..SESSION_SCOPE
            PageContext.APPLICATION_SCOPE
3)自动在四个域中搜索数据
    pageContext.findAttribute("name");
    顺序: page域 -> request域 -> session域- > context域(application域)

 <%--
          原则: 
        1)在哪个域中保存数据,就必须从哪个域取出数据!!!
     --%>
    <%=pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %><br/>
    <%=pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %><br/>
    <%=pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %><br/>
    <%=pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %><br/>
    <hr/>
    <%--
        findAttribute(): 在四个域自动搜索数据
            顺序: page域 -> request域  -> session域 -> context域

     --%>
     <%=pageContext.findAttribute("message") %>



 <%
    //转发
    // request.getRequestDispatcher("/03.pageContext2.jsp").forward(request,response);
    //重定向
    response.sendRedirect(request.getContextPath()+"/03.pageContext2.jsp");
   %>

Jsp中的四个域对象

四个域对象:

pageContext      page域              
request          request域
session          session域
application       context域

域对象作用

保存数据 和 获取数据 ,用于数据共享。

域对象方法

setAttribute("name",Object) 保存数据
getAttribute("name")  获取数据
removeAttribute("name") 清除数据

域对象作用范围

page域: 只能在当前jsp页面中使用(当前页面)
request域: 只能在同一个请求中使用(转发)
session域: 只能在同一个会话(session对象)中使用(私有的)
context域: 只能在同一个web应用中使用。(全局的)

EL表达式

EL作用

jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>。

以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。

使用EL表达式替换掉jsp表达式

EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!

语法: ${变量或表达式}

EL语法

1)输出基本数据类型变量
        1.1 从四个域获取
                        ${name}
        1.2 指定域获取
                        ${pageScope.name}
        域范围: pageScoep / requestScope / sessionScope / applicationScope

   <%
 String name = "rose";  
 //放入域中
 //pageContext.setAttribute("name",name);
 pageContext.setAttribute("name",name,PageContext.REQUEST_SCOPE); 
  %>(必须保存在域中才能用EL表达式获取到)
  <%=name %>
  <br/>
  <%--
  1)从四个域自动搜索
   --%>
  EL表达式: ${name }
  <%--
    ${name } 等价于
        <%=pageContext.findAttribute("name")%>
   --%>
   <%--
    2) 从指定的域中获取数据
    --%>
    EL表达式: ${pageScope.name }
    <%--
        ${pageScope.name } 等价于
         <%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%>

     --%>

 2)输出对象的属性值
            Student
    3)输出集合对象
           List  和 Map
    4)EL表达式计算

EL输出不同类型的数据

 <%--
    1)EL输出对象的属性    
 --%>
 <%
    //保存数据
    Student student = new Student("eric",20);
    //放入域中
    pageContext.setAttribute("student",student);

    //List
    List<Student>  list = new ArrayList<Student>();
    list.add(new Student("rose",18));
    list.add(new Student("jack",28));
    list.add(new Student("lucy",38));
    //放入域中
    pageContext.setAttribute("list",list);

    //Map
    Map<String,Student> map = new HashMap<String,Student>();
    map.put("100",new Student("mark",20));
    map.put("101",new Student("maxwell",30));
    map.put("102",new Student("narci",40));
    //放入域中
    pageContext.setAttribute("map",map);

  %>

  <%--使用EL获取对象 --%>
  ${student.name} - ${student.age }
  <%--
   ${student.name} 等价于     (点相对于调用getXX()方法)
      <%=((Student)pageContext.findAttribute("student")).getName()%>
   --%>

   <hr/>
   <%--使用EL获取List对象 --%>
   ${list[0].name } - ${list[0].age }<br/>
   ${list[1].name } - ${list[1].age }<br/>
   ${list[2].name } - ${list[2].age }
   <%--
   list[0]等价于       (中括号相对于调用get(参数)方法)
        ((List)pageContext.findAttribute("list")).get(0)
    --%>
    <hr/>
    <%--使用EL获取Map对象 --%>
    ${map['100'].name } -  ${map['100'].age }<br/>
    ${map['101'].name } -  ${map['101'].age }<br/>
    ${map['102'].name } -  ${map['102'].age }<br/>

EL表达式计算

 <%--
    1)算术表达式
      +  -  *  /
 --%>
 ${10+5 }<br/>
 ${10*5 }
 <hr/>
 <%--
    2)比较运算
    >  <  >=  <=  ==   !=
 --%>
 ${10>5 }<br/>
 ${10<5 }<br/>
 ${10!=10 }
 <hr/>
 <%--
    3)逻辑运算
     &&  ||  !
 --%>
 ${true && false }<br/>
 ${true || false }<br/>
 ${!false }<br/>
 <hr/>
  <%--
    4)判空
    null 或 空字符串:  empty
 --%>
 <%
    //String name = "eric";
    //String name = null;
    String name = "";
    pageContext.setAttribute("name",name);
  %>
  判断null: ${name==null }<br/>
  判断空字符: ${name=="" }<br/>
 判空:  ${name==null || name=="" }
 另一种判空写法: ${empty name }

jsp标签

jsp标签的作用

jsp标签作用:替换jsp脚本。

1)流程判断(if for循环)

2)跳转页面(转发,重定向)

3)。。。。。

Jsp标签分类

1)内置标签(动作标签): 不需要在jsp页面导入标签
2)jstl标签: 需要在jsp页面中导入标签
3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签

动作标签

转发标签:

参数标签:

包含标签:

  <%--转发 --%>
<%
    //request.getRequestDispatcher("/09.action2.jsp?name=eric").forward(request,response);
 %>
<%-- 参数 --%>
<%--
<jsp:forward page="/09.action2.jsp">
    <jsp:param value="jacky" name="name"/>
    <jsp:param value="123456" name="password"/>
</jsp:forward>
  --%>

  <%--包含 --%>
  <%--
 <jsp:include page="/common/header.jsp">
    <jsp:param value="lucy" name="name"/>
    </jsp:include>
 --%>
 <%@include file="common/header.jsp" %>
  主页的内容

原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。(先翻译再合并),动态包含

静态包含 vs 动态包含的区别?

1) 语法不同
静态包含语法: <%@inclue file="被包含的页面"%>
动态包含语法: <jsp:include page="被包含的页面">

2)参数传递不同
静态包含不能向被包含页面传递参数
动态包含可以向被包含页面传递参数

3)原理不同
静态包含: 先合并再翻译
动态包含: 先翻译再合并

JSTL标签

JSTL (全名:java standard tag libarary - java标准标签库 )

核心标签库 (c标签库) 天天用
        国际化标签(fmt标签库)
        EL函数库(fn函数库)
        xml标签库(x标签库)
        sql标签库(sql标签库)

使用JSTL标签步骤

    1) 导入jstl支持的jar包(标签背后隐藏的java代码)
                注意:使用javaee5.0的项目自动导入jstl支持jar包
        2)使用taglib指令导入标签库 
                        <%@taglib uri="tld文件的uri名称" prefix="简写" %>
        3)在jsp中使用标签

核心标签库的重点标签:

保存数据:
        <c:set></c:set>   

 <%--set标签 :保存数据(保存到域中)默认保存到page域 --%>
<c:set var="name" value="rose" scope="request"></c:set>

<%
    String msg = null;
    pageContext.setAttribute("msg",msg);
 %>

${msg }//取数据
获取数据: 
         <c:out value=""></c:out>

<%--out标签: 获取数据(从域中) 
default: 当value值为null时,使用默认值
escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
--%>
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>//输出结果:<h3>标题3</h3>
单条件判断
        <c:if test=""></c:if>

 <%--if标签 :单条件判断--%>
<c:if test="${!empty msg}">
    条件成立
</c:if>
多条件判断
      <c:choose></c:choose>
      <c:when test=""></c:when>
      <c:otherwise></c:otherwise>

<%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
<c:set var="score" value="56"></c:set>

<c:choose>
    <c:when test="${score>=90 && score<=100}">
        优秀
    </c:when>
    <c:when test="${score>=80 && score<90}">
        良好
    </c:when>
    <c:when test="${score>=70 && score<80}">
        一般
    </c:when>
    <c:when test="${score>=60 && score<70}">
        及格
    </c:when>
    <c:otherwise>
        不及格
    </c:otherwise>
</c:choose>
循环数据
      <c:forEach></c:forEach>
      <c:forTokens items="" delims=""></c:forTokens>

<%-- forEach标签:循环 --%>
<%
    //List
    List<Student>  list = new ArrayList<Student>();
    list.add(new Student("rose",18));
    list.add(new Student("jack",28));
    list.add(new Student("lucy",38));
    //放入域中
    pageContext.setAttribute("list",list);

    //Map
    Map<String,Student> map = new HashMap<String,Student>();
    map.put("100",new Student("mark",20));
    map.put("101",new Student("maxwell",30));
    map.put("102",new Student("narci",40));
    //放入域中
    pageContext.setAttribute("map",map);
 %>

开始循环

 <%--
  begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
  end="":     到哪个元素结束。默认到最后一个元素
  step="" : 步长    (每次加几)  ,默认1
  items="": 需要遍历的数据(集合) 
  var="": 每个元素的名称 
  varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)

 --%>
<c:forEach items="${list}" var="student" varStatus="varSta">
    序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
</c:forEach>
posted on 2018-05-13 21:47  NE_STOP  阅读(2)  评论(0编辑  收藏  举报  来源