一、JSP

1、什么是JSP

从用户角度来看,就是一个网页,从程序员角度看待,其实是一个Java类,它继承了servlet,所以可以直接说jsp就是一个servlet

2、为什么有JSP

html多数情况下用来显示静态内容,一成不变的。但是有时候我们需要在网页上显示一些动态数据,比如:查询所有学生的信息,根据姓名去查询某个具体学生。这些动作都需要去查询数据库,然后在网页上显示。html是不支持写Java代码的,JSP里面可以写Java代码。

3、怎么用JSP

  3.1、三个指令

   指令写法:  <%@ 指令名字 %>

   1、page指令:

    *language:表示JSP可以写Java代码

    *contentType:说明文件是什么类型,告诉浏览器是什么内容类型以及用什么编码    

      contentType="text/html;charset=UTF-8"

      text/html MIMEType 这是一个文本,html网页

    *pageEncoding JSP内容编码

    *extends用于指定JSP翻译成Java文件后,继承的父类是谁,一般不用该

    *import导包使用的,一般不用手写

    *session

      可选值有true or false

      用于控制在这个JSP页面里面,能够直接用session对象

      具体的区别是:查看翻译后的Java文件,如果该值是true,那么在代码里面会有getSession()的调用,

      如果是false:那么就不会有该方法的调用,也就是没有session对象。在页面上自然就不能使用session了。

    *errorPage

      指的是错误的页面,值需要给错误的页面路径

    *isErrorPage

      上面的errorPage指定错误的时候跑到哪一个页面去。这个isErrorPage是用于声明某个页面到底是不是错误的页面。

   2、include指令:

      包含另外一个JSP的内容进来:<%@ include file="other.jsp"%>把另外一个页面的内容拿过来,所有元素标签都包含进来

   3、taglib指令:

      <%@ taglib prefix="" uri=""%>       uri:标签库路径,prefix:标签库的别名(固定搭配)

  3.2、三个动作标签

    <jsp:include page=""></jsp:include>

    <jsp:param value="" name=""/>

    <jsp:forward page=""></jsp:forward>

  jsp:include

    包含指定的页面,这里是动态包含,也就是把包含的页面所有元素标签全部

  jsp:forword

    前往哪一个页面。

   和<% request.getRequestDispatcher("").forward(request,response); %>效果相同

  jsp:param

    意思是:在包含某个页面的时候,或者在跳转到某个页面的时候,加入这个参数。

    

    <jsp:forward page="03.jsp">
        <jsp:param value="address" name="beijing"/>
    </jsp:forward>

  <%= request.getParameter("address")%>//在03.jsp中获取传入的值

  3.3、九个内置对象

     所谓内置对象,就是我们可以直接在jsp页面中使用这些对象。不用创建

    - pageContent

    - request

    -session

    -application

    以上是四个作用域对象(作用域:表示这些对象可以存值,我们的取值范围有限定。setAttribute和getAttribute)

 

        使用作用域来存储数据<br>

        <%
            pageContext.setAttribute("name", "page");
            request.setAttribute("name", "request");
            session.setAttribute("name", "session");
            application.setAttribute("name", "application");
        %>
        
        取出四个作用域中的值<br>
        
        <%=pageContext.getAttribute("name")%>
        <%=request.getAttribute("name")%>
        <%=session.getAttribute("name")%>
        <%=application.getAttribute("name")%>                

    作用域范围大小:pageContext(作用域仅限于当前页面,还可以获取到其他八个内置对象) -- request(作用域仅限于一次请求,

    只要服务器对该请求做出了响应。这个值域中存的值就没了) -- session(作用域仅限于一次会话(多次请求与响应)当中) 。

    -- application(整个工程都可以访问,服务器关闭后就不能访问了)

    -out

    -response

 

    -exception

    -page

    -config

二、EL表达式

  是为了简化JSP代码,具体一点就是为了简化在JSP里面写的那些Java代码。

  *写法格式:${表达式}

  如果从作用域中取值,会先从小的作用域开始取,如果没有就往下一个作用域取,一直把四个作用域取完都没有,就没有显示。

1、如何使用  

  1.1、取出四个作用域中存放的值

