1.jsp页面中的注释 comment
第一种:
特点:
1.用户在浏览器中右键查看源代码 [能] 看到这个注释。
2.在服务器端,这个jsp页面被翻译成的java文件中 [能] 看到这个注释.
注意: jsp动作元素 放在这种注释里面是不起作用(注释不起作用,jsp动作元素正常执行)
例如:下面的注释不起作用
<!--
<jsp:forward page="hello.jsp"></jsp:forward>
-->
但是使用隐藏注释,可以是把这个动作元素注释掉的。
第二种:
<%--
jsp中的注释方式(隐藏注释)
--%>
特点:
1.用户在浏览器中右键查看源代码 [不能] 看到这个注释。
2.在服务器端,这个jsp页面被翻译成的java文件中 [不能] 看到这个注释.
第三种:
java中的注释方式,但是这种注释方式只能在jsp的脚本或者声明中使用。
//String name = "tom";
/*
int b = 40;
*/
/**
int a = 20;
*/
特点:
1.用户在浏览器中右键查看源代码 [不能] 看到这个注释。
2.在服务器端,这个jsp页面被翻译成的java文件中 [能] 看到这个注释.
2.在jsp页面代码中可以直接使用的对象(jsp内置对象)
其实是只有在这个_jspService()方法中才能使用
jsp脚本和jsp表达式
<% 脚本 %>
<%= 表达式 %>
一共有9个内置对象可以直接使用.
类型 名字
PageContext pageContext
HttpServletRequest request
HttpSession session
ServletContext application
Object page
HttpServletResponse response
JspWriter out
ServletConfig config
Throwable exception
注意:为什么这个写对象可以直接使用,因为他们都是在_jspService这个方法中默认声明了出来.而我们在表达式和脚本中所写的java代码将来是要翻译到_jspService方法中的,所以我们在表达式和脚本中写java代码的时候可以直接使用这些对象.
四个范围对象,在一定范围内可以存取数据:
//页面范围(只能在同一个页面中起作用)
pageContext
request
session
application
//虽然名字叫page,但是这个并不是页面范围对象,它是Object类型的对象,表示当前这个页面本身(jsp页面就是一个servlet).
其实page指的是jsp页面翻译成的java类对象,服务器使用这个java类所创建的对象(把page对象输出即可看到),所以说page对象代表jsp页面本身
page
<%=(page==this)%><br> 输出结果为true
response
//用于向浏览器输出内容的输出流.
out
config
//这个对象其实我们并不能直接使用,需要相关设置后才能使用,这个可以算是一个隐藏对象.这个对象表示将来这个jsp页面运行出错的时候所抛出的异常对象.
exception
3.jsp页面中的路径
一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一样的,但是在jsp中可以动态获得该项目的url。
如果在jsp页面的上面写了这样一个脚本:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
并且再<head>标签中加入了一个子标签:
<base href="<%=basePath%>" />
那么在这个jsp页面中,我们再去写上一个相对路径(最左边没有加/的那种路径),它就不是相对于地址栏中的当前路径了,而是要相对于这个basePath变量所代表的这个路径.
4.EL表达式
形式:${ }
作用:从一个范围里面取值或者从一个对象中取值或是向页面输出值.
(取值并显示)
1.接收客户端参数.
${param.name1 }
2.指定范围并取值
${pageScope.name2 }
${requestScope.name3 }
${sessionScope.name4 }
${applicationScope.name5 }
3.可以不指定范围再去取值
${name}
这时候会按照pageContext request session application这样一个顺序依次的去找有没有一个叫name的值存在,一旦找到了就输出出来,最终没有找到那么就什么都不输出。
4.取出一个对象中的属性值.
${requestScope.student.id}
${requestScope.student.name}
${requestScope.student.age}
或者
${student.id}
${student.name}
${student.age}
或者
${student["id"]}
${student["name"]}
${student["age"]}
注意:${student.id}表示是要调用student对象中的getId方法,至于对象中有没有id属性对这个操作没有任何影响.所以这和id指的是对象中的property而不是attribute
如果Student类中一个方法是getAddress,返回一个Address类的对象,Address类中有一个方法getCity,这个时候我们就可以这样写去拿到city属性的值.
${student.address.city}
5.输出字符串
${"hello"}
6.输出运算结果或者boolean表达式
${1+1 }
${(1+2)*3-4+5*3 }
${u.age * 10 }
${1<3 }
//为空的话返回true
${empty "" }
${empty "hello" }
//取否 不为空的话返回true
${not empty "hello" }
${! empty "hello" }
${param.score >50 }
${param.score >60?"good":"bad" }
7.输出数组、集合中的元素
<%
String[] str = {"hello","world"};
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("a",100);
map.put("b",200);
map.put("c",300);
request.setAttribute("str",str);
request.setAttribute("list",list);
request.setAttribute("map",map);
%>
${str[0] }<br>
${list[1] }<br>
${map["c"] }<br>
8.key的值中含有特殊符号点.
例如 request对象中有一个key值为:javax.servlet.forward.request_uri
要取值这个值必须用这种形式:
${requestScope['javax.servlet.forward.request_uri'] }
5.JSTL标签库
JSP Standard Tag Library(JSTL)
1.让web项目支持JSTL标签库
在eclipse中,建一个文本项目,默认都是不支持JSTL,所以需要我们自己把JSTL的jar包导入到项目中(复制粘贴到项目中的lib目录):jstl-1.2.jar
2.把JSTL标签库导入到某一个jsp页面中
使用jsp中的taglib指令:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
prefix="c"相当于给这个标签库起一个别名,将来在页面中就是用以c开头的标签来使用标签库中的标签。这个别名也可以叫其他的名字。
<c:forEach>标签:
<%
List<Student> list = new ArrayList<Student>();
list.add(new Student(1,"tom1",21));
list.add(new Student(2,"tom2",22));
list.add(new Student(3,"tom3",23));
list.add(new Student(4,"tom4",24));
session.setAttribute("list", list);
%>
<c:forEach items="${list }" var ="stu" begin="0" end ="3" varStatus="status" step="1">
${status.index } : ${stu.id } - ${stu.name } - ${stu.age } <br>
</c:forEach>
begin=""默认值是0 end =""默认值是最后一个元素,一般的遍历只要写var和items来个属性即可
遍历List集合:
students是放进request对象中的一个List集合,集合中存放的是Student类型的对象.
items=""属性值是要遍历的集合
var="" 属性值是每次遍历到的对象用什么名字的变量去接收。
<c:forEach items="${students}" var="stu">
<tr>
<td>${stu.id }</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
</tr>
</c:forEach>
遍历Map集合:
map是一个Map类型的集合,放到了request对象中,entry是我们顶一个的一个变量,用做接收每次遍历到的集合中的一组键值对,我们可以通过entry.key entry.value分别拿到这次遍历到的key值和value值
<c:forEach items="${map}" var="entry">
${entry.key }-->${entry.value.id } ${entry.value.name } ${entry.value.age }<br>
</c:forEach>
<c:out>标签:
向页面输出内容,就像<%= ... >
<c:out value="hello"></c:out>
<c:out value="${5+5}"></c:out>
//students是放在request中的List集合,集合里面是Student对象
<c:out value="${students[2].id}"></c:out>
<c:set>标签:
向某一个范围对象中存放一个值。
<c:set var="name" value="zhangsan" scope="request"></c:set>
<c:remove>标签:
从某个范围对象中把某个值给移除掉.
<c:remove var="name" scope="request"/>
<c:if>标签:
条件判断
<%
request.setAttribute("score",40);
%>
<c:if test="${score>85 }">
<font color="red">你的分数超过了85分</font>
</c:if>
<c:if test="${score>95 }">
<font color="red">你的分数超过了95分</font>
</c:if>
这样写相当于:
if(score>85){
...
}
if(score>95){
...
}
<c:catch>标签:处理产生错误的异常状况,并且将错误信息储存起来。
<c:catch var ="catchException">
<% int x = 1/0;%>
</c:catch>
<c:if test = "${catchException != null}">
<p>异常为 : ${catchException} <br />
发生了异常: ${catchException.message}</p>
</c:if>
<c:import>标签:和<jsp:include>的作用基本相同,<c:import>还可以选择把引入的内容先保存在一个变量中,之后通过EL表达式再拿出来显示
<c:import url="a.jsp" />
或者
<c:import var="data" url="a.jsp" />
${data}
<c:choose>标签
<c:when>标签
<c:otherwise>标签
例如:
<c:choose>
<c:when test="${score>=90 }">优</c:when>
<c:when test="${score>=80 }">良</c:when>
<c:when test="${score>=70 }">中</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>差</c:otherwise>
</c:choose>
相当于:
if(score>=90){
}else if(score>=80){
}else if(score>=70){
}eles if(score>=60){
}else{
}
<c:redirect>标签重定向
<c:redirect url="a.jsp"/>
6.自定义标签
JSP1.1版本中增加了自定义标签库规范,但是在 JSP1.1规范中开发自定义标签库比较复杂,JSP2.0 规范简化了标签库的开发,只需如下几个步骤
1.编写自定义标签处理类
2.建立一个 *.tld 文件,每个 *.tld 文件对应一个标签库,每个标签库可以对应多个标签,该文件放在WEB-INF下即可
3.在jsp文件中使用tablib指令引入并使用自定义标签
注意:我们使用的tomcat8.5.38中实现的是JSP2.3的规范。
javax.servlet.jsp.tagext.JspTag接口
所有的标签,都需要实现这个接口
默认情况下,jsp中已经提了该接口的一些实现,其实名为XxxxSupport的类,是我们在自定义标签的时候,可以继承的父类型。
JSP2.0版本中,提供了javax.servlet.jsp.tagext.SimpleTagSupport类,我们编写的自定义标签处理类继承该类即可。
例如1:编写一个标签,可以自动输出hello
第一步:
继承SimpleTagSupport,重写doTag即可
public class HelloTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
super.getJspContext().getOut().println("hello");
}
}
第二步:
编写my-tag.tld文件(名字随意),存放在WEB-INF下:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://www.JAVA.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>my-taglib</short-name>
<uri>briup-taglib</uri>
<tag>
<name>hello</name>
<tag-class>com.briup.test.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
注意1:该文件的样例可以在tomcat中的实例项目中复制出来修改。例如:
D:\jd2019\apache-tomcat-8.5.38\webapps\examples\WEB-INF\jsp\example-taglib.tld文件
注意2:<body-content>标签中的值,表示自定义标签中body部分可以填写的内容类型,有四种:
empty
空标记,即起始标记和结束标记之间没有内容
scriptless
接受文本、EL和JSP动作
JSP (SimpleTagSupport类型不支持)
接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作
tagdependent
标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释
第三步:jsp页面中引入并使用标签库
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="briup-taglib" prefix="briup" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hello.jsp</title>
</head>
<body>
<briup:hello></briup:hello>
</body>
</html>
=========================
例如2:编写一个标签,可以自动输出hello,并附带上标签体中的内容
第一步:修改HelloTag类
public class HelloTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//准备好一个StringWriter,接收标签体内容
StringWriter sw = new StringWriter();
//把标签体内容写到StringWriter中
super.getJspBody().invoke(sw);
//从StringWriter中获取标签体的内容
String tagBody = sw.toString();
super.getJspContext().getOut().println("hello! "+tagBody);
}
}
第二步:修改my-tag.tld文件
<tag>
<name>hello</name>
<tag-class>com.briup.test.HelloTag</tag-class>
<body-content>scriptless</body-content>
</tag>
注意:只是修改了<body-content>标签中的值,这里改为scriptless或者tagdependent都是可以的.其他地方不用修改
第三步:修改jsp文件,添加标签body内容即可
<briup:hello>tom</briup:hello>
=========================
例如3:编写一个标签,可以自动输出hello,并附带上标签体中的内容,并且根据标签中属性的值,来确定内容将会输出多少次
第一步:修改HelloTag类
修改地方1,添加属性count,提供get/set方法,用来接收标签中属性的count属性的值
修改地方2,输出内容语句外面嵌套循环,循环次数由count的值来控制
public class HelloTag extends SimpleTagSupport {
private int count;
@Override
public void doTag() throws JspException, IOException {
//准备好一个StringWriter,接收标签体内容
StringWriter sw = new StringWriter();
//把标签体内容写到StringWriter中
super.getJspBody().invoke(sw);
//从StringWriter中获取标签体的内容
String tagBody = sw.toString();
for(int i=0;i<count;i++) {
super.getJspContext().getOut().println("hello! "+tagBody+"<br>");
}
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
第二步:修改my-tag.tld文件
修改地方,添加attribute标签来指定属性的相关信息
<tag>
<name>hello</name>
<tag-class>com.briup.test.HelloTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>count</name>
<required>true</required>
</attribute>
</tag>
第三步:修改jsp文件,添加标签的属性
<briup:hello count="5">tom</briup:hello>
=========================
例如4:编写一个标签,可以自动输出hello,并附带上标签体中的内容,并且根据标签中属性的值,来确定内容将会输出多少次,同时标签体值和属性的值都是要EL表达式来表示
第一步:HelloTag类,和例3保持一致,不需要改动
第二步:修改my-tag.tld文件
修改地方,添加标签<rtexprvalue>,表示支持EL
rtexprvalue的意思是:Runtime Expression Value
<tag>
<name>hello</name>
<tag-class>com.briup.test.HelloTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
第三步:修改jsp文件,添加标签的属性
修改地方,添加了jsp脚本,配合测试
<%
request.setAttribute("name", "zs");
request.setAttribute("count", "10");
%>
<briup:hello count="${count }">${name }</briup:hello>

595

被折叠的 条评论
为什么被折叠?



