jsp简介和el标签 jstl标签

来源:互联网 发布:pdf阅读器下载 知乎 编辑:程序博客网 时间:2024/05/20 01:44
1.jsp
 1.1 jsp简介
 (1) sun公司提供了动态网页开发技术:jsp, servlet
 (2)jsp本质是servlet,在首次访问jsp时,jsp会编译成servlet存放到tomcat的work目录下面。
 (3)jsp组成=html+java+jsp自身的东西
 (4)jsp嵌套java代码的三种方式:<%! %> ,<%  %>,<%= %>
 (5)jsp的注释有三种
    * html注释: <!--  --> :在任何情况下都存在
    * java注释: // , /*  */ , /** */,在编译成servlet后也存在,在网页的源文件不存在了.
    * jsp注释: <%--  --%>: jsp注释在编译成servlet后消失了.
1.2jsp的三大指令
(1)三大指令:page ,include,taglib
 语法格式:<%@ 指令名称    指令属性1="指令属性的值1" 指令属性2="指令属性的值2" %>
(2) page指令:
   属性:
 == language:表示jsp支持的语言,只支持java语言。
 == contentType:设置jsp向页面响应内容的编码
 == pageEncoding: jsp编译成servlet,使用编码方式的设置,优先权大于contentType
 == extends :jsp会编译成servlet,继承的类,默认继承的是HttpJspBase
 == session :jsp页面默认是可以直接使用session对象的,默认值true
 == import: 用来导入包,可以分开写,也可以写在一起 <%@ page import="java.util.List,java.util.ArrayList"%>
 == buffer:设置jsp对客户端输出的缓冲区的大小 8kb
 == autoFlush:如果内容超出缓冲区是否会正确输出 默认值是true
 == errorPage:如果jsp页面出现异常,设置跳转到错误页面
 == isErrorPage:在错误页面中是否显示错误信息,会使用到exception对象
 == isELIgnored:在jsp页面中是否忽略EL表达式的,设置为ture,就把el当成普通的字符串输出。
需要:contentType,pageEncoding,import记住这三个属性就ok.

(3)静态包含:include指令:<%@ include file="被包含的jsp页面路径" %>
  结论:多个jsp页面最终编译成一个servlet,多个jsp页面的内容合并输出.

(4)taglib指令:引入外部的jstl标签库
 <%@ taglib prefix="" uri="" %>
(5)jsp的九大内置对象:在jsp页面内部,不用创建可以直接使用的对象,就内置对象.
    request: HttpServletRequest,域对象,作用范围一次请求
    response:HttpServletResponse.响应对象
    session: HttpSession,域对象,作用范围一次会话。
    application:ServletContext,域对象,作用范围整个web项目
    config:ServletConfig ,servlet的配置对象
    page:Object,jsp的页面对象(代表jsp)
    pageContext: PageContext, 域对象,作用范围当前的jsp页面。
    out:JspWriter(PrintWriter)out可以向网页写数据。PrintWriter pw = response.getWriter();
    exception:Throwable,只有当前jsp页面设置isErrorPage="true"时,才会出现。
    九个内置对象都在_jspService方法内部?
    <%!    %> 在类的成员位置,_jspService方法外部,不能使用九个内置对象
    <%   %> <%=  %> 都是在_jspService方法内部,能使用九个内置对象
    重点:request、response,session、pageContext
(6)pageContext对象
==1.获取其它八个内置对象(掌握)
  比如: getRequest(), getSession(), getResponse();
==2.可以操作其它三个域对象(request,session,application)(了解)
   * pageContext域对象
    ==存值  void setAttribute(String,Object);
    ==取值  Object getAttribute(String);
   * 操作其它三个域对象
      ==存值  void setAttribute(String name, Object value, int scope) 
        参数1 :域对象的名称'
参数2: 域对象的值
参数3: 域对象的范围:
pageContext:PAGE_SCOPE
request:REQUEST_SCOPE 
session:SESSION_SCOPE 
application:APPLICATION_SCOPE 


      ==取值 getAttribute(String name ,int scope);
        参数1:域对象的名称
