Jsp

2 篇文章 0 订阅

Jsp

一、为什么要学习Jsp呢?

我们书写的项目或者工程,是动态web项目,肯定有动态数据的传递!
我们肯定会涉及到许多在页面中操作数据的情况!!!
比如:我们现在点击页面中的某个按钮时,请求后台需要得到所有的用户数据。我们需要在一个新的页面中,去将得到的所有数据,进行展示!也就是说,我们需要在页面中,对后台服务器得到的数据进行处理!!!

在以上的场景中,html本身是无法做到的,因为html本质上是一个静态页面!所以为了能够让项目的流程更加顺畅的执行下去,我们选用的页面是Jsp页面,因为Jsp页面是动态页面,可以在Jsp页面内进行数据操作!

二、Jsp认知

1、什么是Jsp?

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言(在Jsp页面中可以书写Java代码),为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码特定变动内容(jsp的独有标记、EL表达式、JSTL标签)嵌入到静态的页面(html)中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。
JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

总结:
Jsp是一种动态网页技术标准
Jsp的组成部分:java代码、特定变动内容、网页html
Jsp的运行机制

2、Jsp文件怎么创建呢?

首先要调整Jsp文件的编码格式,window -> Preferences
在这里插入图片描述
在这里插入图片描述
3、Jsp的运行机制是什么样的?
现象一:为什么第一次访问Jsp页面时,内容呈现的速度比较慢,而之后的每一次都非常快?
原因:因为当第一次访问Jsp页面时,Tomcat服务器中的Jsp编译器会将Jsp文件,编译成java类文件,然后再由java的编译器将类文件编译成二进制文件,最终交由jvm虚拟机运行!
所以,访问jsp,其实本质上是在运行java代码!!!
现象二:书写在Jsp页面中的java代码的确执行了,但是是怎么执行的?
现象三:访问Jsp页面后,浏览器中看到的网页内容是怎么呈现的呢?
在这里插入图片描述

原因:访问jsp实则是在发送请求给jsp,jsp针对请求可以做出响应!jsp接收请求、响应数据的位置,在jsp文件编译后的类中的_jspService方法中!在这个方法中,jsp文件中书写的java代码可以原样执行,而且网页内容,通过输出流响应数据的方式一点点写出去了!!!
所以说,不论一个jsp页面中的网页html多么复杂,浏览器都不能直接渲染,所有的内容都是通过输出流响应回去的

三、Jsp的独有内容

Jsp文件如何书写java代码?

<% 书写java程序代码 %>
<%=java的表达式、语句 %>将结果显示在浏览器页面内

在这里插入图片描述
如果一段程序代码中,既有java代码,又有其他语言的代码,可以使用<% %>做java代码段的拼接

四、如何在Jsp页面中操作后台传过来的数据

1、如何从后台传递数据到Jsp页面
使用域对象进行数据存储!

在这里插入图片描述
2、如何进行页面路径跳转
请求转发:

在这里插入图片描述
重定向:
在这里插入图片描述
举例:
苏艺、马文飞、赵一博三位烟民开始抽烟了~
请求转发:苏艺抽烟发现没烟了,向马文飞要烟,马文飞也没有,跟赵一博说苏艺没烟了,给苏艺跟烟,赵一博给了苏艺烟!
重定向:苏艺抽烟发现没烟了,向马文飞要烟,马文飞说滚,我也没了,你去找赵一博要。然后苏艺又去问赵一博要烟,赵一博给了苏艺烟!

3、如何在Jsp页面中对传递过来的数据进行处理
从域对象中获取到存储的数据,然后进行操作即可!
单一的对象:

在这里插入图片描述
一组对象:
在这里插入图片描述

  1. 数据操作的流程业务:
  2. 页面发送请求到Servlet
  3. Servlet执行方法得到数据
  4. 将数据存储到域对象中
  5. 跳转到数据操作页面
  6. 在页面中获取到数据,进行处理

五、jsp域对象

pageContext
request
session
application
以上书写域对象的顺序是按照作用域范围从小到大书写的!

案例测试:
先往四个不同的域对象中存放四个不同的数据:
在这里插入图片描述
案例1:在当前页面直接获取数据,发现都可以获取!

案例2:从当前页面使用重定向以及请求转发的方式,跳转到新的页面中,在新页面获取域对象中的数据
(1)、不管是使用请求转发还是重定向,发现都丢失了pageContext域对象中的数据,说明pageContext域对象的作用范围仅限于当前的页面,作用范围最小!!!
(2)、但是请求转发不会丢失request中的数据,重定向会,说明request域对象的作用范围仅限于一次请求!
(3)、不管是哪种方式进行路径跳转,都不会丢失session以及application中的数据,说明了session与application的作用范围大于request,而request大于pageContext!

案例3:使用重定向跳转到test.jsp页面后,复制url的访问路径,关闭浏览器,再次打开浏览器,直接访问test.jsp
(1)、丢失了session中的数据,而application中的数据依旧存在,说明作用域范围最大的是application!其作用范围为整个web项目的运行周期,也就是说服务器不关闭,这个数据就一直在!
(2)、session的作用范围仅限于一次会话,我们可以将浏览器窗口的关闭理解为一次会话的结束!

