1jsp
本页面会用到的Jar包(jstl.jar,standard.jar)
这一块概念性比较强,代码容易理解,重在记忆与使用,部分指令属性截取自网络
1.1 jsp是什么 java server page java服务端页面,本质上是一个servlet
1.2 问:既然本质上是servlet,那么什么时候会被编译成servlet?
答:在被访问的时候会被编译成servlet,存放在tomcat的work目录(只有被访问之后才会生成,访问项目其它文件并不会生成)
1.3 它的组成:一切能写在html中的代码(css,javascript)+java代码+jsp自身的属性方法
1.4 重点:jsp嵌入java代码的方式
(1)<%! %>:主要是用来定义成员变量,对应servlet中的类中方法外
(2)<%= %>:用来向页面输出内容(与servlet最大的不同之处,它可以很方便的向页面输出内容)对应servlet中所处的位置是service方法内
(3)<% %>:主要用来写java代码,在servlet中的位置service方法中
问:jsp中能否定义类,或者方法?
1.5 特有注释:<%-- --%>(只存在源码阶段)
html的注释<!-- --%>(浏览器查看源代码能看到的注释)
java注释:写在嵌入java代码的地方,在servlet中能看到(html也可以看到)
2,jsp的指令
2.1 三个指令 写法:<%@ 指令名称 属性="属性值"%>
2.2 page指令
2.2.1 用处:设置jsp页面信息
2.2.2 写法: <%@ page 属性="属性值"%>
2.2.3 主要属性:
(这里考虑用表格更加清晰)
language:支持的语言类型(目前只支持java)
extends:编译成servlet后继承的类,默认继承的是HttpJspBase
session:是否可以直接使用session对象,默认值为true(配置之后,可以直接使用session,不用通过request获取)
import:为jsp中的java代码进行导包(可以写多行,也可以用,号隔开)
buffer:设置jsp对客户端输出的缓冲区的大小(默认为8kb)
autoFlush:如果对客户端输出的内容超出缓冲区能否正确输出(默认为true)
errorPage:当jsp页面出现异常,设置跳转的错误页面(这个很重要,写在可能出现异常的页面,当服务器宕机之类的情况下可以为客户提供解释说明)
isErrorPage:在错误页面中是否显示错误信息
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
(也可以自定义异常类输出信息,给予提示)
使用exception对象 <%=exception.getMessage() %>
contentType:设置浏览器的编码
pageEncoding:编译成servlet使用的编码,权限大于contentType
isELIgnored:是否忽略el表达式,默认不忽略为false,忽略之后会作为普通文本
其实开发中用的最多的就是import,session,errorPage,pageEncoding,其它的一般情况下要不就不用,要不就默认即可
2.3 include(包含)指令
2.3.1 用处:在一个页面中包含其它页面的内容,减少代码量,提高页面复用性(笑,就跟java的方法封装一样)
2.3.2 静态包含,最终会编译成一个servlet
2.3.3 注意事项:
①:在被包含的页面中,直接写内容(其它代码也会被包含,如meta标签之类,但是没有意义,故而只写内容)
②:在被包含的页面不能使用变量传递(变量无意义)
③:被包含的页面路径后面不能加参数(不能传递信息)
2.4 taglib指令
2.4.1 用处:引用标签库
2.4.2 写法:<%@ taglib uri="jstl标签库的路径" prefix="jstl标签库的别名";
Taglib标签库
jstl标签库
1. 简介:
1.1 JavaServerPages(javaweb页面) Standed(标准) Tag(标签) Library(库)
1.2 使用jstl标签库,可以和jsp指令taglib一起使用,替代页面中的<% %>
1.2.1 jstl版本 1.0,1.1,1.2
1.3 使用方法:本身是第三方的jar包,需要导包 (jstl.jar,standard.jar)
1.3.1 jstl使用在jsp页面中,需要在jsp页面中引入标签库(jar包放到WEB-INF/lib下自动加载)
<%@taglib uri="标签库路径" prefix="short-name" %>
标签库路径:项目下Web_App_Libraries中standard.jar(变成奶瓶加载成功了)/META-INF/c.tld
找到下面两行,复制到taglib的属性中
<short-name>c</short-name>
<uri>http://java.sun.com/jsp/jstl/core</uri>//可以快捷生成,注意路径别用错
1.3.2写法
<c:标签库名称 属性="属性值">
1.4 入门案例
<%--使用jstl标签库,把java代码换成jstl表示出来 --%>
<!-- 通过jstl定义变量 set,向域对象里面设置一个值-->
<c:set var="d" value="30"></c:set>
<!-- 条件判断 if标签-->
<c:if test="${d==10}"> <!--注意el表达式"}"后面不要有空格-->
<h2>d等于10</h2>
</c:if>
<c:if test="${d!=10}">
<h2>d不等于10</h2>
</c:if>
2, jstl的if标签
2.1进行条件判断的标签
2.2写法<c:if test="判断条件">
2.3在jstl没有<c:else>标签
2.4用法
<!-- 条件判断 if标签-->
<c:if test="${d==10}"> <!--注意el表达式"}"后面不要有空格-->
<h2>d等于10</h2>
</c:if>
<c:if test="${d!=10}">
<h2>d不等于10</h2>
</c:if>
3, jstl的forEach标签
3.1 遍历的操作标签
3.2 用处:获取域对象里面的数组,集合(list,set,map),多个对象的属性值
3.3 写法<c:forEach var="每次遍历的值" items="域对象值的名称${ 名称}">
3.4 使用forEach获取域对象数组的值
<%--使用jstl的forEach标签获取域对象里面的值 --%>
<%
//创建一个数组
String arr[]={"张三","李四","王五"};
pageContext.setAttribute("arr", arr);
%>
<%--使用El表达式获取 --%>
${arr[0] }
<hr/>
<%--使用forEach标签来获取 --%>
<%--a类似增强for循环中的变量名 ,${}表示要遍历的内容--%>
<c:forEach var="a" items="${arr }">
${a }
</c:forEach>
3.5 使用jstl标签获取域对象中集合的值
3.5.1 获取域对象里面list集合的值
<%--使用jstl的forEach标签获取域对象里list集合的值 --%>
<%
List<String> li = new ArrayList();
li.add("aaa");
li.add("bbb");
li.add("ccc");
application.setAttribute("li", li);
%>
<%--el表达式获取 --%>
${li[0] }
<hr/>
<%--使用forEach标签获取list集合中的值 --%>
<c:forEach var="b" items="${li} ">
${b } <hr/> <!--这里的结果带了个[]样式,待解决-->
</c:forEach>
3.5.2 获取域对象里面set集合的值
<%--使用jstl的forEach标签遍历set集合 --%>
<%
Set<String> s1 =new HashSet();
s1.add("123");
s1.add("456");
s1.add("789");
pageContext.setAttribute("s1", s1);
%>
<!-- el获取不了 -->
<c:forEach var="s" items="${s1 }">
${s }
</c:forEach>
3.5.3获取域对象里面map集合的值
<%--获取域对象中Map集合的值 --%>
<%
Map<String,Integer> m1 =new HashMap();
m1.put("a", 1);
m1.put("b", 2);
m1.put("c", 3);
application.setAttribute("m1", m1);
%>
<!-- 使用el表达式获取值 -->
${m1.a }
<hr/>
<%--使用forEach标签获取 --%>
<c:forEach var="m" items="${m1 }">
${m.key },${m.value }<br/>
</c:forEach>
3.6 使用forEach获取多个对象中的值
<%--这里做jstl的forEach获取多个对象的属性 --%>
<%
//因为使用forEach需要把对象放到域对象中,故而先把所有对象放到集合里
//然后通过forEach依次获取每一个对象即可
User u1 =new User("张三",23);
User u2 =new User("李四",24);
User u3 =new User("王五",25);
User u4 =new User("赵六",26);
//放到集合里
List<User> li =new ArrayList();
li.add(u1);
li.add(u2);
li.add(u3);
li.add(u4);
//把集合放到域对象中
request.setAttribute("li", li);
%>
<%--通过forEach获取 --%>
<c:forEach var="u" items="${li}">
<p>${u.name }:${u.age }</p>
</c:forEach>