一.JSP语法
JSP实际上就是Servlet。
学习JSP的最好办法:大脑中时刻想着Servlet。
1.1模板元素:指JSP中的html
1.2表达式:
作用:向页面输出运算结果。
语法:<%=表达式%>
实际上就是service中调用out.println(表达式);,因此表示式中绝对不允许有;号
1.3Java脚本片段(实际开发中在JSP中是不允许有java脚本的。自定义标签来代替)
出现在JSP中的java代码。
作用:组织逻辑
语法:<%语句1;
语句2;%>
实际上会原封不动的被翻译到jsp对应serlvet的service方法中。
1.4JSP声明:
作用:定义成员变量或方法
语法:<%!
语句;
%>
注意:声明中不能使用九大隐示对象 out等。因此这些隐士对象都是定义在service方法中的局部变量呢
1.5JSP注释
作用:注释
语法:<%--这是注释--%>
JSP中尽量使用JSP注释,不要使用HTML注释。
二.JSP的指令
作用:为JSP引擎(Tomcat)而设计的
语法:<% @指令名称属性1="value1"....%>
Tip:指令是服务整个JSP的,出现在JSP的位置无关。但是一般把指令放在页面的最前端。
2.1:page
属性:
language:指定JSP中使用的脚本语言。默认是java,目前只支持java
extends:指定JSP对应的Servlet的父类。不要改改属性。
*import:导入JSP中需要的包或类。
可以import="java.util.UUID,java.util.Date"
或者写到多个page指令中
<%@pageimport="java.util.UUID"%>
<%@pageimport="java.util.Date"%>
JSP引擎会自动导入以下包:
javax.servlet.*;
javax.servlet.http.*;
javax.servlet.jsp.*;
*session:指定是否生成HttpSession对象。默认值是true。
buffer:输出流的缓存大小。none|8kb|sizeKb.默认值是8kb。
autoFlush:指定缓存满了是否自动刷新。默认值是true
isThreadSafe:是不是线程安全。true|false。默认值是true。
true:不安全的。
实际上是指定该JSP对应的Servlet是否实现SingelThreadModel接口。
*errorPage:指定当前页面出错后的显示页面。如果以"/"开头,表示绝对路径。
配置全局消息提示页面:
web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
*contentType:与response.setContentType方法起到的作用是一致的。
*pageEncoding:告知jsp引擎,jsp文件的编码方式及和上面的作用。
作用有两个:1告诉jsp引擎,jsp文件的编码方式。
2.还有response. setContentType方法的作用。
*isELIgnored:是否忽略EL表达式。True|false,默认为false。
2.2tablib指令:用于引入外部的标签库:
属性:有uri指命名空间 与 prefix:前缀。比如:
<%@tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c"%>
三.包含:两种动态包含与静态包含
3.1 静态包含用<%include file=”url” %>:url以”/”开头表示绝对路径。静态包含的原理是指:将另一url的file文件内容全部编译到本jsp文件中。比如1.jsp用了<%include file=”2.jsp”%>代表,只生成一个jsp.java文件,就是_1_jsp.java文件,此java文件中主体内容是1.jsp,但是在使用include指令处将2.jsp内容全部编译进_1_jsp.java中。所以,静态包含在效率上会比动态要高点。
3.2 动态包含用<jsp:include page=”url” />动作元素,动态包含的原理是在运行时再将内容包含进去。比如1.jsp中使用<jsp:include page=”2.jsp”/>那么,1.jsp与2.jsp都会编译出来分别编译成_1_jsp.java与_2_jsp.java并生成_1_jsp.class与_2_jsp.class。
四.Jsp的动作元素
主要有jsp:include、jsp:forward与jsp:param,include与forward与servlet中的RequestDispatcher原理是一致的,只不是jsp中是用封了的对象pageContext的forward方法…。而jsp:param一般用在jsp:include与jsp:forward体中,用与发送一些请求参数(类似username=admin&id=2)给被转发的或被包含的组件中去。
五.JSP的9大隐示对象
request、response、session(由page指令的session=”true”控制,默认是true)、application(servletContext的封装)、config(ServletConfig的封装)、page(页面对象自身this)、exception(page指令的isErrorPage=”true”控制,默认为false)、out(JspWriter)、pageContext。
5.1 out对象:1>是JspWriter类型,内部有缓存,缓存大小为8k(由page的buffer来定)。默认8k后,将会刷到response的缓存中(由page的autoFlush来定)。2>jsp中不合适用字节流(因为response的字节流outputStream与字符流writer有冲突)。
5.2 PageContext 作用:。1>能获取其它8大jsp隐式对象,如pageContext.getRequest…2>本身是一个域对象,但scope是页面有效且提供了操作其它域对象的方法如setAttribute(name,obj,scop)这上scope就是PageContext.REQUEST_SCOPE等常量。另一个重要方法:findAttribute(name),将依次从page、request、session、application域对象中找name的key。3>提供像include与forward的方法。
注意:四大域对象的作用范围:pageCotext是当面页面,request是一次请求中(当然包含forward与incldue)、session一次会话范围、application是整个活着的应用。
六.JavaBean的概念:
在javaweb中,通常将javabean对象作为了个值对象VO传递在各层作为数据传输用。而标准的javabean有以下的特点:
1>类有默认的构造方法2>字段都是私有的 3>提供有公有的setter与getter方法
4>一般情况下都实现了Serializable接口。
七.JSP中使用JavaBean的动作元素:
Jsp:userBean
从PageContext.getAttribute("s", PageContext.PAGE_SCOPE);即是从paga的scop中找此对象引用名(key)s,若没有将创建一个对象并存放在Page_Scope中去。有以下属性:
Id:必须有,引用javabean对象的名称。
Class:javabean的类型。
Scope:域范围。page(默认的)|request|session|application
Jsp:getProperty:获取javabean中某个属性的值到页面中去。有以下的属性:
Name:对象的引用名。
Property:属性的值
<jsp:getProperty property="name"name="s"/>:相当于调用s.getName()
Jsp:setProperty:完成类型的自动转换,仅限基本数据类型。
name:象的引用名。 property:属性名称。使用通配符*,使用前提请求参数名与javabean中的写属性一致。
value:设置的值
<jsp:setPropertyproperty="name" name="s" value="abc"/>:相当于调用s.setName("abc");
param:请求参数名,可以将param请求名的值设置到javabean中去。
八.设计模式:SUN推出了两个设计模式:模型1(JSP+JavaBean)与模型2(MVC)。M为Model模型、V为View表现层、C为Controller控制器