zoukankan      html  css  js  c++  java
  • JavaWeb之Jsp/EL(八)

    JSP(Java Server Page)

    1. jsp简单介绍

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术
    
    JSP这门技术的最大的特点在于,写jsp就像在写html,但:
    它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据
    相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版
    

    2. jsp应用

    servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。其原因为,程序的数据通常要美化后再输出:
    让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
    让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
    因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做
    
    即Servlet不再负责显示页面,而由JSP来完成!而Servlet专注与控制层内容!

    3. jsp原理

    当客户请求的是JSP页面时,服务器会查看JSP对应的Servlet是否存在,如果存在,那么直接调用Servlet的service()方法来处理请求。如果不存在,那么服务器会先把JSP编译成.java,再把.java编译成.class,然后调用service()方法。当这个JSP页面,第二处理请求时,就直接调用直身的service()方法了

    4. jsp代码块

    <%...%>:代码片段。代码片段会原模原样的出现在真身中,不会有变动。正常的Java代码都可以在代码片段中出现;
    <%=…%>:表达式。表达式会在“真身”中输出,例如:<%=a%>,对应真身中的out.print(a)
    <%!...%>:声明。声明对应“真身”中的属性和方法
    
    jsp注释
    <%-- … --%>,注释中的内容会被JSP编译系统忽略!
    HTML的注释:<!-- … -->,因为最终向客户端响应的内容还是HTML,所以在HTML注释中的内容还是看不到的

    5. JSP隐藏(隐含、内置)对象

    隐藏对象是在JSP页面中无需创建就可以直接使用的变量
    
    Request		javax.servlet.http.HttpServletRequest
    Response	javax.servlet.http.HttpServletResponse
    Config		javax.servlet.ServletConfig
    Page		当前Servlet实例this
    session		javax.servlet.http.HttpSession
    application	java.servlet.ServletContext
    exception	java.lang.Throwable
    Out		javax.servlet.jsp.JspWriter
    pageContext	javax.servlet.jsp.PageContext

    6. Jsp四大域对象

    pageContext 对象是PageContext类型,本身是域对象,而且还可以操作所有域对象,还可以获取其他隐藏对象
    
    操作所有域(四个域):
    可以使用pageContext对象操作所有域对象,在getAttribute()、setAttribute()、removeAttribute()三个方法中多添加一个参数,int scope来指定范围。在PageContext类中包含四个int类型的常量表示四个范围:
    REQUEST_SCOPE:request范围
    SESSION_SCOPE:session范围
    APPLICATION_SCOPE:application范围

    7. pageContext对象获取隐藏对象

    获取其他隐藏对象:可以使用pageContext获取其他隐藏对象。
    JspWriter getOut():获取out隐藏对象;
    ServletConfig getServletConfig():获取config隐藏对象;
    Object getPage():获取page隐藏对象;
    ServletRequest() getRequest():获取request隐藏对象;
    ServletResponse() getResponse:获取response隐藏对象;
    HttpSession getSession():获取session隐藏对象;
    ServletContext getServletContext():获取application隐藏对象;
    JspException getException():获取exception隐藏对象转换后的JspException对象

    8. jsp指令

    <%@指令名  属性名="值"  属性名="值"  %>一般都会把JSP指令放到JSP文件的最上方,但这不是必须的
    
    JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令
    注意: Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件。
    在生成的Java文件中,不存在指令信息!
    
    
    ---------------page指令-->import属性---------------
    	import="java.util.*,java.text.*"
    	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    	errorPage="error.jsp"
    	还可以配置web.xml配error-page,如果都配置了并且能处理,那么用errorPage
    	isErrorPage="false"  是一个exception开关,改为true就有
    	isELIgnored="false"不会忽略EL,
    	contentType="text/html; charset=UTF-8"与response.setContentType()一样
    	pageEncoding="UTF-8":指明了保存和读取jsp页面时采用什么编码
    	在没有contentType时,同时还有contentType的作用
    
    	autFlush和buffer一般我们也不会去特意设置,都是保留默认值
    	常用的属性:
    	import pageEncoding 
    
    ---------------iweb.xml配置error页面---------------
    <error-page>
    	<error-code>500</error-code>
    	<location>/error500.jsp</location>
    </error-page>
    <error-page>
    	<exception-type>java.lang.Exception</exception-type>
    	<location>/error.jsp</location>
    </error-page>
    
    ---------------include指令---------------
    include指令表示静态包含!
    include指令只有一个属性:file,指定要包含的页面,例如:<%@include file=”b.jsp”%>。两个页面合并成一个文件,然后再编译成Servlet(Java文件)
    
    **动态包含是会为两个JSP页面都生成servlet,然后1.jsp的“真身”中会调用2.jsp的“真身”的_jspService()方法而已例如1.jsp<jsp:include page="2.jsp">
    
    ---------------taglib指令---------------
    JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri	
    

    13. Jsp动态标签

    JSP动态标签是JSP自己的标签,不是由第三方提供的,所以使用JSP动态标签时无需使用taglib指令“导包”。
    JSP动态标签的格式为:<jsp:xxx …>
    无论是自定义的JSP标签,还是JSP自己的动态标签,还有第三方的标签,最终都会对应一组方法的调用
    
    include动态标签
    include标签是动态包含,与include指令不同,include标签与RequestDispatcher.include()方法的功能是相同的
    用法: <jsp:include page="1/jsp"/>
    
    forward动态标签
    forward标签的作用是请求转发!forward标签的作用与RequestDispatcher.forward()方法相同
    用法<jsp:forward page="1.jsp"/>
    
    useBean、setProperty、getProperty动态标签
    <jsp:userBean id="p1" class="com.itheima.domain.Person"/>
    <jsp:setProperty property="*" name="p1"/>
    <%=p1%>

    EL

    1. JSP2.0简介

    JSP2.0要把html和css分离、要把html和javascript分离、要把Java代码块替换成标签。标签的好处是非Java人员都可以使用。
    JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>

    2. 什么是EL?

    EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出
    EL表达式的格式:${…},例如:${1+2}
    在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式
    如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“”,例如:${1+2}

    3. EL中隐藏对象

    EL表达式中,无需创建就可以使用的对象称之为EL隐藏(隐含、内置)对象。在EL中一共有11个隐藏对象,它们都与Map相似
    
    ----------------操作操作对象的方式----------------
    1). 操作List和数组:${list[0]}、${arr[0]};
    2). 操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法;
    3). 操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)
    
    ----------------隐式对象----------------
    隐式对象名称		类型
    pageContext		javax.servlet.jsp.PageContext	和jsp隐式对象完全一样
    pageScope		java.util.Map			页面范围中的数据
    requestScope		java.util.Map	
    sessionScope		java.util.Map	
    applicationScope	java.util.Map	
    header			java.util.Map	
    headerValues		java.util.Map	
    param			java.util.Map	
    paramValues		java.util.Map	
    intiParam		java.util.Map	
    cookie			java.util.Map<String,Cookie>	key:是cookie的name,value是cookie对象本身
    
    ----------------隐式对象说明----------------
    1). param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同
    	注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而	不是null。这一点与使用request.getParameter()方法是不同的
    2). paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它
    3). headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象
    4). initParam:initParam是Map<String,String>类型。它对应web.xml文件中的<context-param>参数
    5). cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身
    
    ----------------操作所有域(四个域)----------------
    可以使用pageContext对象操作所有域对象,
    在getAttribute()、setAttribute()、removeAttribute()三个方法中
    多添加一个参数,int scope来指定范围。在PageContext类中包含四个int类型的常量表示四个范围:
    	REQUEST_SCOPE:request范围;
    	SESSION_SCOPE:session范围;
    	APPLICATION_SCOPE:application范围
    示例: pageContext.setAttribute("user",user,pageContext.REQUESTSCOPE);
    
    ----------------获取其他隐藏对象----------------
    
    可以使用pageContext获取其他隐藏对象。
    JspWriter 		getOut():		获取out隐藏对象;
    ServletConfig 		getServletConfig():	获取config隐藏对象;
    Object 			getPage():		获取page隐藏对象;
    ServletRequest 		getRequest():		获取request隐藏对象;
    ServletResponse 	getResponse():		获取response隐藏对象;
    HttpSession 		getSession():		获取session隐藏对象;
    ServletContext 		getServletContext():	获取application隐藏对象;
    JspException 		getException():	获取exception隐藏对象转换后的JspException对象
    示例,如何调用: pageContext.request.contextPath

    4. EL函数库

    EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是由JSTL添加的
    EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库
    
    导入函数库
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    
    EL函数库介绍
    <%
    String[] strs = {"a", "b","c"};
    List list = new ArrayList();
    list.add("a");
    pageContext.setAttribute("arr", strs);
    pageContext.setAttribute("list", list);
    %>
    
    ${fn:length(arr) }<br/><!--3-->
    ${fn:length(list) }<br/><!--1-->
    ${fn:toLowerCase("Hello") }<br/> <!-- hello -->
    ${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
    ${fn:contains("abc", "a")}<br/><!-- true -->
    ${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
    ${fn:contains(arr, "a")}<br/><!-- true -->
    ${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
    ${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
    ${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
    ${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
    ${fn:join(arr, ";")}<br/><!-- a;b;c -->
    ${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
    ${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->
    ${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
    ${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
    ${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
    ${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
    ${fn:trim("     a b c     ")}<br/><!-- a b c -->
    ${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->
    
  • 相关阅读:
    docker
    perl有用的字符串匹配
    nginx 反向代理 kuberntes service 出现 502 问题排查
    应用应用容器化部署最佳实践
    监控系统设计
    kubernetes events 事件机制源码分析
    golang gc 原理和内存分配
    golang 使用 websocket 实现后台消息分组推送
    kubeadm 创建的 k8s 集群的升级
    在 kubernetes pod 中构建 docker image
  • 原文地址:https://www.cnblogs.com/codingpark/p/4242989.html
Copyright © 2011-2022 走看看