【我的javaEE学习】JSP简单学习
一、JSP简介
1、SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一。由于原理上是Servlet, 所以JSP/Servlet在一起。
二、HTML、Servlet和JSP
1、HTML:静态页面,不能包含java代码,只能有HTML有关的标记
2、Servlet:写java代码,做页面的输出,不是很方便(开发效率很低)
3、JSP:HTML+java
三、输出当前的时间
四、JSP的原理及生命周期
1、JSP就是Servlet,学习好JSP的关键(语法),时刻想到他对应的Servlet。
五、JSP的语法
5.1模板元素
JSP中的那些HTML。开发时先编写模板元素,因为他们决定页面的外观。如CSS等内容。
5.2 Java程序片段
语法:<%java程序%>
出现在JSP对应Servlet的service方法中。
<%声明的变量:局部变量%>
Jsp中:
Jsp对应的Serclet中:
5.3 Java表达式
语法:<%=表达式%>
5.4 JSP声明
语法:<%! %>
作用:定义JSP对应Serlvet的成员(变量和方法、静态方法)(注意这个声音是全局的)
注意:开发中很少用。如:
在serlvet的service方法里找不到,因为service方法里是局部,该变量是全局的。不建议使用,因为有线程安全问题。
5.5 JSP注释
语法:<%--这是注释--%>
作用:注释掉的代码,JSP引擎不会翻译到Servlet源码中。要注意和HTML注释的区别。
5.6 JSP指令:
指令是为JSP引擎设计的。而只是告诉引擎如何处理JSP页面中的其余部分(非指令部分);一般把指令放在JSP页面的顶部(不是必须的)。
基本语法格式:<%@指令 属性1=”值1” ....%>;指令的属性可以写在一个指令的中,也可以分开写,比如:<%@指令 属性1=”值1” 属性2=”值2”%>.
等价于:
<%@指令 属性1=”值1” %>.
<%@指令 属性2=”值2”%>.
page:定义JSP页面的各种属性,作用于整个JSP页面。
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”%>
session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession(),默认值true。改成false就不会产生session.
buffer:JspWriter用于输出JSP的内容到页面上。告知引擎,设定他的缓存大小。默认8Kb。(了解)
errorPage:告知引擎,当前页面出现了异常,应该转发到哪个页面上(路径写法:/代表着当前应用)
或者配置全局错误页面:web.xml
isErrorPage:告知引擎,是否抓住异常。默认值为false。如果该属性为true,页面中就可以使用exception隐含对象,打印异常的详细信息。
contentType:告知引擎,响应正文的MIME类型。
contentType=”text/html;charset=UTF-8” 相当于response.setContentType(“text/html;charset=UTF-8”);
pageEncoding:告知引擎,翻译JSP时(要从磁盘上读JSP文件)所用的码表。
pageEncoding=”UTF-8”:相当于,告知了引擎用UTF-8读jsp,还response.setContentType(“text/html;charset=UTF-8”);
isELIgnored:告知引擎,是否忽略EL表达式。默认值是false,不忽略。
总结:属性众多。一般都用的默认值。最简单的形式:<%@ page pageEncoding="UTF-8"%>
include:
属性:file,以”/”开头,就代表着当前应用。<%@ include file="/public/includefiles/allincludefiles.jsp"%>
taglib:引入外部的标签。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> uri:外部的标签的uri地址,好比名称空间;prefix:前缀。
六、JSP中的转发和包含
1、转发:利用JSP的内置标签来处理(以jsp开头的标签)(jsp:forward)
<jsp:forward page="/10forward.jsp"></jsp:forward>
转发后当前访问地址不会变
等价于request.getRequestDispatcher(“/10forward.jsp”).forward(request,respone);
参数:不能单独使用
向目标传递请求参数(传递请求参数只认jsp:param,别的包含注释都是不认的)
即地址:当前项目/10forward.jsp/username=abc
2、包含:
静态包含:<%@include%>
动态包含:<jsp:include page=””/> (不推荐使用)
包含生成的Servlet要注意,A包含B,那就生成A的Servlet,在A的Servlet里面包含了B的内容在里面,一共生成了一个Servlet。
七、JSP的九个隐含对象:
JSP对应的Servlet的service方法中的局部变量
JSP隐含对象名称 |
类型 |
备注 |
request |
javax.servlet.http.HttpServletRequest |
|
response |
javax.servlet.http.HttpServletResponse |
|
session |
javax.servlet.http.HttpSession |
page指令设置session是否存在 |
application |
javax.servlet.ServletContext |
|
config |
javax.servlet.ServletConfig |
|
page |
javax.servlet.http.HttpServlet |
当前jsp对应Servlet的实例引用 |
exception |
java.lang.Throwable |
page指令设置exception是否存在 |
out |
javax.servlet.jsp.JspWriter |
字符输出流。相当于PrintWriter |
pageContext |
javax.servlet.jsp.PageContext |
八、JSP中的异常处理
1、运行时异常:找JSP对应的Servlet源码。
2、出现的错误(语法不对)
直接看页面的提示
九、四大域对象
实际开发中:存放数据的。
域对象从小到大:
1、PageContext:页面范围,最小。开发中很少用。
⑴生命周期:当对JSP的请求开始,当相应结束时销毁。
⑵作用范围:整个JSP页面,是四大作用域中最小的一个。
⑶作用:获取其他八大隐式对象,可以认为是一个入口对象。
获取所有域中的数据。
跳转到其他资源。
PageContext本身是一个域(范围)对象,还能操作其他3个域对象中的属性
●页面范围:
void setAttribute(String name,Object value);
void removeAttribute(String name);
Object getAttribute(String name);
●操作其他域对象中的属性:
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(应用)
●在四个范围中依次查找指定名称对象的方法:
PAGE(页面)、REQUEST(请求)、SESSION(会话)和APPLICATION(应用)
Object findAttribute(String name);
⑷PageContext获取其他八个JSP隐含对象(自定义标签时用)
PageContext.getRequest();
getServletContext();
getServletConfig();
getException();
get等等....
⑸PageContext提供转发和包含的简易方法
request.getRequestDispatcher(“/10forward.jsp”).forward(request,respone);
等价于PageContext.forward(“/10forward.jsp”);
或者
pageContext.include(String url);
2、ServletRequest:请求范围。不同的资源,只有用转发。
⑴生命周期:在Service方法调用前由服务器创建,传入service发那个发。整个请求结束,request生命结束。
⑵作用范围:整个请求链(请求转发也存在)(一次请求)
⑶作用:在整个请求链中共享数据,经常用到:在servlet中处理好的数据交给JSP显示,此时参数就可以放在Request域中。
3、HttpSession:会话范围。多次请求共享数据,但不同的客户端不能共享。
⑴生命周期:在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭,没有到期的session也会跟着销毁。如果调用session提供的invalidate(),可以立即销毁session。
⑵作用范围:一次会话。
4、ServletContext:应用范围,最大。尽量少用,用时要做同步处理。
⑴生命周期:当WEB应用被加载进容器创建代表整个WEB应用的ServletContext对象,当服务器关闭或WEB应用被移除时,ServletContext对象跟着被销毁。
⑵作用范围:整个WEB应用。
⑶在不同Servlet之间转发、读取资源文件
十、JSP开发的最佳实践
Servlet:擅长写Java代码逻辑,不擅长输出html的内容。开发中作为:控制器。
JSP:不擅长写Java代码逻辑,擅长显示结果。开发中作为:视图(显示结果)