首页 > 代码库 > JSP 容易弄混的几点总结
JSP 容易弄混的几点总结
最近在做Java Web方面的整理,遇到些问题,发现自己印象也不是很深刻了,这里作下整理,以后遇到问题再更新。
一.<%@include file="页面名称"%>和<jsp:include page="页面名称"/>的区别
首先推荐观看博客园的这篇文章:http://www.cnblogs.com/Ghost-Draw-Sign/articles/1835974.html
简单说明一下我的理解:
<%@include file%>是jsp指令元素,效果为把目标页面的HTML/JSP代码在编译时全部直接复制粘贴到这个地方。
而<jsp:include page>是编译目标JSP页面。并通过一个方法把编译好的jsp文件以调用的形式生成在Servlet中。
<%@include file%>会毫无保留的把目标页面的内容插入到当前页面中,所以,比如说你在<body></body>中使用了<%@include file="hello.jsp">,则你的hello.jsp内容应该不要再包含<body>标签了,换言之,就不应该是一个完整的页面,而且不能出现重复的声明ContentType格式。大家可以编写两个都带有标准HTML格式的<html><head><body>的jsp文件,并在一个jsp文件中使用<%@include file%>包含另外一个jsp文件,编译后打开并查看源代码,你会发现这些HTML标签出现了两遍。
<jsp:include page>是JSP提供的动作标签,其效果为对目标文件单独进行编译成Servlet,并在源Serlvet中通过JspRuntimeLibrary.include方法在代码中引入。要求两个文件都能被单独编译,并且这个过程是在编译运行阶段执行的。
之前我在用Java写自己博客时也遇到了。一般而言更喜欢用<%@include file%>,把用到的css/js单独放到一个页面中,并且把上方的导航栏和右边的侧栏以及下方的说明栏也用这种形式引入,减少了代码的引入。<jsp:include>很少用,不过总体上效果应该都差不多。
二.<jsp:forword page/>的用法:
通常,我们不应该直接暴露jsp页面,而是客户端先访问一个URL地址,Web应用将该URL转发给处理器处理,处理器执行完返回jsp页面。所以,一般JSP文件应该放在WEB-INF文件夹中,这样客户便无法访问了。
现在举一个奇葩的例子:不使用WEB-INF方法:我想让客户直接访问index.jsp,里面包含了必须经过处理器返回的数据,但是直接访问index.jsp是无效的,你看,你直接访问.jsp文件我也能取到数据库中数据,Diao吧。可以有以下办法:
1.把原来的hello.jsp改名(比如ok.jsp),取名index.jsp
2.index.jsp只需要有这一句<jsp:forword page="initOKJSP.servlet"/>
<!--这个initOKJSP.servlet是用于处理生成jsp的Serlvet,最后把请求转发到ok.jsp-->
3.在浏览器输入~/index.jsp即可看到ok.jsp的页面效果
反正就是这么一个效果,在jsp页面中使用<jsp:forword>标签能直接把当前的请求转发到目标文件(可以是jsp,servlet甚至action),起到了缓冲的作用。不过推荐大家还是把jsp文件放到WEB-INF中,然后可以使用MVC框架对请求进行处理。
三.4种作用域和PageContext
JSP包含四种作用域,分别是page,request,session,application,相信搞Java的一定都很熟。这四种作用范围我分别总结如下:
page:相当与Servlet中的this,表示自身,换句话说,只在当前页面有效。
request:请求范围,使用请求转发时,地址URL不会变而页面会变,request的作用在这两张页面上(一般情况是两个,只要URL不改都是同一个request)
session:只要浏览器不关,一直是同一个session实例。sessionId放在本机,服务端根据id获取session内容
application:只要应用没有挂掉,全局共享
PageContext和Page不同,PageContext包含了所有与应用相关的对象的引用。从PageContext实例可以获取page,request,session甚至application,相反从这四个对象也可以获得PageContext。PageContext是宏观上的对象,对其进行set/getAttribute会依次从page,request,session,application中查找。
四.如何使用Jsp提供的变量保存数据?
以下是我个人简单的总结,希望和大家互相补充交流,有错误也请指出,谢谢~~
pageScope:无啥大用,可以放全局变量。话说与其用Java实现全局变量的功能倒不如使用JavaScript
requestScope:重要属性,包括表单提交,Service返回到页面的数据
sessionScope:购物车,用户在线状态
applicationScope:数据库连接池
cookie:用户账号(加密后密码),购物车(建议用cookie),用户偏好
接下来,看到了再慢慢补充吧......