动态网页开发技术(三):jsp

Jsp概述

java server pages—java服务器页面,是一种动态网页技术标准,在传统的网页HTML中插入Java程序段(Scriptlet和JSP标记tag),从而形成JSP文件。JSP=HTML+Java代码+JSP自身东西。

因为Servlet存在如下缺点,所以sun公司开发了新的动态网页开发技术JSP
Servlet的缺点:
Servlet需要进行配置,不方便维护
Servlet很难向网页中输出HTML页面内容

jsp的运行原理,浏览器发送请求到服务器,服务器找到对应的jsp文件,将其翻译成Java文件并编译生成class文件,运行该class文件,最终将结果响应到浏览器

Jsp的脚本元素(Jsp中嵌入JAVA代码)

声明标签:<%! 变量或方法声明 %>
写在这个脚本中的代码,会被翻译成Servlet内部的成员变量或成员方法。一般不适用,因为Servlet是线程不安全的,如果定义了成员变量就会有线程安全问题。
表达式标签:<%= 表达式 %>
写在这个脚本中的代码,会被翻译成Servlet中方法内部的out,print()当中的内容。
程序代码标签:<% 程序代码 %>
写在这个脚本中的代码,会被翻译成会被翻译成Servlet中方法内部的局部变量或者方法内部的代码片段。

JSP的开发模式之MVC模式

动态网页开发模式的发展:
Servlet(显示HTML元素非常麻烦)
—>JSP(优点:显示数据非常方便; 缺点:数据的封装和处理)
—>JSP+JavaBean(显示数据和封装数据非常方便但是维护麻烦)
----JSP开发模式一:使用JSP显示数据,使用JavaBean封装和处理数据,只能开发简单应用
—>JSP+Servlet+JavaBean
----JSP开发模式二:使用JSP显示数据,使用JavaBean封装和处理数据,使用Servlet控制调度
即MVC开发模式:Model(模型层) View(视图层) Controller(控制层)
请求—>Servlet(控制层)—>JavaBean(Model)Servlet根据请求决定具体调用Java类去封装 和处理数据—>JSP(View)最后Servlet再决定输出到哪个页面
开发中的路径问题
在页面中点击链接或表单时,数据提交到Servlet中,如何编写从页面向Servlet发送请求的地址(路径)
相对路径:
在根路径下的页面访问Servlet 在当前目录下查找 Servlet名 或者 ./Servlet名
在某个目录下的页面访问Servlet 向上一层路径 …/Servlet名
绝对路径:通常以 / 开始
在根路径下的页面访问Servlet
在某个目录下的页面访问Servlet
都使用 /工程名/Servlet名
注意:绝对路径分为客户端路径和服务器端路径
客户端路径 需要带工程名
服务器端路径 不需要带工程名

请求转发和重定向

请求转发:
原理(执行流程):
(1)客户端向服务器发送请求,Servlet做出业务逻辑判断;
(2)Servlet调用forward()方法,服务器把目标资源返回给客户端浏览器。
WEB客户端—请求—>服务器Servlet—>JSP—>客户端
request.getRequestDispatchar(URL地址).forward(request,response);
用的是服务器端路径,不需要带工程名。
重定向:
原理(执行流程):
(1)客户端向服务器发送请求,Servlet做出业务逻辑判断;
(2)Servlet调用sendRedirect()方法,服务器把要访问的目标资源作为response响应头信息发给客户端浏览器
(3)客户端浏览器重新访问服务器资源***.jsp,服务器再次对客户端浏览器做出响应。
WEB客户端—请求—>服务器Servlet—>JSP—>客户端
使用HttpServletResponse对象中的 sendRedirect(String location)
response.sendRedirect(URL地址)
用的是客户端路径,需要带上工程名。

两者的区别:
(1)请求转发是一次请求一次响应;重定向是两次请求两次响应;
(2)请求转发地址栏不发生变化,重定向地址栏会发生变化;
(3)请求转发路径不带上工程名,重定向需要带上工程名路径;
(4)请求转发只能在本网站内部,即只能转发web服务器内部资源,不能跨域访问,重定向可以定向到任何网站资源。所以如果使用request域去保存数据,只能使用请求转发,不能使用重定向。request域去保存数据只在本次请求有效,每次该请求对应的响应结束之后,request都会被销毁,里面的数据就不会再保留。

总结:如果需要使用request进行值传递,需要通过请求转发完成。如果页面需要跳转到其他网站上则必须使用重定向。

JSP指令元素

