JavaWeb 后端 <五> 之 JSP 学习笔记

简介:

一、JSP简介

1、也是SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一。由于原理上是Servlet, 所以JSP/Servlet在一起。

二、HTML、Servlet和JSP

1、HTML:静态页面,不能包含java代码,只能有HTML有关的标记

2、Servlet:写java代码,做页面的输出,不是很方便(开发效率很低)

3、JSP:HTML+java

三、输出当前的时间

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>第一个JSP,输出当前的时间</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    现在是:
    <%
        Date now = new Date();
        //out.write(now.toLocaleString());
    %>
    <%=now%>
  </body>
</html>
复制代码

 

四、JSP的原理及生命周期

1、JSP就是Servlet,学习好JSP的关键(语法),时刻想到他对应的Servlet。

 

2、时常翻阅JSP对应的Servlet源码

Work 中查找

五、JSP的语法

5.1 模板元素

指JSP中的那些HTML。开发时先编写模板元素,因为他们决定页面的外观。

5.2 Java程序片段

语法:<%java程序%>

出现在JSP对应Servlet的service方法中。

<%声明的变量:局部%>

 

5.3 Java表达式

语法:<%=表达式%>

 

  = 

小练习:作业

 Java程序片段和表达式练习

复制代码
<%@ page language="java" import="java.util.*,com.itheima.domain.Student" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Java程序片段和表达式练习</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <%
    List<Student> stus = new ArrayList<Student>();
    stus.add(new Student("牛骞","未知",19));
    stus.add(new Student("薛振宇","女性",59));
    stus.add(new Student("刘飞","男性",29));
    %>
    <!-- 表格的形式,打印出来 -->
    <table border="1" width="438">
        <tr>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
        </tr>
        <%
        for(Student s:stus){
        %>
            <tr>
                <td><%=s.getName()%></td>
                <td><%=s.getGender() %></td>
                <td><%=s.getAge()%></td>
            </tr>
        <%
        }
        %>
    </table>
  </body>
</html>
复制代码

 

5.4 JSP声明

语法:<%!

 

%>

作用:定义JSP对应Serlvet的成员(变量和方法、静态方法)

 

复制代码
<%@page import="java.lang.reflect.Method"%>
<%@ page language="java" import="java.util.*" session="true" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JSP声明</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <%!
    int i=100;//不建议
    
    public void m1(){
        //out.write("hello");//不可以,因为out是service中的局部变量
    }
    static{
        System.out.println("oyeah");
    }
     %>
     
     <!-- 
     hello
      -->
      <%--shit --%>
      
      <%=session.getId() %>
  </body>
</html>
复制代码

 

 

注意:开发中很少用。面试和考试经常考。

5.5 JSP注释

语法:<%--这是JSP注释--%>

 

作用:注释掉的代码,JSP引擎不会翻译到Servlet源码中。要注意和HTML注释的区别。

html注释:<!--这是html注释-->

5.6 JSP指令:

简介:

指令是为JSP引擎设计的。而只是告诉引擎如何处理JSP页面中的其余部分(非指令部分);

基本语法格式:<%@指令 属性1=”值1” ....%>.

一般把指令放在JSP页面的顶部(不是必须的)

指令的属性可以写在一个指令的中,也可以分开写:比如:

<%@指令 属性1=”值1” 属性2=”值2”%>.

等价于:

<%@指令 属性1=”值1” %>.

<%@指令 属性2=”值2”%>.

 

page:

属性:

language:告知引擎,脚本用的是java。默认java,支持java。不写也行。

extends:告知引擎,JSP对应的Servlet的父类是哪个。不需要写,也不要改。

*import:告知引擎,导入哪些包。

注意:引擎自动导入:java.lang.*;javax.servlet.*;javax.servlet.http.*;javax.servlet.jsp.*;

 

导入的形式:

<%@page import=”java.util.Date,java.util.UUID”%>或者:

<%@page import=”java.util.Date”%>

<%@page import=”java.util.UUID”%>  用Eclipse:Alt+/ 自动导入

*session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认值true。

buffer:JspWriter用于输出JSP的内容到页面上。告知引擎,设定他的缓存大小。默认8Kb。

*errorPage:告知引擎,当前页面出现了异常,应该转发到哪个页面上(路径写法:/代表着当前应用)

 

配置全局错误页面:web.xml

 

*isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception隐含对象,打印异常的详细信息。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="false"%>

 

<%=exception.getMessage()%>

 

*contentType:告知引擎,响应正文的MIME类型。

contentType=”text/html;charset=UTF-8” 相当于response.setContentType(“<%=exception.getMessage() %>”);

 

*pageEncoding:告知引擎,翻译JSP时(要从磁盘上读JSP文件)所用的码表。

pageEncoding 要和存在磁盘上的编码一致

