一、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.2Java程序片段
语法:<%java程序%>
出现在JSP对应Servlet的service方法中。
<%声明的变量:局部%>
5.3Java表达式
语法:<%=表达式%>
=
小练习:作业
Java程序片段和表达式练习
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>第一个JSP,输出当前的时间</title> 7 8 <meta http-equiv="pragma" content="no-cache"> 9 <meta http-equiv="cache-control" content="no-cache"> 10 <meta http-equiv="expires" content="0"> 11 <!-- 12 <link rel="stylesheet" type="text/css" href="styles.css"> 13 --> 14 15 </head> 16 17 <body> 18 现在是: 19 <% 20 Date now = new Date(); 21 //out.write(now.toLocaleString()); 22 %> 23 <%=now%> 24 </body> 25 </html>
5.4JSP声明
语法:<%!
%>
作用:定义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.5JSP注释
语法:<%--这是JSP注释--%>
作用:注释掉的代码,JSP引擎不会翻译到Servlet源码中。要注意和HTML注释的区别。
html注释:<!--这是html注释-->
5.6JSP指令:
简介:
指令是为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,以”/”开头,就代表着当前应用。
<%@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%>
动态包含:其余的
<jsp:include page=””/>
总结:用标签可以少些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 页面范围:
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(应用)
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)