语法:<% @ 指令名称 属性名称=属性值 属性名称=属性值 %>
分类:
page指令:指示JSP的页面设置属性和行为,定义JSP文件的全局属性
<% @page 属性名称=属性值 属性名称=属性值 … %>
只有import属性可以多次出现,其他属性只能出现一次
language属性:声明使用脚本的语言。目前只能是java
extends属性:标明JSP编译成Servlet的时候继承的类。默认是HttpJspBase
session属性:标明JSP中是否可以直接使用session对象。默认是true
buffer属性:标明JSP对客户端输出缓冲区大小,默认大小是8kb
autoFlush属性:如果缓冲区大小溢出,是否自动刷出,默认是true
import属性:用于导入Java的包或类(快捷键 Alt+/)
contentType属性:标明JSP被浏览器解析和打开时采用的默认的字符集
pageEncoding属性:JSP文件及JSP翻译后的Servlet保存到硬盘上所采用的字符集
isErrorPage属性:处理JSP异常
errorPage属性:处理JSP异常
isELIgnored属性:通知JSP是否忽略EL表达式,默认是false

include指令:指示JSP包含哪些其他的页面
	写法:<%@include 属性名=属性值%>
	用于在JSP页面中静态包含一个文件,同时由该JSP解析包含的文件内容。
	file属性:指示JSP页面所包含的页面的路径
	<%@include file="被包含的页的路径"%>
	静态包含的原理:
		将被包含的页面的内容全都复制到当前JSP中,一起被翻译成一个Servlet,然后编译执行。
	注意:将被包含的页面中的结构去掉
		 在被包含的页面中定义的变量,在包含的页面中还可以使用
	动态包含:
	<jsp:include page=" " flush="true"/> 

taglib指令:指示JSP要包含哪些标签库
	写法:<%@taglib 属性名=属性值%>
	用于在页面中引入标签库
	uri属性:引入的标签库的路径
	prefix属性:引入的标签库的别名

pageContext对象

即页面上下文对象,代表的是当前页面运行的一些属性。它是java.servlet.jsp.PageContext类的实例对象.
作用:
提供了page范围的数据存取方法;
通过这个对象可以获得其他8个对象。
pageContext的API:
存入数据的方法: setAttribute(String name, object object)
获取数据的方法: getAttribute(String name)
移除数据的方法: removeAttribute(String name)
查找属性的方法: findAttribute(String name)
获得其他8个对象:get***()

JSP的四个作用范围

PageScope:页面范围
在当前的页面内有效,出了这个页面,用pageContext保存的数据就无效了。
RequestScope:请求范围
从客户端发送一次请求,服务器对这次请求作出响应之后,用request保存的数据就无效了。
SessionScope:会话范围
每个浏览器向服务器发送请求(可以是多次请求),直到会话结束(关闭浏览器或者手动清楚浏览器中的数据)。
ApplicationScope:应用范围
在整个应用(项目)中任意地方都可以获取。

pageContext对象可以向四个域范围存取数据:

page范围:
	pageContext.setAttribute(String name, object object)
	pageContext.getAttribute(String name)
request范围:
	request.setAttribute(String name, object object)
	request.getAttribute(String name)
	可以写成:
	pageContext.setAttribute(String name, object object,PageContext.REQUEST_SCOPE)
	pageContext.getAttribute(String name, PageContext.SESSION_SCOPE)
session范围:
	pageContext.setAttribute(String name, object object,PageContext.SESSION_SCOPE)
	pageContext.getAttribute(String name, PageContext.SESSION_SCOPE)
application范围:
	pageContext.setAttribute(String name, object object,PageContext.APPLICATION_SCOPE)
	pageContext.getAttribute(String name, PageContext.APPLICATION_SCOPE)

查找属性的方法: findAttribute(String name)

先根据小范围的名称进行查找,如果找到了就返回,如果没有找到就会去比其大一个的域范围查找。即优先从小范围开始找。

JSP的动作标签

用于在JSP页面中提供业务逻辑功能,避免直接在JSP页面写Java代码。
常用的动作标签:

<jsp:forward/>:请求转发   
	<jsp:forward page="跳转页面路径"></forward>
<jsp:include/>:动态包含
	<jsp:include page="被包含的页面路径2"></include>
	<jsp:include page="被包含的页面路径1"></include>
	本jsp内容
	<jsp:include page="被包含的页面路径3"></include>
	动态包含和静态包含的区别:
		动态包含中被包含的jsp会被独立编译执行,动态包含包含的是目标jsp的运行结果。
<jsp:param/>:多页面之间传递参数
	<jsp:forward page="跳转页面路径aaa,jsp">
		<jsp:param name="name" value="asd" />
	</forward>
	在aaa.jsp中可以接收到这个值
	<%= request,getParameter("name")%>
	现在基本不用,因为可以直接用其他域对象存取值。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天然首长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值