一、JSP简介
JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。JSP其实是一种特殊的Servlet,当jsp页面第一次被访问时,服务器会把jsp编译成java文件。
二、JSP页面组成
静态内容 | HTML静态文本 |
指令 | 以“<%@”开始,以"%>"结束。 比如:<%@include file="Filename" %> |
动作标签 | 以"<jsp:action_name>"以“</jsp:action_name>”结束 比如:<jsp:include page=""></jsp:include> |
表达式 | <%=Java表达式> |
小脚本 | <%Java代码%> |
声明 | <%!方法%> |
注释 | <!--这是HTML注释,但客户端可以查看到--> <%--这也是注释,但客户端查不到--%> |
三、三大指令
1、page:说明jsp的页面情况
<%@ page language=”java” import=”java.util.*,java.text.*” contentType=”text/html; charset=GBK” %>
language=”java”:使用那种语言,目前只支持JAVA。
import=””:相当于导包。
contentType=””:内容类型,是一种什么页面,HTML页面。
charset=GBK:编码类型。
pageEncoding=”GBK” 与 charset=”GBK” 的编码要一致。
UTF-8编码支持多国语言。
支持中文的的编码:GBK、GB2312、GB18030。
JSP默认编码:ISO-8859-1
JAVA默认编码:unicode
2、include:包含一个页面
3、taglib:引入标签库文件
<%@taglib prefix=”s” uri=”/struts-tags”%> 前缀的用法<s:text>
prefix:指定标签库在本页面中的前缀!由我们自己来起名称!
uri: 指定标签库的位置!
四、九大内置对象
对象名
|
类型
|
说明
|
request
|
javax.servlet.http.HttpServletRequest
| |
response
|
javax.servlet.http.HttpServletResponse
| |
session
|
javax.servlet.http.HttpSession
|
由session="true"开关
|
application
|
javax.servlet.ServletContext
| |
exception
|
java.lang.Throwable
|
由isErrorPage="false"开关
|
page
|
java.lang.Object当前对象this
|
当前servlet实例
|
config
|
javax.servlet.ServletConfig
| |
out
|
javax.servlet.jsp.JspWriter
|
字符输出流,相当于 printWriter对象
|
pageContext
|
javax.servlet.jsp.PageContext
|
request:获取页面传来的参数信息
response:获取页面传来的参数后,后台做出相应,返回给客户端数据
session:每个客户打开一个浏览器,就会创建一个会话,并直到页面关闭是一个完整的会话
application :服务器启动就建立了一个application对象,一个服务器所有的客户都是同一个application对象.
out:是一个输出流,用来向客户端输出数据,可以是任何形式的,类似java后台代码的system.out.println(),可以直接打印输出语句.
page:是当前页面转换成servlet类的实例,多用在后台代码中
config:jsp的配置信息,多用在servlet类实例中
exception:页面处理过程中的报错信息
pagecontext:是上下文属性对象,即获取当前页面的属性,通过此对象可以获得其他八大对象
五、动作标签
动作标签是由tomcat(服务器)来解释执行!而html标签由浏览器来执行!
<jsp:include>
例如:<jsp:include page="xxx"/>
,用来包含指定的页面。假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。
- 注意:
<jsp:include page="<%=myfile%>">
,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。 - 该标签内部使用的是RequestDispatcher#include()方法完成的包含
- 注意:
<jsp:forward>
例如:<jsp:forward page="xxx"/>,
用来转发到指定页面
例如在a.jsp中存在如下内容:<jsp:fowrad page="b.jsp"/>
a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad>
标签下面的内容不会被执行。<jsp:param>
该标签是和的子标签,用来向其他页面传递参数。
六、EL表达式
${p
ageScope.xxx}、
${r
equestScope.xxx}、
${s
essionScope.xxx}、
${a
pplicationScope.xxx}
七、JSTL标签库
- JSTL是apache对EL表达式的扩展
- core:核心标签库,
- fmt:格式化标签库
- sql:数据库标签库,过时;
- xml:xml标签库,过时。
<c:core>
<c:out v
alue=”aaa”/> 输出字符串aaa<c:out value="${a
aa}”/> 输出域属性aaa,其中与${aaa}相同<c:out value="${aa
a}” default=”xxx”/>如果${aaa}不存在,那么输出xxx字符串- <
c:out value="${aaa}"
escapeXml=”true”/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击
<c:set>
<c:set
var=”a” value=”hello”/> 创建名为a,值为hello的域属性,范围:page<c:set
var=”a” value=”hello” scope=”session”/> 范围为session(page、request、session、application)
<C:remove>
<c:remove
var=”a”/> 删除名为a的域属性<c:remove
var=”a” scope=”page”/> 删除page域中名为a的域属性
<C:url>
<c:url v
alue=”/AServlet”/> 输出URL:/项目名/AServlet<c:url
value=”/AServlet” var=”url” scope=”page”/> 把生成的url保存到page域中,而不会输出- 子标签:
<c:param>,
用来给url后面添加参数,例如:
<c:url value="/index.jsp">
<c:param name="username" value="张三"/> <!--可以对参数进行url编码!!-->
</c:url>
- 1
- 2
- 3
结果为:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F
* var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成url保存到域中。
* scope:它与var一起使用,用来保存url。
<C:if>
*
<c:if
test=”${条件}”> 当条件为true时执行标签体内容
hello
<c:choose>
<c:set var="score" value="${param.score }"/>
<c:choose>
<c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>[if]
<c:when test="${score >= 90 }">A级</c:when>
<c:when test="${score >= 80 }">B级</c:when>
<c:when test="${score >= 70 }">C级</c:when>
<c:when test="${score >= 60 }">D级</c:when>
<c:otherwise>E级</c:otherwise>[else]
</c:choose>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
<c:forEach>
<c:forEach var="i" begin="1" end="10">
${i}
</c:forEach>
- 1
- 2
- 3
属性:
* var:循环变量
* begin:设置循环变量从几开始。
* end:设置循环变量到几结束。
* step:设置步长!等同与java中的i++,或i+=2。step默认为1
- 遍历集合或数组方式:
<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
<c:out value="name: ${item }"/><br/>
</c:forEach>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 遍历List
<%
List<String> names = new ArrayList<String>();
names.add("zhangSan");
names.add("liSi");
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
<c:out value="name: ${item }"/><br/>
</c:forEach>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 遍历Map
<%
Map<String,String> stu = new LinkedHashMap<String,String>();
stu.put("number", "N_1001");
stu.put("name", "zhangSan");
pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item" items="${stu }">
<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 循环状态
循环状态变量有如下属性:
* count:循环元素的个数
* index:循环元素的下标
* first:是否为第一个元素
* last:是否为最后一个元素
* current:当前元素
<c:forEach items="${list }" var="ele" varStatus="vs">
${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/>
</c:forEach>
- 1
- 2
- 3
fmt库
<fmt:formatDate
value=”” pattern=”“>
value:指定一个Date类型的变量
pattern:用来指定输出的模板!例如:yyyy-MM-dd HH:mm:ss<fmt:formatNumber
value=”${num1}” pattern=”0.00”>
保留小数点后2位,它会四舍五入!如果不足2位,以0补位!<fmt:formatNumber
value=”${num1}” pattern=”#.##”>
保留小数点后2位,它会四舍五入!如果不足2位,不补位!
八、自定义标签
步骤:
1. 标签处理类:继承SimpleTagSupport类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().write(“<p>Hello SimpleTag!</p>
“) ;
}
}标签描述符文件(tld)
/WEB-INF/tlds/haha.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>1.0</tlib-version>
<short-name>haha</short-name>
<uri>http://www.haha.cn/tags</uri>
<tag>
<name>hello</name> <!--标签名称-->
<tag-class>cn.haha.tag.HelloTag</tag-class> <!--标签处理类名称-->
<body-content>empty</body-content> <!--标签体为空,即空标签-->
</tag>
</taglib>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- jsp页面中使用自定义标签
<%@ taglib prefix="it" uri="/WEB-INF/hello.tld" %>
......
<it:hello/>
- 1
- 2
- 3
有标签体的标签
标签处理类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
PageContext pc = (PageContext) this.getJspContext();
HttpServletRequest req = (HttpServletRequest) pc.getRequest();
String s = req.getParameter(“exec”);
if(s != null && s.endsWith(“true”)) {
// 获取标签体对象
JspFragment body = this.getJspBody() ;
// 执行标签体
body.invoke (null);
}}
}tld
<tag>
<name>hello</name>
<tag-class>cn.itcast.tags.HelloTag</tag-class>
<body-content>scriptless</body-content> <!--标签体内容不可以是java脚本,但可以是el、jstl等-->
</tag>
- 1
- 2
- 3
- 4
- 5
不执行标签下面的页面内容
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().print("<h1>只能看到我!</h1>");
throw new SkipPageException();
}
带有属性的标签
public class IfTag extends SimpleTagSupport {
private boolean test;//设置属性,提供getter/setter方法
public boolean isTest() {
return test;
}
public void setTest (boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {//如果test为true,执行标签体内容
this.getJspBody().invoke(null);
}
}
}
<tag>
<name>if</name>
<tag-class>cn.haha.tag.IfTag</tag-class>
<body-content>scriptless</body-content>
<!--部署属性-->
<attribute>
<name>test</name> <!--属性名-->
<required>true</required> <!--属性是否为必须的-->
<rtexprvalue>true</rtexprvalue> <!--属性值是否可以为EL或JSTL等-->
</attribute>
</tag>