您的位置:首页 > Web前端 > JavaScript

个人学习笔记---JSP

2015-02-24 16:57 162 查看
1.JSP就是一个Servlet的另外一种形式,它的本质还是一个Servlet。

2.JSP执行方式:JSP--Servlet---*.class;而且只有第一次执行的时候进行转换编译,后面的直接调用class类。

3.但是JSP不需要进行注册(HTML存放在哪里JSP就存放在哪里)。

4.<%%>与<%!%>和<%=%>:前者定义局部变量和语句,第二个定义全部变量,第三个为表达式输出。
注:在jsp转换为servlet文件中可以发现,<%%>的语句时放在类的方法里;<%!%>语句时放在类里的。

5.当每次刷新时,成员变量一直存在,局部变量每次都重新声明是因为:JSP转为servlet运行的,既然是Servlet那么只会实例化一次(初始化一次,
销毁一次,提供服务多 次),刷新时都是同一个对象;而且局部变量时在_jspservice()方法里,(等同于Servlet的service()方法)都是由
容器调用对外提供服务的,所以每次刷新时都会调用 _jspservice()方法,那么_jspservice()方法里的变量也
自然重复声明了。

6.Directive:编译指令,相当于在编译期间执行的命令(action的区别)<%@ Directive 属性="属性值" %>
1)page的各个属性:buffer="none|kb size"---none:不缓冲,默认8K
2)session="ture|false"---在当前页面里能不能使用session对象,默认为true.
注:以上为不常见的属性,常见的略过。

7.静态包含和动态包含:前者先包含后编译;后者先各自编译,然后把编译后的结果整合到一起。
注:包含还有传递参数和不传递参数的。

8.编译指令不能传参数,这是因为编译指令在编译期间执行命令,还没有运行呢。

9.Action:动作指令,在运行期间的命令;jsp:属性(jsp:forward).

10.服务器跳转:发生跳转的事件是由服务器执行,客户端不知道,由服务器把A页面的request转发给B页面,由B页面response客户端,但是对于客户端来说,它不知道服务
器的中转过程,以为是A页面response给它,故此浏览器的地址栏是显示A页面的URL。(只有一次请求-响应)

11.客户端跳转:发生跳转的事件是由客户端执行,浏览器把request发到A页面,A页面response浏览器然后告诉浏览接下来要访问B页面,浏览器再次发起一次request到B页
面,然后B页面response浏览器,(两次请求-响应)

12常见的客户端跳转和服务器跳转
1)服务端跳转:错误页跳转;包含指令(<jsp:include page="receive.jsp">,也就是说receive.jsp可以接受参数);跳转指<jsp:forward..../>RequestDispather.forward()

2)客户端跳转:超链接跳转;定时跳转(response.setHeader("refresh","5;URL=hello.html"));response.sendRedirect();表单提交
注:客户端跳转的"/"表示的是服务器的根路径;服务器端跳转的"/"表示的是webapp的根路径(项目的跟路径);另外客户端跳转是整个页面执行完了再跳转,服务器端跳
转是一旦执行到跳转语句则立即跳转。

13.组件就是一系列的类综合在一起共同的对外提供服务,JavaBean(咖啡豆)。

14.javaBean就是一个java的类,不过此类有些特殊要求:
1)此类必须放入包中,在web中没有包的类是不存在的。
2)此类必须被声明为public,这样才能被访问。
3)此类中的属性必须是private(封装)。
4)封装的属性要想被外界操作那么就必须提供getXxx(),setXxx()。
5)此类必须最少有一个无参的构造器。

15.关于javaBean指令的解析:
1)id="objcetName" class="test.Test";相当于:Test objcetName = Test();通过反射机制调用无参构造器来初始化对象。
2)scope="page|request|session|application";相当于:page|request|session|application.setArrtibute("objcetName",objcetName);
注:也就是说在该属性的保存范围之内,该对象都会存在并可以使用。
3)<jsp:setParam name="objcetName" property="name" value="myName">相当于:objcetName。setName("myName");
注:这实际上依然是依靠反射机制完成的。
4)<jsp:getParam name="objcetName" property="name">相当于:objcetName。getName("myName");
例如:A页面设置了一个request属性保存范围的键-值对,然后服务器跳转到B页面时,拿到这个该保存的值。
执行过程:
A页面: test.Test objcetName = new Test();
request.setArrtibute("objcetName",objcetName);
//requset B页面

B页面: test.Test objcetName = (Test)request.getAttribute("objcetName");
if(objcetName == null) {
test.Test objcetName = new Test();
request.setArrtibute("objcetName",objcetName);
}

16.九大内置对象:
1)PageContext:Javax.servlet.jsp.PageContext;JSP页面的容器。
2)request:Javax.servlet.http.HttpServletRequest;用户的请求。
3)response:Javax.servlet.http.HttpServletResponse;响应用户的请求。
4)session:Javax.servlet.http.HttpSession;会话。
5)application:Javax.servlet.ServletContext;容器的上下文环境。
6)config:Javax.servlet.ServletConfig;服务器的配置信息.。
以下省略....

17.四种属性保存范围:
1)page(PageContext):当前页面有效
2)request:一次请求之内有效
3)session:一次会话之内有效
4)application:整个webapp有效
注:一个原则,能使用小范围的完成的就不要加大范围。PageContext对象可以单独设置4种属性保存范围

18.出现乱码的时候首先详细考虑,数据的提交到显示到底经历多少个环节。
1)转码:new String(str.getBytes("IS08859_1"),"GBK");这样的前提是首先知道它原来的编码以及你想要显示的编码。
2)request.setCharacterEnding("GBK");也就是说拿到请求参数的时候,先把这里面的内容转换为"GBK"的编码内容。
注:这些可以使用过滤器来完成。

19.编码问题:contentType:当服务器处理请求完之后,回应给浏览的内容类型,如:text/html;charset="gbk2312"表示回应的页面是html页面或者是
文本文档,其内容编码格式是:GBK2312;pageEncoding:JSP文件本身的编码格式,当JSP文件编译为.java(java文件)的时候使用的。

20.JSP编码的转换过程:
1)JSP编译成*.java,它(JSP编译器)会根据pageEncoding的设定来读取jsp文件,结果是由指定的编码方案翻译成统一的UTF-8java编码
(即*.java),如果pageEncoding设定错了,或者没有设定,出来的就是中文乱码。
2)是由JAVAC(java编译器)的Java源码至java byteCode的编译,不论JSP编写的时候用什么编码方案,经过这个阶段的结果全部都是UTF-8
的编码的java源码。JAVAC用UTF-8编码读取java源码,编译成二进制编码(.class),这是JVM对常数字串在二进制码内表达的规范。
3)是有Tomcat载入和执行java的二进制码,然后输出结果,这个输出的结果也就是在客户端见到的,是contentType发挥作用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsp