JavaWeb学习笔记5:JSP&JSTL

1-JSP介绍

JSP - Java Server Page
 从用户角度看,就是一个普通网页
 从程序员角度看,是一个Java类,他继承了Servlet,所以可以说JSP就是一个Servelt

为什么要有JSP?

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

jsp三大指令:
1、page 2、include 3、taglib
jsp九大内置对象:
1、request 2、session 3、response
4、out 5、aplication 6、config
7、jspcontext 8、exception 9、page

2-JSP Page指令

<%@ 指令名字 %> 里面可以规定jsp页面的一些属性设置

  • 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对象
    如果该值是true,那么在代码里面会有getSession()的调用
    如果该值是false,那么就不会有该方法调用,也就是没有session对象
  • errorPage
    指的是错误的页面,值需要给错误的页面路径
  • isErrorPage
    上面的errorPage 用于指定错误的时候跑到哪一个页面去,那么这个isErroPage就是声明某一个页面到底是不是错误的页面
3-JSP 常见指令与动作标签
  • taglib
    <%@ taglib prefix="" uri=""%>
    uri: 标签库路径、prefix : 标签库的别名
  • include
    <%@ include file="other02.jsp"%>
    背后细节:其实是把另外一个页面的所有内容拿过来一起输出,所有的标签元素都包含进来,所以有点臃肿
  • jsp:include
    <jsp:include page="other02.jsp"></jsp:include>
    包含指定的页面,这里是动态包含。也就是不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来
  • jsp:forward
    <jsp:forward page=""></jsp:forward>
    前往指定页面,内部实现的代码仍然是由Servlet完成:
    <% 
    	//请求转发
    	request.getRequestDispatcher("other02.jsp").forward(request, response);
    %>
    
  • jsp:param
    意思是:在包含某个页面的时候,或者在跳转某个页面的时候加入这个参数
    <jsp:forward page="other02.jsp">
    	<jsp:param value="beijing" name="address"/>
    </jsp:forward>
    
    在other02.jsp中获取参数:
    <br>收到的参数是:<br>	<%= request.getParameter("address")%>
    
4-JSP 内置对象(四个作用域)

所谓内置对象,就是我们可以直接在jsp页面中使用这些对象,不用创建,具体有下四个:
pageContext、request、session、application

  • 作用域
    表示这些对象可以存值,他们的取值范围有限定
    //分别存储不同作用域数据
    <%
    	pageContext.setAttribute("name", "page");
    	request.setAttribute("name", "request");
    	session.setAttribute("name", "session");
    	application.setAttribute("name", "application");
    %>
    //取出四个作用域中的值
    <%=pageContext.getAttribute("name")%>
    <%=request.getAttribute("name")%>
    <%=session.getAttribute("name")%>
    <%=application.getAttribute("name")%>
    
    作用域范围大小:
     pageContext — 当前页面显示
     request — 请求转发显示
     session — 重定向显示
     application — 服务器关闭前

四个作用域的区别:

  1. pageContext 【PageContext】
    > 作用域仅限于当前的页面
    > 还可以获取到其他八个内置对象
  2. request 【HttpServletRequest】
    > 作用域仅限于一次请求,只要服务器对该请求做出了响应,这个域中存的值就没有了
  3. session 【HttpSession】
    > 作用域限于一次会话(多次请求与响应)当中
  4. application 【ServletContext】
    > 整个工程都可以访问,服务器关闭后就不能访问了

其余内置对象:

  • out 【JspWriter】
  • response 【HttpServletResponse】
  • exception 【Throwable】
  • page 【Object】 — 就是这个jsp翻译成的java类的实例对象
  • config 【ServletConfig】
5-EL 表达式(取值用法 一)

1、取出4个作用域中存放的值

<%
	pageContext.setAttribute("name", "page");
	request.setAttribute("name", "request");
	session.setAttribute("name", "session");
	application.setAttribute("name", "application");