参数2:域对象的范围
  * findAttribute()方法:
    域对象范围:从小到大 pageContext-->request--->session--->application
    结论:findAttribute()方法,进行全域查找,首先找域对象作用范围小的,如果域对象作用范围小的不存在
 依次向下寻找

  * el表达式获取域对象中的值进行全域查找,先找域对象作用范围比较小.

2.el
2.1 el简介:
   el: express lanuage表达式语言,作用就是获取域对象中的值,只能在jsp页面使用。
   语法:${域对象的名称}
2.2 el获取数组、集合、对象中的值
   **1.获取数组中的值:通过数组的下标获取值。
代码:
<%
String[] strs ={"aa","bb","cc"};
request.setAttribute("arr",strs);

%>
${arr[0] }
${arr[1] }
${arr[2] }
  **2.获取list集合中的值:通过下标获取值,集合底层存数据依赖数组。
     代码:
<%
List<String> strs = new ArrayList<String>();
strs.add("张三");
strs.add("李四");
strs.add("田七");
request.setAttribute("list",strs);
%>
${list[0] }
${list[1] }
${list[2] }
    注意:set集合是无序的,不可以通过下标获取值。
 **3.获取map集合中的值:通过map的key,获取value
    代码:
      <%
Map<String,String> strs = new HashMap<String,String>();
strs.put("aaa", "AAA");
strs.put("bbb","BBB");
strs.put("ccc","CCC");
request.setAttribute("map",strs);
%>
${map.aaa}
${map.bbb }
${map.ccc }
   注意:如果说map中的key含有特殊字符,不能直接${map.key},而是${map["key"]}
**4.获取对象中的值。
    代码:
      <%
 User u = new User();
 u.setId("001");
 u.setUsername("zs");
 u.setPassword("123");
request.setAttribute("user",u);
%>
${user.id } ${user.username} ${user.password } 
2.3 el运算
  (1)数学运算:+ - / *
  (2)比较运算:> < >= <= !=
  (3)逻辑运算:&& || !
  (4) empty:判断对象是否为null,如果为null 返回 true ,不为 null ,返回false.
      not empty:判读对象不为null.
2.4 el中的11个内置对象
       ==四个域的范围:
    pageScope
