一、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代码逻辑,擅长显示结果。
开发中作为:视图(显示结果)
十二、JavaBean的概念
1、JavaBean又称之为POJO(Plain Old Java Object)、VO(Value Object)、DO(Data Object)
2、JavaBean的书写规范
a、必须是public的
b、提供默认的构造方法
c、字段都是私有的: private String username;
d、提供公有的getter或setter方法:属性。
getUsername():读属性,属性名:username.
setUsername(String username):写属性,属性名:username。
注意:private boolean married; getMarried()===isMarried()
e、一般需要实现java.io.Serializable接口。
结论:JavaBean在JavaEE开发中,主要担当封装数据用的。
十三、JSP中使用JavaBean
1、导入JavaBean:用page指令的import
2、声明JavaBean:
3、获取属性:
如果属性是null,那么界面就显示null。
4、设置属性:
注意:类型的转换问题
可以使用请求参数设置JavaBean的属性。
5、JavaBean的存活范围:
声明JavaBean时,指定scope属性。默认值page,当前页面范围。
可选值:page|request|session|application
总结:JSP+JavaBean,开发模型,Model1(模型1)
注意: 问题 JspWriter和PrintWriter 输出的区别
<%
out.write("a");//jspwriter
out.flush();
response.getWriter().write("b");
%>
默认 缓存 是 8kb 可在page里 给 buffer 设属性值 修改 缓存的大小
当 buffer=0kb 的时候 out.write 将直接输出到Response 不会存在 JspWriter的缓存 里面。
或者 在代码中添加 out.flush(); 和也是输出ab
当缓存满的时候会刷到Response里面去
out.write("aaaaac");//jspwriter
out.flush();
response.getWriter().write("b");
如果 aaaaa刚好占满缓存空间,输出的结果 为 aaaaa b c
aaaaa占满缓存空间,会刷到 Response里 接着 c 会存在 缓存中, b写到Response中,jsp结束时,jspwriter会将 c刷到Response中 输出的结果就是 aaaaabc
所以输出流 就用 out.writer输出流。