web基础day12---jsp

  1. JSP概述
    在 Servlet中书写后台逻辑代码和前台页面代码,十分复杂,如果页面构成繁琐,则servlet编写有很大难度。于是sun公司提供一种可以在页面中书写HTML和Java代码的技术。这门技术简化了前台和后台代码的切换操作,提升了开发的便利性。这门技术就是JSP。
    JSP是Sun公司提供的一门动态资源开发技术。

    1. JSP原理
      a. jsp页面在第一次被访问的时候,会被jsp翻译引擎翻译为一个Servlet文件。其中页面的HTML和Java代码全部包含在文件内。访问jsp页面,就是访问这个Servlet文件,会使其中的Service()方法执行。
      b. index_jsp.java文件内的类继承了HttpJspBase.HttpJspBase是一个Servlet,所以当前类也是一个Servlet
      c. 实验:
      i. 自行寻找work目录下的jsp页面
      work目录:[tomcat]/work/Catalina/[localhost]/……

    2. 模板元素
      语法:
      页面中的html元素在被访问时,会被jsp翻译引擎翻译为模板元素。

      页面中的模板元素,在翻译为servlet文件后,会以out.write()的方式输出到浏览器中。

    3. JSP脚本表达式
      语法:<%=JSP脚本表达式%> 直接量或具有返回值的表达式request.getContextPath()
      脚本表达式会被jsp翻译引擎翻译为表达式的结果值。

      页面中的jsp脚本表达式,在被翻译为servlet文件时,会放在servlet文件对应的位置上,在计算结果后,通过out.print()输出到页面。

    4. JSP脚本片段
      语法:<%JSP脚本片段%>
      脚本片段会被jsp翻译引擎翻译为java代码。

      页面中的JSP脚本片段,在被翻译为servlet文件时,会被原封不动的翻译成java语句,出现在servlet文件的对应位置。并且脚本片段可以书写成多个部分。每一个部分都可以不完整。但是需要保证这些不完整的部分在翻译为servlet文件后,可以组成完整的java代码,即可编写。

    5. JSP声明
      语法:<%!jsp声明%>
      页面中的jsp声明,在被jsp翻译引擎翻译为servlet文件时,会变成成员变量或方法

      jsp声明可以看做是整个类的变量和方法,如果需要调用,则可以在页面中的任意位置调用。

    6. JSP注释
      语法:<%-- JSP注释 --%>

      HTML注释会被翻译为模板元素,但是由于是HTML注释的内容,所以不会在页面中产生输出

      <%//java注释%> java注释会被翻译为java代码,出现在servlet文件对应的位置,由于是注释,所以不会产生任何的代码输出。
      <%-- JSP注释 --%> jsp注释在被翻译为servlet文件的过程中,就会被抛弃。不会出现在servlet文件中。注意:慎用!

    7. JSP指令
      语法:<%@ 指令名称 属性名=“属性值”%>
      <%@ page language=“java” import=“java.util." pageEncoding=“utf-8”%>
      jsp指令本身不产生任何的输出,只是用来规定jsp翻译引擎如何翻译当前页面的。
      注意:jsp指令可以出现在页面中的任意一行。
      jsp指令可以在页面中多次出现。
      a. jsp指令形式:
      page指令 用于规定jsp翻译引擎如何翻译当前页面
      include指令 用于导入页面
      taglib指令 用于引入外部的标签库
      i. page指令:
      声明当前jsp页面的基本属性。控制jsp翻译引擎如何翻译jsp到servlet。
      language=“java” 当前JSP使用的开发语言
      extends=“package.class” 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况下不要改 HttpJspBase
      import="{package.class | package.
      }, …” 导入需要使用到的包 java.lang.;javax.servlet.;javax.servlet.jsp.;javax.servlet.http.;
      session=“true | false” 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定jsp中不需要session可以设为false
      [ buffer=“none | 8kb | sizekb” ] out隐式对象所使用的缓冲区的大小
      [autoFlush=“true | false”] out隐式对象是否自动刷新缓冲区,默认为true,不需要更改
      [ isThreadSafe=“true | false” ] 翻译过来的servlet是否实现SingleThreadModel
      [ errorPage=“relative_url” ] 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用.在web.xml中可以配置标签,用户作为整个web应用的友好错误提示页面。
      [ isErrorPage=“true | false” ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象
      [ contentType=“mimeType [ ;charset=characterSet ]” | “text/html ; charset=ISO-8859-1” ] 和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码
      [ pageEncoding=“characterSet | ISO-8859-1” ] 服务器翻译jsp时使用的编码集.如果向防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性.
      b. include指令
      <%@include file=“url”%>
      引入其他页面

      <%@include file="/head.jsp" %>
      this is index
      <%@include file="/foot.jsp" %>

      c. taglib指令
      <%@taglib uri="" prefix=""%>
      引入外部的标签库

    8. 九大隐式对象
      在jsp页面被翻译为servlet文件之后,有九个对象可以直接使用,又没有显式的定义,所以这九个对象就称之为九大隐式对象
      page 代表servlet文件的隐式对象
      request 代表HTTP请求隐式对象
      response 代表HTTP响应隐式对象
      application 代表当前web应用的隐式对象
      config 代表当前servlet配置信息的隐式对象
      session 代表session会话的隐式对象
      out 代表向页面输出的缓冲区的隐式对象out.write ()out.print()
      exception 代表上一个页面错误信息的隐式对象
      pageContext 代表当前jsp页面上下文的隐式对象

    9. pageContext详解
      pageContext代表的是当前jsp页面上下文的隐式对象。可以在jsp页面内直接调用。
      a. pageContext功能一–其他八大隐式对象的入口
      pageContext.getPage();—获取page隐式对象
      pageContext.getRequest();—获取request隐式对象
      pageContext.getResponse();—获取response隐式对象
      pageContext.getSession();—获取session隐式对象
      pageContext.getServletConfig();—获取config隐式对象
      pageContext.getServletContext();—获取application隐式对象
      pageContext.getException();—获取exception隐式对象
      pageContext.getOut();—获取out隐式对象
      b. pageContext功能二–作为域对象使用
      域对象:如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,这个对象就可以称之为域对象。
      操作api:
      setAttribute(String name,Object obj);
      getAttribute(String name);
      removeAttribute(String name)
      getAtrributeNames();
      生命周期:
      在访问jsp页面时,产生pageContext对象,生命周期开始。
      在结束访问jsp页面是,pageContext对象销毁,生命周期结束。
      作用范围:
      整个jsp页面。
      主要功能:
      在整个jsp页面内共享数据。
      i. 案例操作pageContext域中属性

      功能二–pageContext作为域对象使用


      <%
      pageContext.setAttribute(“name”, “丽丽”);
      %>
      <%=pageContext.getAttribute(“name”) %>

      c. 功能三–操作其他域中属性:
      setAttribute(String name Object obj,int scope);//scope
      getAttribute(String name,int scope);
      removeAttribute(String name scope);
      getAttributeNamesInScope(int scope);

      功能三–获取设置其他域中的值


      <%
      pageContext.setAttribute(“country”, “China”, PageContext.APPLICATION_SCOPE);
      pageContext.setAttribute(“country”, “US”, PageContext.SESSION_SCOPE);
      pageContext.setAttribute(“country”, “UK”, PageContext.REQUEST_SCOPE);
      pageContext.setAttribute(“country”, “Canada”, PageContext.PAGE_SCOPE);
      %>
      <%=pageContext.getAttribute(“country”, PageContext.APPLICATION_SCOPE) %>
      <%=pageContext.getAttribute(“country”, PageContext.SESSION_SCOPE) %>
      <%=pageContext.getAttribute(“country”, PageContext.REQUEST_SCOPE) %>
      <%=pageContext.getAttribute(“country”, PageContext.PAGE_SCOPE) %>

       PageContext.APPLICATION_SCOPE	application域
       PageContext.SESSION_SCOPE	session域
       PageContext.REQUEST_SCOPE	request域
       PageContext.PAGE_SCOPE	page域
      

      d. 功能四—自动搜寻域
      使用自动搜寻域,会由小到大的搜索四个域中指定名称的域属性。一旦在较小范围内搜索到结果,则不会再向更大范围的域进行搜索。

      自动搜寻域


      <%=pageContext.findAttribute(“country”) %>
      e. 功能五—便捷的请求转发
      pageContext.forward(url);

    10. 作用域概述
      作用域:一个可以共享数据的范围可以称之为作用域。

    11. 四大作用域:
      由大到小排序:
      a. ServletContext — application
      代表当前web应用的对象
      生命周期:
      当web应用被加载,servletContext对象创建。
      当web应用被销毁,servletContext对象销毁。
      作用范围:
      整个web应用。
      主要功能:
      在整个web应用中共享数据。
      b. Session — session
      代表当前会话的对象
      生命周期:
      request.getSession()方法调用的时候,session对象产生
      意外身亡:服务器意外关闭,session会立刻销毁。如果服务器正常关闭,数据会以文件的形式保留在磁盘上,这个过程称之为钝化。在服务器再次启动时,会重新读取这个文件,这个过程称之为活化。
      自杀:调用session.invalidate()可以主动释放session对象。
      超时死亡:如果一个session超过30分钟没有被使用,则会由服务器将其销毁。这个销毁的时间可以通过web.xml中的session-config标签来设置。默认为30分钟。
      作用范围:
      整个会话范围
      主要功能:
      在整个会话范围内实现数据共享
      c. request — request
      代表HTTP请求对象
      生命周期:
      请求链起始时,request对象创建。
      请求链结束是,request对象销毁。
      作用范围:
      整个请求链。
      主要功能:
      在整个请求链中共享数据。
      d. pageContext —pageContext
      生命周期:
      在jsp页面被访问时创建。
      在jsp页面结束访问时销毁。
      作用范围:
      整个jsp页面
      主要功能:
      在整个jsp页面内共享数据

  2. 标签技术概述
    在jsp页面中有HTML语句和java语句相互嵌套,如果java的逻辑代码和页面的HTML组成代码都十分复杂,两者有掺杂在一起,页面的可读性和可维护性都将降低。为了解决这个问题,产生了标签技术。用它来替换页面中的java语句,这样页面中只会出现HTML代码,整体的可读性和可维护性都会提升。

    1. 常用的JSP标签技术
      jsp标签
      sun公司提供的标签技术 - 目前用的比较少
      el表达式
      便捷易用 - 使用非常广泛 - 但只是表达式无法实现复杂功能
      jstl标签库
      提供了大量强大的标签支持,是目前应用最广泛的标签库
      自定义标签
      sun提供的标签库开发接口,允许开发人员自己来开发特定功能的标签 - 通常用在框架级别的开发中,普通开发人员很少使用
      其他第三方标签
      以后了解

    2. EL表达式概述
      在jsp页面内的<%= JSP脚本表达式%> 都可以使用EL表达式来替换。
      EL Expression Language 表达式语言
      在javaee5及其以上版本中,都已经默认包含了el表达式的相关开发包,无需手动导入。

    3. 使用方式
      语法:${ el表达式 }
      可以获取常量、变量、数组、列表、映射、javabean等中的数据

    4. EL特点:
      EL表达式不能设置值,只能获取值
      EL表达式只能获取域中的属性
      EL表达式不能遍历

    5. 获取常量

      el表达式获取常量

      <%=123 %> <%=123.123 %> <%="abc"%> <%=true%> ${123 } ${123.123 } ${"abc" } ${true }
    6. 获取变量
      a. 获取指定域中的属性

      el表达式获取域中的变量


      <%
      pageContext.setAttribute(“name”, “朴大胖”, PageContext.APPLICATION_SCOPE);
      pageContext.setAttribute(“name”, “曹二胖”, PageContext.SESSION_SCOPE);
      pageContext.setAttribute(“name”, “李三瘦”, PageContext.REQUEST_SCOPE);
      pageContext.setAttribute(“name”, “丽丽”, PageContext.PAGE_SCOPE);

         	 %>
         	<%=pageContext.getAttribute("name") %>
         	<%=request.getAttribute("name") %>
         	<%=session.getAttribute("name") %>
         	<%=application.getAttribute("name") %>
         	${pageScope.name}
         	${requestScope.name}
         	${sessionScope.name }
         	${applicationScope.name }
       i. el表达式中的四大作用域
       	el表达式	jsp脚本表达式
       	pageScope	PAGE_SCOPE
       	requestScope	REQUEST_SCOPE
       	sessionScope	SESSION_SCOPE
       	applicationScope	APPLICATION_SCOPE
      

      b. 自动搜寻域

      自动搜寻域


      <%=pageContext.findAttribute(“name”) %>
      ${name}
      c. 获取数组中的数据

      获取数组中数据


      <%
      String[] names ={“a”,“b”,“c”,“d”};
      pageContext.setAttribute(“names”, names);
      %>
      ${names[0]}
      ${names[1]}
      ${names }
      d. 获取链表中的数据

      获取链表中的数据


      <%
      List list = new LinkedList();
      list.add(“aaa”);
      list.add(“bbb”);
      list.add(“ccc”);
      pageContext.setAttribute(“l”, list);
      %>
      ${l[0]}
      e. 获取映射中的数据

      获取映射中的数据


      <%
      Map<String,String> map = new HashMap<String,String>();
      map.put(“name”, “自行车”);
      map.put(“age”, “18”);
      map.put(“wife”,“丽丽”);
      map.put(“addr”, “安徽”);
      request.setAttribute(“map”, map);
      request.setAttribute(“w”, “wife”);
      %>
      ${map}
      ${map.name}
      <%-- ${map.wife.first} --%>
      ${map[“wife”] }
      [wife]: ${map[w]}
      f. 获取javabean中的数据
      在一个类中,如果存在私有化属性,这些属性包含get或set任意一个方法,则这些私有化的属性就可以称之为javabean属性,类中存在这些属性,这个类就是javabean的类。

      获取javabean中的数据


      <%
      Person p = new Person(“阿斯顿”,18,“女”);
      pageContext.setAttribute(“p”,p);
      %>
      <%=p.getName() %>
      p . n a m e i . 在 j s p 脚 本 表 达 式 中 使 用 p . g e t X x x ( ) 方 法 获 取 的 数 据 , 在 e l 表 达 式 中 都 可 以 使 用 {p.name} i. 在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用 p.namei.jsp使p.getXxx()el使{p.xxx}的方式来获取。
      ii. 如果javabean中的getXxx()方法发生了修改,则el表达式也要随之修改。
      例如:
      getName() ${p.name}
      getNamex() ${p.namex}

    7. 获取执行运算的结果
      a. 算术运算

      算术运算

      ${3+2}
      ${3-2}
      ${3/2 }
      ${3*2 }
      ${3%2 }
      ${3+“2”}
      ${3-“2” }

      b. 关系运算
      关系运算

      ${3>2 }
      ${3<2 }
      ${3==2 }
      ${3!=2 }
      ${3>=2 }
      ${3<=2 }
      c. 逻辑运算
      逻辑关系

      ${true && false }
      ${true and false }

         	${true || false }
         	${true or false }
         	
         	${!true }
         	${not true }
      

      d. empty运算
      empty运算用于判断当前域中属性是否为空。
      Empty运算规则:如果对象为null 字符串为空 集合、数组、映射没有任何元素 empty操作都会返回true,否则false

      empty运算

      <%
      String str = null;
      pageContext.setAttribute(“str”, str);

       	  		String s ="";
       	  		pageContext.setAttribute("s", s);
       	  		
       	  		String[] names = {};
       	  		pageContext.setAttribute("names", names);
       	  		
       	  		List list = new LinkedList();
       	  		pageContext.setAttribute("list", list);
       	  		
       	  		Map<String,String> map = new HashMap();
       	  		pageContext.setAttribute("mapx", map);
       	  		
       	  		List listx = new LinkedList();
       	  		listx.add("abc");
       	  		pageContext.setAttribute("listx", listx);
       	  	 %>
       	  	 ${empty str }
       	  	 ${empty s } 
       	  	 ${empty names}
       	  	 ${empty list }
       	  	 ${empty mapx }
       	  	 ${empty listx }
      

      e. 三元表达式运算

      三元表达式

      <%
      Map<String,String> mapx = new HashMap();
      mapx.put(“name”, “”);
      pageContext.setAttribute(“mapx”, mapx);
      %>
      ${empty mapx.name?“曹洋”:mapx.name}

    8. el表达式的内置对象–11个
      a. el表达式中的域对象 —4个
      pageScope
      requestScope
      sessionscope
      applicationScope

      b. 代表请求头的内置对象
      header 获取一个返回值为Map<String,String>的内置对象
      headerValues 获取一个返回值为Map<String,String[]>的内置对象
      request.getHeader(“host”)
      ${header.host}
      c. 代表请求参数的内置对象
      param 获取一个返回值为Map<String,String>的内置对象
      paramValues 获取一个返回值位Map<String,String[]>的内置对象
      request.getParameter(“username”)
      ${param.username}
      d. 获取初始化请求参数的内置对象
      initParam 获取一个返回值为Map<String,String>的内置对象
      initParam.url
      e. 获取浏览器中的cookie信息的内置对象
      cookie 获取一个返回值为Map<String,Cookie>的内置对象
      cookie.JSESSIONID.name
      cookie.JSESSIONID.value
      f. 获取pageContext内置对象
      <%=request.getContextPath()%>
      ${pageContext.request.contextPath}

    9. el表达式调用java方法
      略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值