在编译器中(myeclipse eclipse)不用担心,pageEncoding修改后 会自动转换为pageEncoding的编码

 

 

pageEncoding=”UTF-8”:相当于,告知了引擎用UTF-8读jsp,还response.setContentType(“text/html;charset=UTF-8”);

 

*isELIgnored:告知引擎,是否忽略EL表达式。默认值是false,不忽略。 ${1+1}

 

总结:属性众多。一般都用的默认值。用起来很简单,最简单的形式:

<%@ page  pageEncoding="UTF-8"%>

include:

包含

属性:file,以”/”开头,就代表着当前应用。

 

1
<%@include file="/07include.jsp"%>

 

taglib:

引入外部的标签。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 

uri:外部的标签的uri地址,好比名称空间

prefix:前缀。

 

六、JSP中的转发和包含

1、转发:

<jsp:forward page="/10forward.jsp"></jsp:forward>

JSP的内置标签。

2、参数:不能单独使用

向目标传递请求参数

 

3、包含:(面试题)

静态包含:<%@include%>

 <%@include file="included.jsp"%>
  <%=data%>

 

动态包含:其余的

<jsp:include page=””/>

 

 <%--
  RequestDispatcher rd = request.getRequestDispatcher("included.jsp");
  rd.include(request, response);
   --%>
  <jsp:include page="included.jsp"></jsp:include>

动态包含是把结果加在一起 不能使用包含的变量 静态可以使用包含的变量 加在一起了  动态的无法使用 data

 

总结:用标签可以少些java脚本。

七、JSP的九个隐含对象:(面试题)

JSP对应的Servlet的service方法中的局部变量

JSP隐含对象名称

类型

备注

request

javax.servlet.http.HttpServletRequest

 

response

javax.servlet.http.HttpServletResponse

 

session

javax.servlet.http.HttpSession

page指令有开关

application

javax.servlet.ServletContext

 

config

javax.servlet.ServletConfig

 

page

javax.servlet.http.HttpServlet

当前jsp对应Servlet的实例引用

exception

java.lang.Throwable

page指令有开关

out

javax.servlet.jsp.JspWriter

字符输出流。相当于PrintWriter

pageContext

javax.servlet.jsp.PageContext

很重要

 

八、JSP中的异常处理

1、运行时异常

 

以上情况找JSP对应的Servlet源码。

2、出现的错误(语法不对)

 

九、PageContext抽象类(很重要)

1、本身是一个域(范围)对象,还能操作其他3个域对象中的属性

l  页面范围(Page):

void setAttribute(String name,Object value);

void removeAttribute(String name);

Object getAttribute(String name);

l  操作其他域对象中的属性:

void setAttribute(String name,Object value,int scope);

void removeAttribute(String name,int scope);

Object getAttribute(String name,int scope);

 

int scope:常量,PageContext   PAGE_SCOPE(页面) REQUEST_SCOPE(请求)SESSION_SCOPE(会话)APPLICATION_SCOPE(应用)

l  在四个范围中依次查找指定名称对象的方法:

PAGE(页面) REQUEST(请求)SESSION(会话)APPLICATION(应用)

 

在使用

请求转发 和重定向 和 一次session(一次会话 ) 和 一次 应用 关闭

4中情况 下的 的数据是否 流失 。

在例子中会 解释 4中 对象的 保存 时间 。

当请求转发 的 时候 ,page(页面 )的信息消失了

当 重定向的时候, page(页面) Request(请求)的信息消失了

当重新打开一个会话的时候,page(页面) Request(请求) 和 session(会话)的信息就消失了

当应用 关闭的时候 ,所有的信息都消失了。

 

案例:

01.jsp

 

 请求转发 :

  <jsp:forward page="2.jsp"></jsp:forward>

重定向:

<% response.sendRedirect("2.jsp"); %>

 

02.jsp

 

 

 

 

 

Object findAttribute(String name);

 

2、获取其他八个JSP隐含对象(自定义标签时用)

PageContext.getRequest();

getServletContext();

getServletConfig();

getException();

get...

3、提供转发和包含的简易方法

 

 

pageContext.include(String url);

十、四大域对象

 

实际开发中:存放数据的。

 

PageContext:页面范围。最小。开发中很少用。演示代码。

ServletRequest:请求范围。不同的资源,只有用转发。    如:学生信息,一次请求有用 下次 就没有 用了

HttpSession:会话范围。多次请求共享数据,但不同的客户端不能共享。

ServletContext:应用范围。最大。尽量少用。用时要做同步处理。

十一、JSP开发的最佳实践(怎么 用好?)

Servlet:擅长写Java代码逻辑,不擅长输出html的内容。

开发中作为:控制器。

JSP:不擅长写Java代码逻辑,擅长显示结果。

开发中作为:视图(显示结果)