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),用户偏好
接下来,看到了再慢慢补充吧......
JSP 容易弄混的几点总结的更多相关文章
- Wpf border 容易弄混的两个属性
代码如下: <Border Margin=" > <Button Content="dafkafjk"></Button> </ ...
- js 数组容易弄混的那些方法
js数组中 我们很多数组的方法都知道其中的含义 但是每一次用的都不是很顺手 下边我给大家写了一个小小的demo 来理解那些 近似”双胞胎“的东西 // splice方法 var a=[1,2,3,4, ...
- Kindeditor(JSP)& 上传目录不存在
一.基本配置 Kindeditor是一款富文本编辑器,作用跟博客园写文章用的这个编辑器一样,都是为了让文本加入各种各样的修饰元素. 使用方法如下,解压缩,把期中的ASP\NET\PHP文件夹都删除,然 ...
- JSP技术基础(动态网页基础)
前言:如果说html为静态网页基础,那么jsp就是动态网页基础,两者的区别就是jsp在html的前面多加了几行而已.当然,jsp里面对java的支持度更高.要明白,js只是嵌入在客户端的小程序小脚本而 ...
- springMVC框架访问web-inf下的jsp文件
博客原文章:http://td.xue163.com/1042/1/10425265.html 用户提出问题:springMVC框架访问web-inf下的jsp文件,具体如下: 使用springMVC ...
- 关于springMVC框架访问web-inf下的jsp文件
问题:springMVC框架访问web-inf下的jsp文件,具体如下: 使用springMVC,一般都会使用springMVC的视图解析器,大概会这样配置 <property name=&qu ...
- js基础--javaScript数据类型你都弄明白了吗?绝对干货
欢迎访问我的个人博客:http://www.xiaolongwu.cn 数据类型的分类 JavaScript的数据类型分为两大类,基本数据类型和复杂数据类型. 基本数据类型:Null.Undefine ...
- Spring6:基于注解的Spring MVC(上篇)
什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...
- Struts2的OGNL表达式语言
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
随机推荐
- MSSQL 分组后取每组第一条(group by order by)
查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...
- 用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端
最近开发的一个项目主要有两个特点,这两点也是在项目开发前需要着重去规划解决方案的: 需要和Rest服务端请求大量的数据 同时这些数据本地也要保存到sqlite数据库 对于第一点,目前的Volley.G ...
- 服务发现:Zookeeper vs etcd vs Consul
[编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务 ...
- OpenGLES 2.0 可编程渲染管线
OpenGL ES 2.0 与 OpenGL ES 1.x 渲染管线的最大区别就是: 顶点着色器.片元着色器是可编程的,替代了原来的固定管线的很多功能.
- Linq之Linq to Sql
目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...
- Linq之Expression初见
目录 写在前面 系列文章 Expression 表达式树创建方式 一个例子 总结 写在前面 上篇文章介绍了扩展方法,这篇文章开始将陆续介绍在linq中使用最多的表达式树的相关概念,以概念及例子一一列出 ...
- AngularJs——grunt神器的使用
前面我们已经知道了如何安装grunt,本章节给各位道友介绍如何使用 grunt 的插件,grunt是重点在于如何配置使用 Gruntfile.js,官网上也有很多范例. 1,包装函数 module.e ...
- Moqui学习Day2
用户 本地化 消息和日志门面 用户门面用于管理当前用户和访问,登陆,授权及登出的信息.用户信息包括区域设置,时区以及币种/ec.user.nowTimestamp设置日期. 消息门面用于追踪用户的消 ...
- myeclipse自动import
不管包什么的 直接把代码全写出来 再按 ctrl + shift +o 这是自动导包的 前提是你写的代码是正确的
- hdu3397 线段树 成段更新
这题真的呵呵了.敲了很长时间,调了很多bug,把0 1 输出,解决了.最后想取反,怎么搞都有bug, 最后还是看了大牛们的博客.不过这题真的敲得爽,调bug时基本把线段树过程全部弄了一遍. #incl ...