jsp的简单使用

首先,我们需要提的一点就是,jsp和Servlet是有着千丝万缕的关系的。

jsp简介

jsp是一种动态网页技术标准。它出现的根本原因是为了简化servlet的设计,是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。

可见,jsp实际上是为了减少我们使用Servlet而开发出来的。

Servlet长什么样子呢?
这里写图片描述
可以看到这里面使用了大量的out.write语句去拼接HTML代码,这样极大的增加了开发的时间成本,消磨开发人员的耐心,要是某一行不注意出错,排查的时候也是一个很痛苦的过程。

不过这里注意,动态和静态的概念,html属于静态文件,而Servlet拼接HTML代码是为了生成一个动态页面。

jsp就是为了解决问题而出来救场的,所以动态页面的开发中,jsp的使用很广泛。

那么jsp是如何起作用的呢?
这里写图片描述

也就是说,jsp最后还是逃不掉变成Servlet的命运,只不过,我们不要再直接编写Servlet,jsp转换成Servlet这个过程都由jsp parser帮我们完成。

当你用web容器启动项目后,你发现,通过jsp文件生成了对应的java文件以及class文件,而这些文件中的内容就是Servlet。

jsp9个内置对象及4个作用域

request 请求对象                      类型 javax.servlet.ServletRequest      作用域 Request
response 响应对象                      类型 javax.servlet.SrvletResponse      作用域 Page
pageContext 页面上下文对象      类型 javax.servlet.jsp.PageContext    作用域 Page
session 会话对象                         类型 javax.servlet.http.HttpSession   作用域 Session
application 应用程序对象           类型 javax.servlet.ServletContext       作用域 Application
out 输出对象                               类型 javax.servlet.jsp.JspWriter          作用域 Page
config 配置对象                          类型 javax.servlet.ServletConfig         作用域 Page
page 页面对象                             类型 javax.lang.Object                      作用域 Page
exception 例外对象                     类型 javax.lang.Throwable                 作用域 page

jsp内置对象:可以不加声明和创建就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量

jsp9大内置对象:

1).request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。

2).response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。

3).session对象
session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例。
Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。session对象具有会话作用域。

4).out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象

5).page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例

6).application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。

7).exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象

8).pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。

9).config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)


这里面的四个作用域是什么概念呢?

page作用域就是仅在当前页面生效,跳出当前页面后,就会失效。

request作用域表示在当前请求中有效

一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。

也就是说,如果当前request请求失效,则在该域中的变量也会失效,比如刷新。

session作用域当前会话中有效

所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。

这个就是把浏览器关闭后,该作用域的变量就会失效。

application作用域在当前这个应用程序中有效

整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。

也就是说,只有在服务器关闭的时候,该域的变量才会失效。

jsp标签介绍

1.<c:if>标签
用来做判断的标签,常用判空,如下
使用empty关键字
<c:if test"${empty str}">其中str是相关的变量什么的
非空可以使用<c:if test"${!empty str}"><c:if test"${not empty str}">

集合判空另一种方法
<c:if test="${mdxDimensionInfoList=='[]'}">

2.<c:forEach>标签
遍历列表信息时使用
语法结构

<c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的状态" begin="循环从哪儿开始"  end="循环到哪儿结束"  step="循环的步长">

          循环要输出的东西

 </c:forEach>

varStatus属性可以方便我们实现一些与行数相关的功能

先就varStatus=“status”属性常用参数总结下:
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
${status.current} 当前这次迭代的(集合中的)项
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。

其中step步长就是一次跳跃几个,比如有12345,从1开始遍历,step=2,得到的结果就是1,3,5。

3.<%include%><%jsp:include%>
我们都知道在jsp中include有两种形式,分别是

<%@ include file=” ”%>
<jsp:include page=flush=”true”/>

前者是指令元素、后者是行为元素。

它们主要有两个方面的不同;
一:执行时间上:
<%@ include file=“relativeURI”%> 是在翻译阶段执行
<jsp:include page=“relativeURI” flush=“true” /> 在请求处理阶段执行.
二:引入内容的不同:
<%@ include file=“relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.
<jsp:include page=“relativeURI” flush=“true” />引入执行页面或servlet所生成的应答文本.

这里对翻译阶段进行一下说明:我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求。

Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类?JSP Page implementation class),并编译这个servlet。这两步就构成了翻译阶段.

Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件)。

更简单的说:

include是将静态资源贴到请求的jsp页面中
jsp:include是两个jsp页面进行一个通信,而不是组合成一个文件

jsp编码转换

关于JSP页面中的pageEncoding和contentType两种属性的区别:
pageEncoding是jsp文件本身的编码,contentType的charset是指服务器发送给客户端时的内容编码。
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8,第三阶段就是在客户端浏览器里看到的网页, 用的是contentType。
第一阶段是jsp编译成.Java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

第二阶段是由JAVAC的JAVA源码至Java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

第三阶段是Tomcat(或其的application Container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效而include指令就是在第一阶段之前执行的,注意这个是在第一阶段之前,所以,如果包含文件和被包含文件的文件编码不是utf-8,那么,该指令就会工作不太正常,不能正确的把被包含的文件从原来编码转换为包含文件的编码,就会出现乱码现象.

jsp位置

把那些限制访问的资源(比如说jsp源代码)放到Web应用的WEB-INF目录下,对于/web-INF/及其子目录,不允许直接的公共访问,所以就可以起到保护这些代码未经授权的访问和窥视,更好的保护了源代码。

基于Servlet的声明,WEB-INF不作为Web应用的公共文档树的一部分。因此,WEB-INF 目录下的资源不是为客户直接服务的。我们仍然可以使用WEB-INF目录下的JSP页面来提供视图给客户,客户却不能直接请求访问JSP。

放到WEB-INF目录下的文件是不允许采用redirect方式的跳转来访问的,但是forward可以



暂时对于jsp的介绍到此为止,由于这面的技术偏前端,暂时了解的还不是很充分,所以先挖坑,以后回来填坑
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值