web核心(2)jsp
1.什么是jsp
Jsp的本质是servlet,当用户向servlet发送请求的时候 servlet利用输出流动态的生成html页面,包含每一个静态的html和所有在html页面出现的内容
2.jsp的三大指令
1)page 指令:<%@page 属性名1=“属性值1” 属性名2=“属性值2”...%> 用于定义JSP页面的各种属性,作用于整个JSP页面
错误页面的另一种方式是在相应的xml文件中配置
<%@ page errorPage="/error.jsp" %> <%--错误页面跳转 是一种转发--%>
<%@page import="java.util.Date"%> <%--导包--%>
<%--language="java"语言java contentType="text/html; charset=utf-8"指定当前 JSP 页面的响应类型 相当于response.setContentType("text/html; charset=UTF-8")--%>
<%--contentType="text/html;备注:text/plain:纯文本;text/html 纯文本的html application/x-msexcel execl表格 application/x-msword word文件--%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" %>
<%--session是否可用默认为可用--%>
<%@page session="true" %>
<%--指定当前 JSP 页面是否可以使用 EL 表达式. 通常取值为 false--%>
<%@page isELIgnored="true" %>
各属性的含义
Language:声明当前 jsp页面使用的脚本语言种类,因为页面是jsp,该属性的值通常是java,该属性的默认值也是java,所以通常无需设置
Extends:指定jsp页面编译所产的java类所继承的父类,或者所实现的接口
Import:导包,默认包会自动导入不需要显示导入,默认包有 java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*
Session:设定这个页面是否需要session
Buffer:指定缓冲区的大小 默认值为8kb,可以设置为none,或者自定义大小单位为kb
Autoflush:当输出缓冲区即将溢出时,是否需要强制的将缓冲区的内容输出,设置为true正常输出,设置为false,则会在buffer溢出时产生有个异常
Info:设置jsp程序的信息,可以通过servlet,getservketinfo()方法获取该值
Erropage:指定错误页面,当页面出现错误或者异常的时候,而该jsp没有对应的处理代码,那么就会自动的调用该属性所指定的jsp页面
Iserrorpage:设置该jsp页面是否为错误处理程序,如果该页面已是错误处理页面,那么无需指定errorpage属性
Contenttype:设置生成网页的文件格式和编码字符集 默认文件格式为text/html,默认的字符集为iso-8859-1
Pageencoding:指定生成页面的编码字符集 需要与Contenttype的charset一致
2)include指令 可以是jsp html 文本文件 一段java代码 一般包含不变的信息 且不能有同名方法和变量名
<%@include 属性名=“属性值”%><%--静态引入--%>
<%--静态引入,将引入合并到当前页面成一个jsp--%>
<%@ include file=path %>
3)taglib指令 引入jsp需要用到的标签库
<%@taglib 属性名=“属性值”%>:
3.jsp9大内置隐含对象
JSP的运行原理: JSP 本质上是一个 Servlet.
Jsp书写上:JSP文件是在HTML文件中添加了Java代码
jsp中的隐含变量:request, response, pageContext, session , application, config, out, page 这 8 个隐含对象. (实际上还可以使用一个叫 exception 的隐含对象)
request:相当于httpservletrequest
response:相当于httpservletresponse
pageContext:可以获得其余的隐含变量
session:相当于httpsession 在<%@ page session=true %>的时候会新建 在<%@ page session="false" %>不能新建,且只允许传入的方式
application:相当于servletcontext
config:相当于servletconfig
out:相当于response.getwrite 输出至页面
page:作用于当前页面
exception:只有指定了exception的iserrorpage=true才能使用,但是ie不支持
4.jsp4大作用域
pageContext:作用于当前页面
request:作用于同一请求
session:作用于一次对话,在没有设置时长的前提下
application:作用于当前web
5.jsp 13大内置标签中的常用的内置标签
1)jsp:incluce 标签: 动态映入,两个jsp页面通过方法引入
<jsp:include page=path></jsp:include>
2)jsp:forward:转发
<jsp:forward page=path></jsp:forward>
相等于request.getRequestDispatcher("/include/b.jsp").forward(request, response);
3)javabean
1><jsp:useBean id="名称" class="包名点类名 " scope="作用范围"> </jsp:useBean> 获取一个名为名称的对象
scope作用范围: page(当前页面) request(同一请求) session(一次会话) application(当前web)
相当于如下代码
Student student=(Student)request.getAttribute("student");
if(student1==null){
student=(Student)Class.forName(包名点类名).newInstance();
request.setAttribute("student", student);
}
2><jsp:setProperty property="属性名" value="属性值" name="相应usebean的id名"/>
设置属性值,javabean类需要遵循其自身规则
3><jsp:getProperty property="属性名" name=" 相应usebean的id名"></jsp:getProperty>
获取属性值,javabean类需要遵循其自身规则
4><jsp:param>
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>
设置传递的参数例如密码等
不能够单独的存在 用于传递信息 需要与jsp.include jsp:forword jsp:plugin结合使用,Jsp:plugin中很少使用 主要用于下载服务器端的javabean和applet到客户端执行
6.jsp<%-- --%>与<!-- -->的区别
<%-- --%>这页面源码中是不可见的 代码写在这个里面不会执行,在其中只能定义局部变量不能是成员变量,
<!-- -->在页面的源码中是可见的 写在这么里面会相应的执行
<%! 声明部分 %> 用于声明变量和方法,在外表看起来似乎不需要定义类就可以直接的定义方法,方法似乎可以脱离类独立存在,实际上,jsp声明将会转化成对应的servlet的成员变量或者成员方法,因此jsp声明依然符合java的语法,不能用abstract定义方法,否则会将jsp对应的servlet变为抽象类而无法实体化,可以定义为其他的类型
7.include的动态与静态加载
<%@ include file=path %>与<jsp:include page=path></jsp:include>的区别
<%@ include file=path %>: 静态引入,将引入合并到当前页面成一个jsp,
<jsp:include page=path></jsp:include>:动态映入,两个jsp页面通过方法引入
8.错误页面的引入方式
配置错误页面的方式
方式1:
<%@ page errorPage="/error.jsp" %> 发生错误时跳转
<%@ page isErrorPage="true"%>:是否可以用exception来捕获异常信息,不能用于ie
方式2
还可以在 web.xml 文件中配置错误页面: 这个是根据相应的错误代码编写的,在相应的httpservlet中不需要书写其余的东西,这样可以减少维护,优化代码,
<error-page>
<!-- 指定出错的代码: 404 没有指定的资源, 500 内部错误. -->
<error-code>404</error-code>
<!-- 指定响应页面的位置 至于是转发还是重定向,好像应该是转发,可以将错误页面放入web-inf中,假如能到那么就是转发,因为只能转发访问-->
<location>/WEB-INF/error.jsp</location>
</error-page>
<error-page>
<!-- 指定异常的类型 -->
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/WEB-INF/error.jsp</location>
</error-page>
9.el的11大隐含对象
pagescope对应el中 Page
requestscope对应el中Request
sessionscope对应el中的Session
applicationscope对应el中的Application
PageContext:表示jsp中的PageContext
Param:相当于request.Getparameter
paramValues:如同
cookie:相当于request.getcookies
initParam:相当于servletconfig.getInitparameter
header:如同request.getheader
headerValues: 如同request.getheaders
使用方式:
${sessionScope.user.sex}相当于User user = (User)session.getAttribute("user"); String sex = user.getSex( );
${sessionscope.username} 相当于object username=session.getattribute(“username”)
这里注意在属性名字有下滑线,点时等(非字母数字)需要用【】例如如下
${user["My_Name"] } , ${sessionScope["com.student"]}
注意上述属性需要遵循javabean规则
10.el的表达式
1)在1.2版本之前一律是string ,1.2之后假如是纯数字会相应的转化成数字
2)el中的运算符
向上转型
3)el的关系运算符
都是数字,按数字比较, 有string转化为string比较 string按自然顺序比较
4)el中的逻辑运算符
|| && !
5)其他运算符
Empty 判断是否为空 例如${empty requestScope.list} 返回boolean
${ A ? B : C}
6)el函数
6.1)需要导入的包
标准标签库:Jstl包和standard包
6.2)需要使用
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 引入包
6.33)使用方法如下:
${fn:length(param.name)}:获取长度
基本和string的方法类似
7)自定义el函数
tld配置文件 <?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <!--下面三行主要是描述信息不是很重要可以随便写--> <description>JSTL 1.1core library</description> <display-name>JSTL core</display-name> <tlib-version>1.1</tlib-version> <!--Prefix=“fn” 中的fn就是下面定义的内容--> <short-name>fn</short-name> <!--指定的uri 紧随prefix后面的--> <uri>http://java.sun.com/jsp/jstl/function1</uri> <function> <!--描述信息随便写--> <description> Tests if an input string contains the specified substring. </description> <!—函数使用的名称 就像${fn:length(param.name)}的length --> <name>contains</name> <!—支撑该函数的类 --> <function-class>包名点类名 </function-class> <!--string 返回的类型 concat静态方法,java.lang.String, java.lang.String参数类型(需要包名点类名) --> <function-signature>java.lang.String concat (java.lang.String, java.lang.String)</function-signature> </function> </taglib>
支撑类
package day01; public class demo{ public static Boolean contains(String str1,String str2){ return str1+str2 } }
11.jstl
1)导包
1>需要导包:同el
2>核心标签库引入如下,其他类似
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
2)核心库常用标签
1><c:out>输出内容,就像是 <%= scripting-language %>
例如: <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
【】表示可选,escapeXml表示是否实现符号转换,default表示当value为null时输出的默认值,value输出显示的值
2><c:set> 保存相应的属性
用法1:设置在相应的scope中默认为page,倘若scope为request那么相当于
<% requst.setattribute(“vername”,”value”)%> 具体写法如下
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
用法2:
Target需要为javabean(那么就类似jsp内置标签setproperty),或者map集合,按键值对保存
< c:set value="value" target="target" property="propertyName" />
其中var 和scope 这两个属性不能使用表达式来表示
3><c:remove> 移除属性
<c:remove var="varName" [scope="{ page|request|session|application }"] />
移除相应的属性,scope指定为request是类似于request.removeattribute(“name”)
4><c:catch> 捕获异常并且存储
<c:catch [var="varName"] >… 欲抓取错误的部分</c:catch>
将相应的信息捕获至var变量中,类似于set中的带主体的方式,但是多了捕获异常
5>流程
<c:if>
不带主体
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
Test:结果true/false var保存结果 scope作用范围 没有内容输出
带主体
<c:if test="testCondition" [var="varName"][scope="{page|request|session|application}"]>
具体内容</c:if>
当没有var时默认输出至页面相应的内容,有时则会保存,不会输出
<c:choose>
<c:choose>本体内容( <when> 和 <otherwise> )</c:choose>
其中when相当于elseif otherwise相当于switch中的default 用法如下
<c:choose>
<c:when test="${condition1}">condition1 为true</c:when>
<c:otherwise>condition1 和condition2 都为false</c:otherwise>
</c:choose>
6><c:forEach> 循环遍历
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"]
[end="end"] [step="step"]>
var 用来存放现在指到的成员
items 被迭代的集合对象
varStatus 用来存放现在指到的相关成员信息
begin 开始的位置
end 结束的位置
step 每次迭代的间隔数
varStatus 不能同begin end 和step 一起使用 旗下的属性有如下
index number 现在指到成员的索引
count number 总共指到成员的总数
first boolean 现在指到的成员是否为第一个成员
last boolean 现在指到的成员是否为最后一个成员
<c:forEach items="${requestScope.custMap}" var="cust1" varStatus="stus">
${stus.index}, ${stus.count}, ${stus.first}, ${stus.last}: ${cust1.value.id }: ${cust1.value.name }<br>
</c:forEach>
默认的是pagescope ,上面的${stus.index}实际上是${pagescope.stus.index}的简写
7><c:forTokens> 类似于StringTokenizer类
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
var 用来存放现在指到的成员
items 被迭代的字符串
delims 定义用来分割字符串的字符
varStatus 用来存放现在指到的相关成员信息
begin 开始的位置
end 结束的位置
8><c:import> 载入页面
<c:import url="url" [context="context"] [var="varName"]
[scope="{page|request|session|application}"] [charEncoding="charEncoding"]>
url 文件被包含的地址
context相同Container 下,其他web站台必须以“/”开头 一般不写直接都写在url中
var 储存被包含的文件的内容(以String类型存入)
scope var 变量的JSP 范围
charEncoding 被包含文件之内容的编码格式
varReader 储存被包含的文件的内容(以Reader类型存入)
9><c:url> 重写 禁用session后数据的导入
<c:url value="value" [context="context"] [var="varName"]
[scope="{page|request|session|application}"] />
value 执行的URL
context 相同容器下,其他web 必须以“/”开头 一般不写直接都写在value中
var 储存被包含文件的内容(以String 类型存入)
scope var 变量的JSP 范围
<c:url value="http://www.javafan.net " ><c:param name="param" value="value"/>
</c:url>
相当于<%=response.encodeURL("test1.jsp")%>
10><c:redirect> 重定向
<c:redirect url="url" [context="context"] > <c:param> </c:redirect >
url:地址
context:相同容器下,其他web 必须以“/”开头 一般不写这个都写在url中
<c:param>:参数 jsp隐含标签
<c:redirect url="/test.jsp"/>
11>自定义jstl函数
1)非嵌套
配置文件
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <!--下面三行主要是描述信息不是很重要可以随便写--> <description>JSTL 1.1 core library</description> <display-name>JSTL core</display-name> <tlib-version>1.1</tlib-version> <!--Prefix=“c” 中的fn就是下面定义的内容--> <short-name>c</short-name> <!--指定的uri 紧随prefix后面的--> <uri>http://java.sun.com/jsp/jstl/core1</uri> <tag> <!--标签的名字:在jsp页面上使用时的名称 例如foreach 调用的名字--> <name>hello</name> <!--标签的支撑的全类名 调用的类--> <tag-class>包名点类名</tag-class> <!-- 标签体的类型 共三种 empty 标签体为空 scriptless:代表了可以有标签体 ,可以是EL、JSTL等,但是不能有 java表达式 tagdependent:jsp引擎对标签不做任何处理而且把最原始的标签体内容传递给 标签处理器类 这个基本不用--> <body-content>empty</body-content> <!-- 描述当前标签的属性 --> <attribute> <!-- 属性名 --> <name>count</name> <!-- 该属性名是否必须 --> <required>true</required> <!--运行时是否可以动态的接受表达式的值--> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
支撑类需实现simpletag接口,通常继承的方式继承实现simpletag接口的simpletagsupport类(原由:simpletagsupport类只需要重写dotag方法就好了,其他的方法已被写好,简洁方便)
public class HelloSimpleTag1 extends SimpleTagSupport{ private String count; //count需要与相应的<name>一致 public void setCount(String count) { this.count = count; //需要遵循setter方式 } @Override public void doTag() throws JspException, IOException { System.out.println(count); } }
使用:
<c:hello count="10"/>
2)嵌套
1>父子标签的定义
同上普通标签
2>支撑类
父类 public class ParentTag extends SimpleTagSupport{ private String name="name"; public String getName() { return name; } @Override public void doTag() throws JspException, IOException { getJspBody().invoke(null); } } 子类 public class SonTag extends SimpleTagSupport{ @Override public void doTag() throws JspException, IOException { String name=((ParentTag)getParent()).getName(); getJspContext().getOut().println(name); } }
3>jsp中的使用
<c:parent>
<c:son></c:son>
</c:parent>