<%
    pageContext.setAttribute("name", "page");
    request.setAttribute("name", "request");
    session.setAttribute("name", "session");
    application.setAttribute("name", "application");
%>
按普通手段取值<br>
<%=pageContext.getAttribute("name") %>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
<br>使用EL表达式取出作用域中的值<br>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
<br>

  1.2、如果域中所存的是数组

<%
	String [] a = {"aa","bb","cc","dd"};
	pageContext.setAttribute("array", a);
%>
使用EL表达式取出作用域中数组的值<br>
${ array[0] },${ array[1] },${ array[2] },${ array[3] }

  1.3、如果如果域中锁存的是集合

<%
    Map map=new HashMap();
    map.put("name", "zhangsan");
    map.put("age", 18);
    map.put("address", "北京..");
    
    map.put("address.aa", "深圳..");
    
    pageContext.setAttribute("map", map);
%>

  1.4、取出Map集合的值

<br>--------------Map数据--------------<br>
<%
    Map map=new HashMap();
    map.put("name", "zhangsan");
    map.put("age", 18);
    map.put("address", "北京..");
    
    map.put("address.aa", "深圳..");
    
    pageContext.setAttribute("map", map);
%>
${ map.name },${ map.age },${ map.address },${ map["address.aa"] }

2、取值细节    

  2.1、从域中取值。得先存值

<%
    session.setAttribute("name", "张三");
%>

<b>通过pageScorpe查找的结果为:</b>
${pageScorpe.name}<!-- 直接指定去pageScropename作用域找name -->
<br>

<b>直接查找结果为:</b>
${ name }<!-- 从page里找,如果没有去request中找,如果没有去session找,如果还没有去application中找 -->
<br>

<b>通过sessionScorpe查找的结果为:</b>
${ sessionScope.name }

  2.2、取值方式

  如果这份值是有下标的,那么直接使用[],如果没有下标,直接使用.的方式去取。

<%
    String[] array = {"aa","bb","cc","dd"};
    session.setAttribute("array", array);
%>
<%
    User user = new User("zhangsan",18);
    session.setAttribute("u", user);
%>

<b>这是用下标取到的内容:</b>
${ array[0] },${ array[1] },${ array[2] },${ array[3] }
<br>

<b>这是没有下标的情况</b>
${ u.name },${ u.age }

  以上代码运行效果如下:

  一般使用EL表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某个学生的姓名

3、EL表达式11个内置对象  

${对象名.成员}

-pageContext

作用域相关的对象

-pageScope

-requestScope

-sessionScope

-applicationScope

头信息相关对象

-header

-headerValues

参数相关对象

-param

-paramValues

 

-cookie

全局初始化参数

-initParam 

三、JSTL

全称:JSP Standard Tag Library(JSP标签标准库)

简化JSP的代码编写。替换了<% %>写法。一般与EL表达式配合

1、怎么使用

1.1、导入jar文件到工程的WebContent/Web-Inf/bin jstl.jar standard.jar

1.2、在JSP页面上使用taglib指令来引入标签库

2、常用标签

<c:set></c:set>

<c:if test=""></c:if>

<c:forEach></c:forEach>

*c:set

<!-- 声明一个对象name,对象的值zhangsan,存储到page(默认),指定是session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>

${sessionScope.name}

*c:if

判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出,c:if是没有else的 

<c:if test="${age>16 }" var="flag">
	年龄大于16岁......
</c:if>
<c:if test="age>=26">
	年龄大于26岁...
</c:if>

*c:forEach

<!-- 从1开始遍历到10,步长为2,得到的结果赋值给i,存储到page区域 -->
<c:forEach begin="1" end="10" var="i" step="2">
	${i }
</c:forEach>
<%
	List list = new ArrayList();

	list.add(new User("zhangsan",18));
	list.add(new User("lisi",28));
	list.add(new User("wangwu",38));
	list.add(new User("maliu",48));
	pageContext.setAttribute("list", list);
%>
<!-- var:遍历出来的每个元素用user去接收。item:表示遍历哪一个对象,注意,这里写的必须是EL表达式 -->
<c:forEach var="user" items="${list }">
	${user.name }--------${user.age }<br>