pageContext < request < session < application

只要想实现数据共享,肯定离不开域对象!那么我们在传递数据时,选取域对象的原则是
不是选作用域范围最大的,而是选择最适合于当前需求的!!

六、EL表达式

EL表达式,叫做表达式语言,用于在jsp页面中简化获取域对象中数据的过程!!!
数据准备:
在这里插入图片描述
在没有EL表达式的情况下,如何在jsp中获取域对象中的数据:
在这里插入图片描述
使用EL表达式后,获取域对象中的数据,就变得异常轻松!
在这里插入图片描述
七、JSTL标准标签库
jstl:jsp standard taglib jsp的标准标签库!
这玩意的作用:用标签来替代在jsp页面中书写的java代码!!!比如说恶心吧啦的循环迭代、分支判断等!!!
也就是说,以后在jsp页面中去操作数据,那么八九不离十离不开Jstl,而数据又是从域对象中带过来的,所以还离不开EL表达式!
所以我们说,Jsp的操作必备的两个技能:一个是EL,一个是JSTL!!!

JSTL标签库的分类:
core:核心标签库,这里面定义了许多Jsp页面中的操作标签,比如分支判断、循环迭代等
fmt:格式化库,用于在Jsp页面中对展示的数据进行格式化
function:函数库,定义了许多数据的操作函数
sql:数据库操作库,这个不用管,因为我们现在数据库操作都是jdbc
xml:xml标签库,这个不用管,用不到!

如果想要在Jsp页面中使用JSTL中的标签,那么我们需要做什么呢?
1、导包,导入jstl的相关jar包:jstl、standard
在这里插入图片描述在这里插入图片描述
2、在想要使用标签的Jsp页面中,导入要使用的标签库
在这里插入图片描述
3、使用引入的标签,完成数据操作

<%
		//初始化数据
		int a = -59, b = 90;
		User user = new User("小二黑", "123", "二黑", "110");
		User user1 = new User("小二狗", "456", "二狗", "119");
		User user2 = new User("小二蛋", "789", "二蛋", "120");
		List<User> users = new ArrayList<User>();
		users.add(user);
		users.add(user1);
		users.add(user2);
		//将数据存储到域对象中!
		request.setAttribute("a", a);
		request.setAttribute("b", b);
		request.setAttribute("users", users);
	%>
	
	<!-- 
		支持判断的标签c:if
			test属性中,书写的是判断条件,条件为真,则执行标签内部的代码!
			条件通常使用EL表达式来表示
		并没有提供c:else标签,那么如果有多种情况要进行判断该怎么处理呢?
			1、可以写多个c:if,表示所有的情况
			2、可以使用c:choose c:when c:otherwise的组合标签来进行多重判断!
	 -->
	 <c:if test="${a < b }">
	 		<h3>这就是jstl中用于判断的标签c:if</h3>	
	 </c:if>
	 <c:if test="${a >= b }">
	 		<h3>这是第二种情况</h3>
	 </c:if>
	 <!-- 
	 	多重判断的标签c:choose	c:when	c:otherwise
	 	比如a的值代表考试成绩
	 		a == 100,想去哪就去哪
	 		a >= 80 && a < 100,新马泰(新乡、马鞍山、泰州)三日游
	 		a >= 60 && a < 80,家里蹲老老实实学习
	 		a >= 0 && a < 60,男女混合双打
	 	判断条件写在c:when标签的test属性中,满足哪一个执行哪一个
	 	当所有的c:when条件都不成立时,执行c:otherwise中的代码
	 	c:choose用来包裹c:when以及c:otherwise
	  -->
	  <c:choose>
	  		<c:when test="${a == 100 }">想去哪就去哪</c:when>
	  		<c:when test="${a >= 80 && a < 100 }">新马泰(新乡、马鞍山、泰州)三日游</c:when>
	  		<c:when test="${a >= 60 && a < 80 }">家里蹲老老实实学习</c:when>
	  		<c:when test="${a >= 0 && a < 60 }">男女混合双打</c:when>
	  		<c:otherwise>您的成绩有误,请核实~</c:otherwise>
	  </c:choose>
	  <br />
	  
	  <!-- 
	  		支持在jsp页面内进行遍历迭代操作的标签c:forEach
	  			items属性就是要进行遍历的集合,使用EL表达式来获取!
	  			var属性就是为遍历到的每一个元素设置一个别名,操作这个别名就是操作每一个元素
	  			varStatus属性是记录循环状态的一个属性!
	  				${i.count }	取到的是当前遍历是第几次!!!从1开始
	  				${i.index } 取到的是当前遍历时下标是多少!!!
	   -->
	   <c:forEach items="${users }" var="user" varStatus="i">
	   		${i.count }---${user.username }---${user.password }---${user.uname }---${user.phone }<br />
	   </c:forEach>
	   <c:forEach begin="0" end="${users.size() - 1 }" varStatus="i">
	   		${i.count }---${users[i.index].username }---${users[i.index].password }<br />
	   </c:forEach>
	   
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值