%>
<br>按普通手段取值<br>
<%= pageContext.getAttribute("name")%>
<%= request.getAttribute("name")%>
<%= session.getAttribute("name")%>
<%= application.getAttribute("name")%>

<br>使用EL表达式取出作用域中的值<br>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }

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

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

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

<%
	List li = new ArrayList();
	li.add("nihao");
	li.add("i,m");
	li.add("List");
%>
<br>使用EL表达式取出作用域中集合的值<br>
${li[0]},${li[1]},${li[2]}

4、取出Map集合的值

<%
	Map map = new HashMap();
	map.put("name", "zhangsna");
	map.put("age",18);
	map.put("address","北京..");
	map.put("address.aa","深圳..");
	pageContext.setAttribute("map", map);
%>
<br>使用EL表达式取出作用域中Map的值<br>
${map.name},${map.age},${map.address},${map["address.aa"]}
6-EL 表达式(取值用法 二)

取值细节:
1、从域中取值,得先存值

<%
//pageContext.setAttribute("name", "zhangsan");
session.setAttribute("name", "lisi...");
%>
<br>直接指定说了,到这个作用域里面去找这个name<br>
${ pageScope.name } 
<br>//先从page里面找,没有再去request、session、application找 <br>
${ name }
<br>指定从session中取值<br>
${ sessionScope.name }  

2、取值方式
如果这份值是有下标的,那么直接使用[]

<%
	String[] array = {"aa","bb","cc"}
	session.setAttribute("array",array);
%>
${ array[1] } --> 这里array说的是attribute的name

如果没有下标,直接使用.的方式去取

<%
	User user = new User("zhangsan",18);
	session.setAttribute("u", user);
%>
${ u.name }  , ${ u.age } 

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

EL表达式内置对象:

${ 对象名.成员 }
pageContext、pageScope、requestScope
sessionScope、applicationScope、header
headerValues、param、paramValues、cookie、initParam

7-JTSL 基本用法

EL没法做遍历工作,只能取值 JSTL可以则可以胜任这类工作
JSTL:JSP Standard Tag Library - JSP标准标签库
能够简化jsp的代码编写,替换<%%>写法,一般与EL表达式配合使用
JSTL引入方法:
1、导入JSTL支持jar文件jstl.jar和standard.jar
2、在页面上使用taglib引入标签库 1.0版本不支持EL表达式,引入1.1版本
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSTL常用方法:
1、<c:set></c:set>
2、<c:if test=""></c:if>
3、<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:set var="age" value="18" ></c:set>
    <c:if test="${ age > 26 }">
    	年龄大于了26...
    </c:if>
    <c:if test="${ age <= 26 }">
    	年龄小于了26...
    </c:if>
    ------------------------------
    //定义一个变量名 flag  去接收前面表达式的值,然后存在session域中
    <c:if test="${ age > 26 }" var="flag" scope="session">
    	年龄大于了26...
    </c:if>
    
  • c:forEach

//从1开始遍历到10,得到的结果,赋值给i,并且会存储到page域中,step增幅为2
step增幅为2的意思是:1 3 5 7 9,即输出间隔为2
<c:forEach begin="1" end="10" var="i" step="2">
	${i }
</c:forEach>
-----------------------------------------------
<!-- items : 表示遍历哪一个对象,注意,这里必须写EL表达式
	var: 遍历出来的每一个元素用user 去接收 -->
<c:forEach var="user" items="${list }">
	${user.name } ----${user.age }
</c:forEach>
8-综合案例:学生管理系统(*)

因为内容很多,可看之前写的一篇博客:Web项目-学生管理系统

自我总结

  内置对象要知道,EL表达式要会用,JSTL要掌握。
  学生管理系统出现的错误和改进持续了很长时间,所以现在还依稀记得那个思路。
  ——— 不积跬步,无以至千里;不积小流,无以成江海。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hillain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值