JSP
1. JSP页面元素构成: jsp实现文件上传下载;http://www.runoob.com/jsp/jsp-file-uploading.html
注释
指令
Java代码:表达式 声明 小脚本
静态页面 : HTML CSS JS
- 指令:<%@ 指令名 属性值=“%>
page指令:位于jsp页面的顶端,同一个页面可以有多个page指令 <%@ page 属性值=“% >
常用属性:language : 语言 import : 导包 contentType : 服务端向客户端发送的编码格式 pageEncoding:jsp本身的编码格式 isErrorPage="true"指定当前
页面是处理异常页面 errorPage=""指定发生异常调用的页面 session=“false”
include指令:把一个外部文件嵌入到当前的jsp文件中,同时解析这个页面的jsp语句,写在需要引入的地方。
taglib指令:<%@ taglib uri="" prefix=""%>
- jsp可以用以下几种注释:
客户端源代码可见 <!-- -->
客户端源代码不可见 <%-- --%>
- 静态页面 : HTML CSS JS 成为service()方法的write()输出到浏览器
- Java代码:表达式 声明 小脚本
-
jsp声明 : <%! java代码 %> 定义变量 方法 //工作中不推荐使用
- jsp脚本:一些java代码 <% %> 是service()方法中的代码
-
jsp表达式: <%=表达式 %> 变量 变量加运算符 有返回值的方法 成为service()的prinln()输出到浏览器,表达式没有分号
contentType和pageEncoding的区别:jsp翻译分成三个阶段,第一阶段,jsp转换成.java文件,根据jsp的pageEncoding编码,第二阶段,.java文件转换成.class二进制文件,使用javac的UTF-8转换,第三阶段,TOMCAT服务器发送给客户端使用contentType设定的编码格式。contentType默认的是text/html,contentType和pageEncoding默认ISO编码格式。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
2.Jsp原理
1.jsp经编译后就变成了Servlet.生成Servlet类,(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
4.对于静态HTML标签,Servlet都必须使用页面输出流逐行输出
3.JSP内置对象(在jsp代码前生成的,可以直接使用)
对象 对象类型
request HttpServletR-equest (常用)
response HttpServletResponse
out JSPWriter
config ServletConfig
application ServletContext
exception Throwable 在page中指定errorPage="e.jsp"表示出现异常交给那个页面处理 处理异常的页面中page指定idErrorPage="true"才能使用exception
session HttpSession (常用)
page Object 就是this,指代翻译生成的Servlet
pageContext PageContext 是一个管理者,可以通过它获取其他8个对象
out对象,浏览器和服务器之间有缓冲区
4.jsp的声明周期
接收到请求,先判断是否第一次请求,是就把jsp转换成servlet的字节码文件,调用jspInit(),不是就直接访问字节码文件。
5.EL
5.1 目的:JSP中还是存在大量的java代码,使用EL和JSTL来取代JSP的脚本,EL没获取到值不会报错,出现空白.
5.2 EL表达式的结构 ${ expression} (如果没指定对象默认依次从pageScope、 requestScope 、sessionScope 、applicationScope 四个内置对象中取值)
5.3 EL 提供“.“和“[ ]“两种运算符来存取数据。当属性名称中包含一些特殊字符,就一定要使用“[ ]“。例如: ${user.My-Name}应当改${user["My-Name"] },如果动态取数据也要
使用[],例如${user[data]},其中data是一个变量。
| 隐含对象名称 | 描 述 |
| pageContext |
对应于JSP页面中的pageContext对象
${pageContext.name}
|
| pageScope |
代表page域中用于保存属性的Map对象
${pageScope.name}
|
| requestScope |
代表request域中用于保存属性的Map对象
${requestScope.name}相当于HttpServletRequest.getAttribute("name");
|
| sessionScope |
代表session域中用于保存属性的Map对象
${sessionScope.name}相当于session.getAttribute("name");
|
| applicationScope |
代表application域中用于保存属性的Map对象
${ applicationScope.name}相当于HttpservletContext.getAttribute("name");
|
| param |
表示一个保存了所有请求参数的Map对象
$(param.name) 相当于 request.getParameter ("name")
|
| paramValues |
表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
$(paramValues.name) 相当于 request.getParameterValues ("name")
|
| header |
表示一个保存了所有http请求头字段的Map对象
${header.name} 相当于 request.getHeader(name)
|
| headerValues |
同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
${headerValues.name} 相当于 request.getHeaderValues(name)
|
| cookie |
表示一个保存了所有cookie的Map对象
创建cookie后,Cookie c = new Cookie("z","s")
获取name :${cookie.z.name} 获取value : ${cookie.z.value}
|
| initParam |
表示一个保存了所有web应用初始化参数的map对象
${initParam.name}相当于ServletContext.getInitparameter(String name)
|
- 访问Bean的属性
## JavaBean是一个公共的类,去掉get然后首字母小写的词就是Bean属性,实际EL调用的是get方法
## ${user.name} ${user["name"]}
- 输出简单的运算结果
+-*/% && || ! > < >= <= != empty(空字符串 空集合 值为null 找不到对应的值 为true)
${empty user.name} +只能进行加法,不能连接字符串
6.JSP七大动作标签 所有动作元素都有两个属性 id scope
<jsp:forward page="">转发到其他jsp页面去
<jsp:param name="" value="">必须和forward include plugin结合使用
<jsp: useBean id="myBean" class="" scope="">把一个类绑定到scope中,命名是id属性值,scope只能是page request session application
<jsp:setProperty name="myBean " property="" value=""> name是bean的id属性值,标签放在userBean的内部,只对新实例化的bean有效,已经存在的bean无效,放在外部新旧都可以
<jsp:getProperty name="myBean " property="">获取bean的属性并输出。
<jsp:include page="" flush="true">和include指令相同,引入外部jsp或html或文本
<jsp:plugin> 用于下载bean或者applet
7.JSTL
##导包:使用maven导包,搜索jstl,选择1.2jar
##在pom.xml中选择jar包,点击remove,删除.m2、repository下的jstl包,eclipse左侧展开libraries能看到
它的路径
JSTL原理
6.1如何开发自定义标签
编写java类,继承SimpleTagSupport类
在doTag方法中添加处理逻辑
在配置标签中说明文件
什么是JSTL?
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已!
如果你使用MyEclipse开发JavaWeb,那么在把项目发布到Tomcat时,你会发现,MyEclipse会在lib目录下存放jstl的Jar包!如果你没有使用MyEclipse开发那么需要自己来导入这个JSTL的Jar包:jstl-1.2.jar。
2、JSTL标签库:
JSTL一共包含四大标签库:
- core:核心标签库,我们学习的重点;
- fmt:格式化标签库,只需要学习两个标签即可;
- sql:数据库标签库,不需要学习了,它过时了;
- xml:xml标签库,不需要学习了,它过时了。
3、使用taglib指令导入标签库:
除了JSP动作标签外,使用其他第三方的标签库都需要:
- 导包;
- 在使用标签的JSP页面中使用taglib指令导入标签库;
下面是导入JSTL的core标签库:
- <%@ taglib prefix="c"uri="http://java.sun.com/jstl/core" %>
- prefix="c":指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;
- uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;
4、core标签库常用标签:
(1)out和set标签
|
<c:out value=”aaa”/>
|
输出aaa字符串常量
|
|
<c:out value=”${aaa}”/>
|
与${aaa}相同
|
|
<c:out value=”${aaa}” default=”xxx”/>
|
当${aaa}不存在时,输出xxx字符串
|
|
<%
request.setAttribute("a","<script>alert('hello');</script>");
%>
<c:out value="${a }" default="xxx" escapeXml="false" />
|
当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。
|
|
<c:set var=”a” value=”hello”/>
|
0在pageContext中添加name为a,value为hello的数据。
|
|
<c:set var=”a” value=”hello” scope=”session”/>
|
在session中添加name为a,value为hello的数据。
|
(2)remove标签
|
<%
pageContext.setAttribute("a","pageContext");
request.setAttribute("a","session");
session.setAttribute("a","session");
application.setAttribute("a","application");
%>
<c: remove var="a"/>
<c: out value="${a}" default="none"/>
|
删除所有域中name为a的数据! |
| <c:remove var="a" scope=”page”/> | 删除pageContext中name为a的数据 |
(3)url标签:该标签会在需要重写URL时添加。
|
<c:url value="/"/>
|
输出上下文路径:/项目名/
|
|
<c:url value="/" var="a" scope="request"/>
|
把本该输出的结果赋给变量a。范围为request
|
|
<c:url value="/AServlet"/>
|
输出:/项目名/AServlet
|
|
1<c:url value="/AServlet">
<c:param name="username" value="abc"/>
<c:param name="password" value="123"/>
|
输出:/项目名/AServlet?username=abc&password=123
如果参数中包含中文,那么会自动使用URL编码!
|
(4)if标签:
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
- <c:set var="a" value="hello"/>
- <c:if test="${not empty a }">
- <c:out value="${a }"/>
- </c:if>
(5)choose标签:
choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容。
- <c:set var="score" value="${param.score }"/>
- <c:choose>
- <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>
- <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>
- </c:choose>
(6)forEach标签:
forEach当前就是循环标签了,forEach标签有多种两种使用方式:
- 使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {};
- 循环遍历集合,类似for(Object o : 集合);
循环变量:
- <c:set var="sum" value="0" />
- <c:forEach var="i" begin="1" end="10">
- <c:set var="sum" value="${sum + i}" />
- </c:forEach>
- <c:out value="sum = ${sum }"/>
- <c:set var="sum" value="0" />
- <c:forEach var="i" begin="1" end="10" step ="2">
- <c:set var="sum" value="${sum + i}" />
- </c:forEach>
- <c:out value="sum = ${sum }"/>
遍历集合或数组方式:
- <%
- String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
- pageContext.setAttribute("ns", names);
- %>
- <c:forEach var="item" items="${ns }">
- <c:out value="name: ${item }"/><br/>
- </c:forEach>
遍历List:
- <%
- List<String> names = new ArrayList<String>();
- names.add("zhangSan");
- names.add("liSi");
- names.add("wangWu");
- names.add("zhaoLiu");
- pageContext.setAttribute("ns", names);
- %>
- <c:forEach var="item" items="${ns }">
- <c:out value="name: ${item }"/><br/>
- </c:forEach>
遍历Map:
- <%
- Map<String,String> stu = new LinkedHashMap<String,String>();
- stu.put("number", "N_1001");
- stu.put("name", "zhangSan");
- stu.put("age", "23");
- stu.put("sex", "male");
- pageContext.setAttribute("stu", stu);
- %>
- <c:forEach var="item" items="${stu }">
- <c:out value="${item.key }: ${item.value }"/><br/>
- </c:forEach>
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
- count:int类型,当前以遍历元素的个数;
- index:int类型,当前元素的下标;
- first:boolean类型,是否为第一个元素;
- last:boolean类型,是否为最后一个元素;
- current:Object类型,表示当前项目。
- <c:forEach var="item" items="${ns }" varStatus="vs">
- <c:if test="${vs.first }">第一行:</c:if>
- <c:if test="${vs.last }">最后一行:</c:if>
- <c:out value="第${vs.count }行: "/>
- <c:out value="[${vs.index }]: "/>
- <c:out value="name: ${vs.current }"/><br/>
- </c:forEach>
5、fmt标签库常用标签:
fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。
格式化时间:
- <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- ......
- <%
- Date date = new Date();
- pageContext.setAttribute("d", date);
- %>
- <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>
格式化数字:
- <%
- double d1 = 3.5;
- double d2 = 4.4;
- pageContext.setAttribute("d1", d1);
- pageContext.setAttribute("d2", d2);
- %>
- <fmt:formatNumber value="${d1 }" pattern="0.00"/><br/>
- <fmt:formatNumber value="${d2 }" pattern="#.##"/>
其他:自定义标签库

浙公网安备 33010602011771号