一 Jsp基础
Jsp的作用:用html语言中混合java语言开发动态资源的技术。
Jsp的特点:jsp页面既可以写html代码,也可以写java代码。jsp就是servlet。
jsp的生命周期:
- 翻译:jsp->java文件
- 编译:java文件->class文件(servlet)
- 走servlet的生命周期方法
1.1 jsp的语法:
1.jsp表达式
//语法:<%=变量或表达式%>
//作用:向浏览器输出变量的值或表达式计算的结果。
//示例
<%
String name = "eric";//变量
int a = 10;
int b =20;
%>
<%=name%>
<%=(a+b)%>
2.jsp脚本
//语法:<% java代码 %>
//作用:执行java代码
//示例
<%
//生成随机数
Random ran = new Random();
float num = ran.nextFloat();
%>
3.jsp声明
//语法:<%!变量或方法%>
//作用:声明jsp的变量或方法
//示例
<%!
//变量
String name = "lucy";
//方法
public String getName()
{
return name;
}
%>
4 jsp的注释
//语法
<%----------%>
1.2 jsp指令
1 include 指令
//作用:在当前jsp页面包含其他页面
//语法:<%@include file="文件路径"%>
//示例
<%@include file="common/header.jsp"%>
//注意:被包含的页面(header.jsp)中不要出现全局的html标签(只需要<body>标签里面的内容其他与html相关的都删掉)
2 page指令
//作用:告诉tomcat以什么样的方式翻译jsp
<%@ page language = "java" ---告诉服务器用什么语言翻译jsp
import ="java.util.*" ----导java包多个包之间用逗号分隔
pageEncoding="utf-8" ----告诉服务器用什么编码翻译jsp文件
contentType = "text/html;charset=utf-8"---服务器发送给浏览器的数据格式和内容编码
errorPage = "error.jsp"---指定出错时显示的界面
isErrorPage = "false"----是否是出错界面
isELIgnored="false"---jsp页面支持EL,不写默认不支持EL
%>
1.3内置对象
jsp页面加载完成之后就创建好的对象,就叫内置对象。
9大内置对象
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
pageContext内置对象:
作用:可以通过pageContext获取其他八大内置对象。
pageContext也是一个域对象—-作用范围在同一个jsp页面内
二 EL
2.1 EL表达式
作用:向浏览器输出在域对象中的变量值或表达式计算的结果,替换掉jsp表达式。
语法:${变量或表达式}
输出对象
<%
Student stu = new Student("jack",20);
pageContext.setAttribute("student",stu);
%>
//输出
${student.name}
输出集合对象
<%
ArrayList list = new ArrayList();
Student stu1 = new Student("jack",22);
list.add(stu1);
Student stu2 = new Student("eric",24);
list.add(stu2);
Student stu3 = new Student("andy",25);
list.add(stu3);
pageContext.setAttribute("studentlist",list);
%>
//取出
${studentlist[0].name}
三 jsp标签
作用:替换jsp脚本
3.1 内置标签:不需要再jsp页面导入标签
<jsp:forward page="/action.jsp">
<jsp:param value="jack" name="name"/>//参数标签
</jsp:forward>//转发标签
<jsp:include page="/header.jsp"><jsp:include>//包含
3.2 jstl标签:需要在jsp页面中导入标签
使用步骤:
- 导入标签库(使用javaee5.0以上的项目自动导入了jstl支持jar包,不需要手动导入)
- 使用taglib指令导入标签库(<%@taglib uri=”tld文件的uri名称” prefix=”简写” %>)
- 在jsp中使用标签
核心标签库的taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
常用标签:
//保存数据
<c:set></c:set>
//获取数据
<c:out value=""></c:out>
//单条件判断
<c:if test=""></c:if>
//多条件判断
<c:choose ></c:choose>
<c:when test=""></c:when>
<c:otherwise ></c:otherwise>
//循环数据
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
//重定向
<c:redirect></c:redirect>
使用示例:
//数据默认保存在page域中
<c:set var = "count" value = "10"></c:set>
//从域中获取数据 当value=null时使用默认值
<c:out value="${name}" default="默认值"></c:out>
//单条件判断
<c:if test="${10>5}">
条件成立
</c:if>
//choose标签+when标签+otherwirse标签一起使用
<c:choose >
<c:when test="${count>5&&count<10}">---相当于if else
条件成立
</c:when>
<c:otherwise > ----相当于else
条件成立
</c:otherwise>
</c:choose>
//循环数据 begin:从哪个元素开始 end:到哪个元素结束 step:步长 items:需要遍历的数据 var:每个元素的名称
<c:forEach begin="0" end="2" step="1" items="${list}" var="stu" varStatus="varSta" >
序号:${varSta.count} 获取对象的属性值:${stu.name}
</c:forEach>
//循环特殊字符串<% pageContext.setAttribute("str","java-php-net")%>
<c:forTokens items="${str}" delims="-" var="s">
${s}
</c:forTokens>
//重定向
<c:redirect url="http://www.baidu.com"></c:redirect>
3.3 自定义标签:开发者自行定义,需要在jsp页面导入标签
自定义标签开发步骤:
1编写一个普通的java类(ShowIpTag),继承于SimpleTagSupport类。
public class ShowIpTag extends SimpleTagSupport{
/**
* 2)覆盖doTag方法
*/
@Override
public void doTag() throws JspException, IOException {
//this.getPageContext获取到pageContext对象
HttpServletRequest request = (HttpServletRequest)this.getPageContext.getRequest();
String ip = request.getRemoteHost();
JspWriter out = pageContext.getOut();
out.write("使用自定义标签输出客户的IP地址:"+ip);
}
}
2 在web项目的WEB-INF目录下建立itcast.tld文件,这个tld叫标签库的声明文件。并且在tld文件中添加如下内容(参考核心标签库的tld文件)
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<!-- 标签库的版本 -->
<tlib-version>1.1</tlib-version>
<!-- 标签库前缀 -->
<short-name>itcast</short-name>
<!-- tld文件的唯一标记 -->
<uri>http://itcast.cn</uri>
<!-- 一个标签的声明 -->
<tag>
<!-- 标签名称 -->
<name>showIp</name>
<!-- 标签处理器类的全名 -->
<tag-class>itcast.a_tag.ShowIpTag</tag-class>
<!-- 输出标签体内容格式 -->
<body-content>scriptless</body-content>
<!-- 属性声明 -->
<attribute>
<!-- 属性名称 -->
<name>num</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
3 在jsp页面的头部导入自定义标签库
<itcast:showIp></itcast:showIp>
自定义标签的作用:<itcast:showIp>标签体内容</itcast:showIp>标签余下内容
1)控制标签体内容是否输出
2)控制标签余下内容是否输出
3)控制重复输出标签体内容
4)改变标签体内容
5)带属性的标签
/**
* 标签处理器类
* @author APPle
*
*/
public class DemoTag extends SimpleTagSupport{
//1.声明属性的成员变量
private Integer num;
//2.关键点: 必须提供公开的setter方法,用于给属性赋值
public void setNum(Integer num) {
this.num = num;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println("执行了标签");
/**
* 1)控制标签内容是否输出
* 输出: 调用jspFrament.invoke();
* 不输出: 不调用jspFrament.invoke();
*/
//1.1 得到标签体内容
JspFragment jspBody = this.getJspBody();
/**
* 执行invoke方法: 把标签体内容输出到指定的Writer对象中
*/
//1.2 往浏览器输出内容,writer为null就是默认往浏览器输出
//JspWriter out = this.getJspContext().getOut();
//jspBody.invoke(out);
jspBody.invoke(null);//等价于上面的代码
/**
* 3)控制重复输出标签体内容
* 方法: 执行多次jspBody.invoke()方法
*/
/*for(int i=1;i<=num;i++){
jspBody.invoke(null);
}*/
/**
* 4)改变标签体内容
*/
//4.1 创建StringWriter临时容器
/*StringWriter sw = new StringWriter();
//4.2 把标签体拷贝到临时容器
jspBody.invoke(sw);
//4.3 从临时容器中得到标签体内容
String content = sw.toString();
//4.4 改变内容
content = content.toLowerCase();
//System.out.println(content);
//4.5 把改变的内容输出到浏览器
//jspBody.invoke(null); 不能使用此方式输出,因为jsbBody没有改变过
this.getJspContext().getOut().write(content);*/
/**
* 2)控制标签余下内容是否输出
* 输出: 什么都不干!
* 不输出: 抛出SkipPageException异常
*/
throw new SkipPageException();
}
}