一篇文章让你精通Java JSP规范

JSP基础

  • 1.jsp和servlet的分工

    • jsp
      • 作为请求发起页面,例如显示表单、超链接
      • 作为请求结束页面,例如显示数据
    • servlet
      • 作为请求中处理数据的环节
        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8vhBBAn-1594728087223)(en-resource://database/3015:1)]
  • 2.jsp的组成

    • jsp = html + java脚本 + jsp标签(指令
    • jsp中无需创健即可使用的对象一共有9个,被称之为9大内部对象
      • request:客户端的请求信息
      • response:封装了jsp产生的响应,然后被发送到客户端以响应客户的请求
      • session:用来保存每个用户的信息,以便跟踪每个用户的操作状态
      • application:应用程序对象(ServletContext)
      • out:向客户端输出数据
      • pageContext:
        • 为JSP页面包装页面的上下文。
        • 管理对属于JSP中特殊可见部分中己经命名对象的该问
      • config:表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet
      • page:Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问
      • exception:反映运行的异常
    • 四大域对象
      • page域:    只能在当前jsp页面使用                (当前页面)
      • request域: 只能在同一个请求中使用               (转发)
      • session域: 只能在同一个会话(session对象)中使用  (私有的)
      • context域: 只能在同一个web应用中使用            (全局的)
  • 3.中java脚本

    • <%…%>:java代码片段(常用),用于定义0~N条Java语句,方法内写什么,就能写什么

    • <%=…%>:java表达式,用于输出(常用),用于输出一条表达式(或变量)的结果。
      print(…),…写什么就能写什么

    • <%!..%>:声明:用来创健类的成员变量和成员方法(基本不用
      Class sd {…},…些什么就写什么

    • <%-- … --%>:注释,不会被编译到java

  • 4.jsp原理

    • 是一种特殊的Servlet
      • 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)
      • 然后再把java编译成.class
      • 然后创健该对象
      • 最后调用它的service()方法
      • 第二次请求同一个jsp时,直接调用service()方法
    • 在tomcat的work目录下可以找到jsp对应的.java源码
    • 查看jsp对应的java文件
      • java脚本
      • html

JSP高级

JSP九大内置对象
  • out(JspWriter):等同于reponse.getWriter(),用来向客户端发送文本数据
  • config(ServletConfig)
  • page(当前JSP的真身类型):当前JSP页面的this,即当前对象
  • pageContext(PageContext):页面上下文对象
  • exception(Throwable):只有在错误页面中可以使用这个对象
  • request(HttpServletRequest)
  • response(HttpServletRespone)
  • application(ServletContext)
  • session(HttpSession)

config、page、exception基本不会使用
exception、session不是每个jsp页面都可以使用

  • pageContext
    • Servlet中有三大域,而JSP中有四大域,pageContex就是最有一个域对象
      • ServletContext:整个应用程序
      • HttpSession:整个会话
      • request:一个请求链
      • pageContext:一个jsp页面
    • 这个域是当前jsp页面和当前jsp页面中使用的标签之间共享数据
    • 代理其他域!
      • getAttribute和setAttribut中
        • 最有一个参数可以设置PageContext.SESSION_SCOPE其他域
    • 全域查找:pageContext.findAttribute()
      • 从小域到大域查找
    • 获取其他8个内置对象
JSP三大指令
  • page–>最复杂
  • include–>静态包含
  • taglib—>导入标签库
page指令
  • 格式:<%@ page language="java" info="xxx" ...%>
  • 特性:一个页面可以放N个Page指令,位置随意,没有必须属性,都是可选
  • 属性:
    • pageEncoding和contentType
      • pageEncoding:指定当前jsp页面的编码,tomcat将.jsp编译成.java时需要
      • contentType:表示添加一个响应头Content-Type等同于 repsonse.setContentType(“text/html; charset=utf-8”);
      • 如果两个属性只提供一个,那么另一个的默认值为设置的哪一个
      • 如果两个属性都没有设置,那么默认为iso
    • import:导包,可以出现多次,或者多个包用逗号隔开
    • errorPage和isErrorPage
      • errorPage:当前页面如果抛出异常,那么转发到哪一个页面,由errorPage指定
      • isErrorPage:指定当前页面是否为处理错误的页面(true或false),HTTP状态码会设置为500,只有True才可以使用9大内置对象的Exception
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw4U8x4G-1594728087225)(en-resource://database/3033:1)]
    • autoFlush和buffer
      • autoFlush:指定jsp的输出流缓冲区满时是否自动刷新,默认为true,如果为false,那么缓冲区满时抛出异常
      • buffer:指定缓冲区大小,默认为8kb,通常不需要球盖
    • isElIgnored:是否忽略EL表达式,默认值为false,不忽略,即支持EL表达式
    • 不常用属性
      • language:指定当前jsp编译后的语言类型,默认值为java
      • info:说明性信息
      • isThreadSafe:当前jsp是否支持并发访问,默认为false,为true时,jsp生成的Servlet会去实现一个过时的标记接口,SingleThreadModel,这时jsp只能处理单线程的访问
      • session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象
      • extends:让jsp生成的servlet去继承该属性指定的类
include指令:静态包含
  • 与RequestDispatcher的include()方法功能相似
  • <%@ include%>是在jsp编译成java文件时完成,他们共同生成一个java(就是一个servlet)文件,然后再生成一个class
  • RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并
  • 感觉类似于C++的#include
  • 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面不变的部分,就是一个独立的JSP,而我们只需要处理需要变化的JSP
  • 属性:
    • file:包含的另一个jsp
taglib:导入标签库
  • 属性:
    • prefix:指定标签库在本页面中的前缀!由我们自己定义
    • uri:指定标签库的位置
  • <%taglib prefix=“pre” uri="/struts-tags" %>
  • 使用标签pre:text
  • 前缀名是处理冲突的
JSP动作标签
  • 动作标签是由tomcat服务器来解释执行!它与java代码一样,都是在服务端执行的
  • html由浏览器执行
  • jsp:forward:转发,与RequestDispatcher的forward方法一样
  • jsp:include:包含,与RequestDispatcher的include方法一样
  • 属性:
    • 都是page
    • jasp:param:用来作为forwar和include的子标签!用来转发或办函的页面传递参数
        <jsp:forward page="b.jsp"> 
            <jsp:param value=""zhangsan" name="name"/>
        </jsp:forward> 
  • tomcat的web.xml中
    • 自动重新加载,只适合在开发中使用
JSP中JavaBean标签
<jsp:userBean id="user" class="cn.xxx.xxx.User" scope="session"/>
<jsp:setProperty name="user" property="username" value="admin"/>
<jsp:getProperty name="user" property="username" />
EL表达式
  • EL表达式是jsp的内置语言

    • jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签
    • EL替代的是<%=…%>
  • 全域查找取值${request_XXX}

    • 如果域中不存在值,则输出空字符串
    • 从小域到大域取值
  • 指定域查找

    • ${pageScope.xxx}
    • ${requestScope.xxx}
    • ${sessionScope.xxx}
    • ${aplicationScope.xxx}
  • JavaBean导航
    Emp emp;
    request.setAttribute(“emp”, emp);

    • ${requestScope.emp.address.street}
  • EL内置对象11个

    • 域查找的四个
    • 请求参数相关
      • param:Map<String,String>类型,param对象可以用来获取参数与request.getParameter()方法相同,Key是参数名,value是属性值
        • $<param.username>
      • paramValue: Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它
        • $<[paramValues.hobby[0]>
      • header:对应请求头,Map,key头名称,value单值
        • ${header[‘User-Agent’]}
      • headerValues:对应请求头,Map,key头名称,value多个值
      • initParam:获取内的参数
        • ${initpAram.xxx}
    • cookie:Map<String, Cookie>类型
      • ${cookie.username.value}}
    • pageContext:PageContext类型
      • ${pageContext.request.scheme}
      • ${pageContext.request.contextPath}项目名称
  • EL函数库

    • 1.导入标签库<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DpdlOet-1594728087227)(en-resource://database/3039:1)]
    • 自定义函数库
      • 写一个java类,类中可以定义0~N个方法,必须静态必须,必须有返回值
      • 在WEB-INF目录下创健一个tld文件
      • 在jsp页面中导入标签库uri="/WEB-INF/xxx/xxx.tld"
JSTL标签库
  • apache提供的,依赖EL
  • 四大标签库
    • core:核心标签库
    • fmt:格式化标签库
    • sql:数据库标签库,过时Model1年代
    • xml:xml标签库,过时Model1年代
core
  • 导包<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
  • out和set
    • <c:out>输出
      • value:可以是字符串常量,也可是以EL表达式
      • default:当要输出的内容为null时,会输出default指定的值
      • excapeXml:默认值为true,表示转义
    • <c:set>创健域的属性,默认域是pageContext
      • var:变量名
      • value:变量值,可以是EL表达式
      • scope:指定域(page,request,session,application)
  • remove 删除域中的变量
    • var:变量名
    • scope:如果不指定scope,表示删除所有域中该名称的变量
  • url
    • value:指定一个路径,他会在路径前面自动添加项目名!
      • <c:url value="/index.jsp" /> 它会输出/项目名/index.jsp
    • 子标签:<c:param>,用来给url后面添加参数,可以对参数进行url编码
      <c:url value=“index.jsp”>
      <c:param name=“username” value=“张三”>
      </c:url>
    • var:指定变量名,一旦添加了这个属性,那么url标签就不会输出到页面,而是把生成的url保存到域中
    • scope:它与var一起使用,用来指定变量添加到哪个域
  • if
    • <c:if test=“布尔类型值或表达式 栗子:${not empty a}”>…</c:if> 当test为真时,执行标签体内容
  • choose 相当于ifelse,当test中为真时输出
    <c:choose>
    <c:when test=“布尔类型值或表达式”>…</c:when>
    <c:otherwise>…</c:otherwise>
    </c:choose>
  • forEach用来循环遍历数组、集合,可以用计数方式循环
<c:forEach var="i" begin="1" end="10">
    ${i}
</c:forEach>
  • var 循环变量
  • begin:循环遍历从几开始
  • end:循环遍历到几技术
  • step:步长,默认为1
<c:forEach items="${strs}" var="str">
    ${str}
</c:forEach>
  • items:指定要循环谁,它可以是一个数组或集合,items中不能有空格

  • var:把数组或集合中的每个元素赋值给var指定的变量

  • forEach循环状态变量

<c:forEach items="${strs}" var="str" varStatus="vs">
    ${vs.count}
</c:forEach>
  • count:int类型,当前遍历元素的个数
  • index:index类型,当前元素的下标
  • first:boolean类型,是否为第一个元素
  • last:boolean类型,是否为最后一个元素
  • cuurent:Object类型,表示当前项目
fmt

<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>


<fmt:formatDate value="${d}" patten=“yyyy-MM-dd HH:mm:ss”>

  • value:指定一个Date类型的变量
  • pattern:用来指定输出的模板!

<fmt:formaNumber value="${d}" patten=“0.00”>

  • 表示小数点后几位,四舍五入
    • #.##不补位
    • 0.00补位

猜你喜欢

转载自blog.csdn.net/weixin_48568292/article/details/107346267