requestScope
sessionScope
applicationScope
==请求头的数据:
header:获得请求头 等同于 request.getHeader();
headerValues:获得一个key对应多个的请求头 等同于getHeaders(String name) 
      比如:request.getHeader("User-Agent");
   ${header["User-Agent"];
==获取请求参数:
param:请求请求参数 等同于 request.getParameter();
paramValues:请求参数(接收一个名称对应多个值)等同于 request.getParameterValues();
比如:${param.username}====request.getParameter("username");
==获取cookie的名称和值
cookie:获取Cookie的数据,等同于 cookie.getName()和 cookie.getValue()
    ==获取其它八个内置对象
pageContext:就是jsp中内置对象pageContext
==获取web.xml文件中配置的全局参数:
initParam:获得全局初始化参数的值,等同于servletContext.getInitParameter();
     代码如下:
      <!-- header  -->
浏览器:${header["User-Agent"] }<br/>
host: ${header.host }
<hr/>
<!-- 获取项目名称  -->
项目名称:${ pageContext.request.contextPath}
<hr/>
<!-- 获取请求参数 -->
获取用户名:${param.username }


      重点记住:${ pageContext.request.contextPath}===pageContext.getRequest().getContextPath();
        request: pageContext.getRequset();
String webPath = requst.getContextPath();
  el: 掌握 * 获取域对象中的值, empty ,pageConext

3.jstl
(1) 什么是jstl:JSP Standard Tag Library,JSP标准标签库。
   **1.使用jstl标签:<%@ taglib uri="jstl标签库地址" prefix="标签的前缀"%>
比如:jstl很多的的标签:
核心标签: c:forEach
函数标签: fn:forEach
       jstl的作用:使用jstl和el 替换jsp的<% %>。
   **2.jstl是第三方的标签库:导入jar包两个,jstl.jar、standard.jar
   步骤:1.jstl是第三方提供的标签库,使用需要导入jar包:jstl.jar、standard.jar
        2.在jsp使用jstl标签库,通过taglib指令引入jstl标签库
<%@ taglib uri="标签库的地址" prefixe="标签的前缀" %>
(2)入门案例:
<!--jstl的判断标签  ,test属性 对应的 el-->

<c:if test="${10>5}">
10
</c:if>
(3)jstl的核心标签库:
* 1. 判断标签<c:if test=""> 数据123</c:if>
属性: test对应的值 就是使用 el表达式,如果el表达式返回的结果是true,就显示标签里面的"数据123";
  如果el返回的结果是false,那么标签内的"数据123"就不显示
代码如下:
 <%
//request.setAttribute("number","20");
request.setAttribute("number",null);
%>
<c:if test="${number=='10'}">
显示:10
</c:if><br/>


* 2.jstl的循环标签
* <c:forEach></c:forEach>
代码:
<c:forEach begin="1" end="10" var="i">
${i }<br/>
</c:forEach>
java代码:
for(int i=1;i<=10;i++){sysout(i);}
*3.jstl标签库遍历数组,集合,对象(list)中的值
 **(1)获取域对象里面list集合里面的值
    = 代码
   <!-- 使用jstl的forEach标签获取域对象里面的list集合的值 -->
   <%
//创建list集合
List<String> list = new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
//把list集合放到域对象里面
request.setAttribute("list", list);
    %>
   <!-- 使用el表达式获取里面list的值 -->
   ${list[0] }
   
   <hr/>
   <!-- 使用forEach标签获取值 -->
   <!-- 
for(String l : list) {}
    -->
   <c:forEach var="l" items="${list }">
${l } <br/>
   </c:forEach>




**(2)获取域对象里面set集合里面的值
= 使用el表达式不能获取域对象里面的set集合中的值,因为set集合无序的,不能通过下标获取
= 代码
   <!-- 使用jstl里面的forEach标签获取域对象里面的set集合的值 -->
   <%
//创建set集合,把set集合放到域对象里面
Set<String> set = new HashSet<String>();
set.add("WWW");
set.add("QQQ");
set.add("TTT");
request.setAttribute("set", set);
    %>
    <!-- 使用el表达式获取 -->
  <%--   ${set[0] } --%>
  <!-- 使用forEach标签获取 -->
  <c:forEach var="set" items="${set }">
${set }<br/>
  </c:forEach>


**(3)获取域对象里面map集合里面的值
= 使用el表达式获取域对象里面map集合值,根据map的key得到value
= 代码
   <!-- 使用jstl的foreach标签获取域对象里面map集合值 -->
   <%
//创建map,把map集合放到域对象里面
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "AAA");
map.put("bbb", "BBB");
map.put("ccc", "CCC");
request.setAttribute("map", map);
    %>
   <!-- 使用el表达式获取值 -->
   ${map.aaa }
   
   <hr/>
   <!-- 使用foreach标签获取值 -->
   <c:forEach var="m" items="${map }">
${m.key } , ${m.value } <br/>
   </c:forEach>

**(4)使用jstl的forEach标签获取域对象里面多个对象的属性的值
(1)如何把多个对象放到域对象里面
= 可以先把多个对象放到集合里面(list),再把list集合放到域对象里面
= 代码
   <!-- 把多个对象放到域对象里面 -->
   <%
//创建多个对象
User user1 = new User();
user1.setUsername("东方不败");
user1.setPassword("999");

User user2 = new User();
user2.setUsername("岳不群");
user2.setPassword("444");

User user3 = new User();
user3.setUsername("林平之");
user3.setPassword("666");

//把多个对象放到list集合里面
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
//把list集合放到域对象里面
request.setAttribute("list", list);
    %>

原创粉丝点击