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标签库:
  1. <%@ 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标签的内容,否则不执行。
 
  1. <c:set var="a" value="hello"/>  
  2. <c:if test="${not empty a }">  
  3.     <c:out value="${a }"/>  
  4. </c:if>  
 
(5)choose标签:
choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容。
  1. <c:set var="score" value="${param.score }"/>  
  2. <c:choose>  
  3.     <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>  
  4.     <c:when test="${score >= 90 }">A级</c:when>  
  5.     <c:when test="${score >= 80 }">B级</c:when>  
  6.     <c:when test="${score >= 70 }">C级</c:when>  
  7.     <c:when test="${score >= 60 }">D级</c:when>  
  8.     <c:otherwise>E级</c:otherwise>  
  9. </c:choose>   
 
 
(6)forEach标签:
forEach当前就是循环标签了,forEach标签有多种两种使用方式:
  • 使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {};
  • 循环遍历集合,类似for(Object o : 集合);
循环变量:
  1. <c:set var="sum" value="0" />   
  2. <c:forEach var="i" begin="1" end="10">   
  3.     <c:set var="sum" value="${sum + i}" />   
  4. </c:forEach>  
  5. <c:out value="sum = ${sum }"/>  
  6. <c:set var="sum" value="0" />  
  7. <c:forEach var="i" begin="1" end="10" step ="2">  
  8.     <c:set var="sum" value="${sum + i}" />  
  9. </c:forEach>  
  10. <c:out value="sum = ${sum }"/>  
遍历集合或数组方式:
  1. <%  
  2. String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};  
  3. pageContext.setAttribute("ns", names);  
  4. %>  
  5. <c:forEach var="item" items="${ns }">  
  6.     <c:out value="name: ${item }"/><br/>  
  7. </c:forEach>  
 
遍历List:
  1. <%  
  2.     List<String> names = new ArrayList<String>();  
  3.     names.add("zhangSan");  
  4.     names.add("liSi");  
  5.     names.add("wangWu");  
  6.     names.add("zhaoLiu");  
  7.     pageContext.setAttribute("ns", names);  
  8. %>  
  9. <c:forEach var="item" items="${ns }">  
  10.     <c:out value="name: ${item }"/><br/>  
  11. </c:forEach>  
 
 
遍历Map:
  1. <%  
  2.     Map<String,String> stu = new LinkedHashMap<String,String>();  
  3.     stu.put("number", "N_1001");  
  4.     stu.put("name", "zhangSan");  
  5.     stu.put("age", "23");  
  6.     stu.put("sex", "male");  
  7.     pageContext.setAttribute("stu", stu);  
  8. %>  
  9. <c:forEach var="item" items="${stu }">  
  10.     <c:out value="${item.key }: ${item.value }"/><br/>  
  11. </c:forEach>  
 
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
  • count:int类型,当前以遍历元素的个数;
  • index:int类型,当前元素的下标;
  • first:boolean类型,是否为第一个元素;
  • last:boolean类型,是否为最后一个元素;
  • current:Object类型,表示当前项目。
  1. <c:forEach var="item" items="${ns }" varStatus="vs">  
  2.     <c:if test="${vs.first }">第一行:</c:if>  
  3.     <c:if test="${vs.last }">最后一行:</c:if>  
  4.     <c:out value="第${vs.count }行: "/>  
  5.     <c:out value="[${vs.index }]: "/>  
  6.     <c:out value="name: ${vs.current }"/><br/>  
  7. </c:forEach>  
 
 
5、fmt标签库常用标签:
      fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。 
格式化时间: 
  1. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  
  2. ......  
  3. <%  
  4.     Date date = new Date();  
  5.     pageContext.setAttribute("d", date);  
  6. %>  
  7. <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>  
 
格式化数字:
  1. <%  
  2.     double d1 = 3.5;  
  3.     double d2 = 4.4;   
  4.     pageContext.setAttribute("d1", d1);  
  5.     pageContext.setAttribute("d2", d2);  
  6. %>  
  7. <fmt:formatNumber value="${d1 }" pattern="0.00"/><br/>  
  8. <fmt:formatNumber value="${d2 }" pattern="#.##"/>   
其他:自定义标签库
 
 
 
 
posted @ 2020-08-24 19:06  z街角的风铃y  阅读(214)  评论(0)    收藏  举报