一.JSP基础
1.JSP(Java Server Pages)
2.<% %>内可以嵌入任何合法的JAVA程序,包括Swing的GUI程序。
3.程序操作都在服务器端执行,网上传给客户端的仅仅是结果。
4.用JAVA循环语句来循环HTML语句
<% for(int i=0;i2;i++)
{
%>
你好<br>
<%
}
%>
5.JSP最终都会转化成Servlet去执行。
6.JSP原始代码中包含了JSP元素和Templatedata两类,后者指的是JSP引擎不处理的部分,即标记<%%>以外的部分,前者则必须符合JAVA语法要求,否则会报错。
7.JSP 执行过程如下:
二.JSP语法
1.JSP语法分为三种不同的类型
-编译器指令 <%@ ... %>
-脚本语法 <% ... %>中间是java代码
-动作语法 <jsp: ...>
2.脚本语法包括
-“HTML注释”:<!--...-->
-“隐藏注释”:<%--...--%> (jsp注释,不会发送给客户端)
-“声明”
-“表达式”
-“脚本段”
3.在HTML注释中嵌入<%%>会在HTML源代码中执行,然后将结果作为HTML注释一起发送给客户端。
4.编辑器指令中的几个属性:
<%@ page language="java"(编码语言,目前只有JAVA) import="java.util.*"(引入的JAVA类包,用','隔开) pageEncoding="UTF-8"%(编码格式)>
5.JSP声明语句
<%! int a=3; %> 转换为servlet之后a为成员变量
6.声明与脚本段的区别
<% int b=3; %> 转化为servlet之后b为方法内部的局部变量
<%= 表达式 %> 输出语句
7.包含指令(编译器指令之一):
include指令:向当前页中插入一个静态文件的内容。
jsp语法格式如下:
<%@ include file="relativeURL"%> 或
<%@ include file="相对位置"%>
页面的重复使用,提高代码复用率
include在插入的时候插入的是执行结果,查看源代码看起来则像是固定死的。
8.Page指令:
<%@ page language="java" import="{package.class|package.*} , " pageEncoding ="UTF-8"....> 其他属性基本用不上,暂不了解
9.<@ import "...">
需要导入的java包的列表,这些包作用于程序段,表达式,以及声明。下面的包在JSP编译的时候就已经导入了,所以就不需要再指明了:
java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*
10.page指令在一个页面中可以用多个,但其中除了import属性其他都只能在页面中用一次。
11.<jsp:forward page="--路径--"> 转向目标页面,后续代码不能继续进行
<jsp:paramname="参数名",value="参数值"> 可以带上一些参数,传入转向页面
</jsp:forword>
12.<jsp:include page="---路径--"> 插入目标页面
<jsp:paramname="参数名",value="参数值"> 可以带上一些参数,传入插入页面
</jsp:include>
三.JSP内置对象
1.jsp内置对象一览:
-request,请求对象---------------------重点
-response,响应对象
-pageContext,页面上下文对象
-session,回话对象---------------------重点
-application,应用程序对象-------------重点
-out,输出对象
-config,配置对象
-page,页面对象
-exception,异常对象
2.request对象中使用较多的是getParameter()getParameterName()getParameterValues()三个方法。
request.setAttribute(String,Object); 将servlet属性绑定与Sring上.....
request.getAttribute(String);
3.Session用来保存客户端状态信息
session.setAttribute(String,Object); 将Object绑定到String所表示的字符串上.并存储一定周期.
session.getAttribute(String); 将返回一个String字符串所绑定的Object对象.
4.request的信息存储周期只有一次请求,当请求一次后再发起一次请求时,第一次请求的信息将不再存在。即客户端向服务器端发送一个请求,服务器端向客户端返回一个响应后,请求对象即被销毁。
5.request的getAttribute和setAttribute一般是成对出现的,两个方法均在服务器端执行,用户端并不知道服务器调用了此方法。
6.reuqest的getParameter方法的作用是获取到客户端,通过表单或者url请求参数所发送过来的数据,服务器端需要获取客户端发过来的消息就需要使用此方法。
7.session对象内数据的存活范围就是session对象的存活范围,(目前可以任务只要浏览器窗口不关闭,session对象就会一直存在)无论向服务器端发送多少个请求session对象只有一个。
8.application(应用对象):存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在。在整个服务器运行的过程中,application对象就只有一个,它会被所有的用户所共享。
9.getAttribute和getParameter区别在与前者可以处理各种批量信息,即使使用getParameterValue实用性也不如getAttribute.
10.application的一些其他方法:getServerInfo()返回当前服务器(servlet容器)的信息和版本号,getResource(String)string必须用'/'开头,返回String所表示文件的URI。
11.application中的getRealPath(String)返回字符串所代表的文件名或者路径的绝对路径。
12.在实际web开发中除了保存用户登录信息时使用session,其他情况,尽量减少使用session进行传递数据,尽量使用html里form中的hidden隐藏域进行传递,使用例子如下:
<input type="hidden"name="username" value="<%= username>">
13.HttpServletResponse对象的sendRedirect(String location)方法称作重定向。如果location地址前面加上“/”,则表示相对于Servlet容器的根来请求,即http://localhost:8080,如果location地址前没有加上“/”,则表示相对于当前请求URI来寻址。
14.RequestDispatcher的forward(request,response)称作请求转发。
15.请求转发与重定向的区别(重要):
-请求转发,整个过程处于同一个请求中。
-重定向,服务器端在执行到sendRedirect()的时候就会返回一个响应,通知客户端去访问参数中的页面,服务器端收到响应再次发出一个请求去访问参数中的页面,此过程中使用了2次请求。
-请求转发,RequestDispatcher是通过调用HttpServletRequest对象getRequestDispatcher()方法得到的,是属于请求对象的方法。
-重定向,sendRedirect()是HttpServletResponse对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。
16.(问题)setAttribute后用getAttribute得到后再显示在页面上时中文会出现乱码
答:客户端向服务器端传送数据时的编码格式是iso-8859-1,而jsp则设置为utf-8格式,所以在输入中文时结果显示会出现中文乱码。
-解决方法:
修改成统一的编码格式:
xxx = newString(xxx.getBytes("iso-8859-1"),"utf-8");
四.表单的确认(客户端确认)JS了解
1.java script 最基本介绍,用于客户端处理信息,给出示例如下,通常放在head中:
- <script type="text/javascript">
- function validate() {
- //var username =document.getElementById("un");
- //var password =document.getElementById("pw");
- //var repassword =document.getElementById("rpw");
- var username=document.getElementsByName("username")[0];
- var password=document.getElementsByName("password")[0];
- var repassword=document.getElementsByName("repassword")[0];
- if(username.value.length==0) {
- alert("usernamecan't be blank!");
- return false;
- }
- if(password.value.length<6||password.value.length>10){
- alert("length ofpassword is invalid!");
- return false;
- }
- if(repassword.value.length<6||repassword.value.length>10){
- alert("length ofrepassword is invalid!");
- return false;
- }
- if(password.value!=repassword.value){
- alert("password notthe same!");
- return false;
- }
- return true;
- }
- </script>
注:方法类型和变量类型都只有一种分别是function和var,js方法是基于事件响应的,所以必须在控件上进行事件注册,即添加属性onclick="函数名" onsubmit="return 函数名"等。
五.JavaBean
1.JavaBean是一种可重复使用,且跨平台的软件组件。JavaBean可分为两种:一种是有用户界面(UI,User,Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种的JavaBean。
2.jsp与javabean搭配使用的优点:
-使得html与java程序分离,这样便于维护代码。如果把所有的程序代码都写到jsp网页中,会使得代码繁杂,难以维护
-jsp侧重于生成动态网页,事务处理有javabean来完成,这样可以充分利用javabean组件的可重用性特点,提高开发网站的效率。
3.一个标准的JavaBean有以下几个特性:
-JavaBean是一个public类
-JavaBean有一个不带参数的构造方法
-JavaBean通过setXXX方法设置属性,用getXXX方法获取属性
4.导入JavaBean
通过<%@ pageimport="com.xxx.XXXBean" %>指令导入JavaBean类
5.声明JavaBean对象
-<jsp:useBean> 标签用来声明JavaBean对象,例如:
<jsp:useBean id="myBean"class="mypack.CounterBean" scope="session"/>
6.访问javaBean属性
jsp提供了访问JavaBean属性的标签
-如果要将JavaBean的某个属性输出到网页上,可以用<jsp:getProperty>标签,例如:
<jsp:getProperty name="myBean"property="count"/>
-如果要将JavaBean的某个属性赋值,可以用<jsp:setProperty>标签,例如:
<jsp:setProperty name="myBean"property="count" value="0"/>
7.JavaBean中属性一般用private,使用get,set进行操作即可
8.<jsp:setPropoerty>标签中param属性(获取客户端传过来的动态参数)与value不能同时使用,会产生冲突。
9.JavaBean的范围
.scope属性决定了JavaBean对象存在的范围。scope的可选值包括:
-page(默认值)页面没了就没了,最小
-request
-session
-application
10.JavaBean设置为request范围的时候,如果用forward跳转页面,可以用getAttribute获取对象,参数为JavaBean声明时候的ID值。
六.自定义标签库
1.创建客户化jsp标签的步骤
-创建标签的处理类
-创建标签库描述文件
-在jsp文件中引入标签库,然后插入标签,例如:<mm:hello/>
2.Servlet容器编译jsp网页时,如果遇到自定义标签,就会调用这个标签的处理类。标签处理类必须扩展以下两个类之一:
-javax.servlet.tagext.TagSupport
-javax.servlet.jsp.tagext.BodyTagSupport
3.TagSupport类的主要方法:
-doStartTag()方法:
Servlet容器遇到自定义标签的起始标志时调用该方法
-doEndTag()方法:
Servlet容器遇到自定义标签的结束标志时调用该方法
-setValue(String k,Object o):
在标签处理类中根据参数key返回匹配的value
-getValue(String k):
在标签处理类中根据参数key返回匹配的value
-removeValue(String k):
在标签处理类中删除key/value
-setPageContext(PageContext pc)
设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
-setParent(Tag t)
设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用oStartTag或doEndTag方法前调用
-getParent()
返回嵌套了当前标签得到上层标签的处理类
4.TagSupport类的两个重要属性
-jsp容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent
-在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。
5.PageContext类提供了保存和访问Web应用的共享数据的方法:
-public void setAttribute(Stringname,Object value,int scope)
-public Object getAttribute(String name,int scope)
其中scope参数的可选值有:
-pageContext.PAGE_SCOPE
-pageContext.REQUEST_SCOPE
-pageContext.SESSION_SCOPE
-pageContext.APPLICATION_SCOPE
6.doStartTag()方法
.当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
.doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:
-Tag.SKIP_BODY 表示标签之间的内容被忽略。
-Tag.EVAL_BODY_INCLUDE 表示标签之间的内容被正常执行。
7.doEndTag()方法
.当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
.doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:
-Tag.SKIP_PAGE 表示立刻停止执行jsp网页,网页上未处理的静态内容和jsp程序均被忽略,任何已有的输出内容like返回到客户的浏览器上。
-Tag.EVAL_PAGE 表示按正常的流程继续执行jsp网页。
8.在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
9.标签库描述文件的后缀名是:.tld
实质上就是一个标准的xml文件,必须存在于web.xml相同的目录中。
七.EL
1.EL(Expression Language 表达式语言)用于简化jsp页面,尽量减少java代码,基本语法如下:
- ${表达式}
<%=request.getParameter("username")%>等同于${param.username}
- \${表达式}则表示转义,在页面上显示整个表达式
2.EL默认对象
-pageContext 相当于PageContext对象(用的少)
-pageScope 包含了page范围内的属性和值
-requestScope 包含了reuqest范围内的属性和值
-sessionScope 包含了session范围内的属性和值
-applicationScope 包含了application范围内的属性和值
-param 相当于request.getparameter(xxx)
-paramValues 相当于request.getparameterValue(xxx)
-header 包含了头信息
-headerValues 同上
-cookie 包含了cookie内的属性和值
例如:
${paramValues.fruit[2]}等
3.EL支持运算符:{+,-,*,/,div,%,mod}
4.EL支持比较运算符和逻辑运算符:
{==(eq) ,!=(ne) ,<(lt) ,>(gt) ,<=(le) ,>=(ge) }
{&&(and),||(or),!(not)}
5.EL提供.和[]两种运算符来存取数据:
${sessionScope.user.sex}等于${session.Scope.user["sex"]}
也可以混合使用:
${sessionScope.shoppingCart[0].price}
6.当存取的属性名称中包含一些特殊字符,如.或-等飞字母或数字的符号,就一定要使用[],例如:
${user.My-Name}就不正确,只能写成:
${user["My-Name"]}
7.使用[]可以进行动态取值,如下:
${sessionScope.user[data]}
此时,data就是一个变量,如data值为"sex",则相当于:
${sessionScope.user.sex}
如data值为"name",则相当于
${sessionScope.user.name}
8.EL存取变量数据的方法很简单,例如:
${usernmae}.它的意思是去除某一范围中名称为username的变量。因为我们并没有制定哪一个范围的username,所以它的默认值会先从Page范围开始找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username就直接回传,不在继续找下去,但是假如全部的范围都没有找到就回传null