JSP:Java Server Pages
1.在传统的网页HTML文件中,加入java程序片段(Scriptlet)和JSP标签,就构成了JSP网页。 所有程序操作都在服务器端执行,网络上传给客户端的仅仅是得到的结果,这样大大降低了对客户浏览器的要求,即使客户浏览器端不支持Java,也可以访问JSP。
2.JSP执行流程
首先,用户对jsp发出request,然后利用服务器的JSP解析器jsp parser,会把JSP转化成一个.java文件,也就是Servlet。换句话说,JSP本源就是一个Servlet,JSP能实现的Servlet也能实现,Servlet能实现的,JSP 也能实现,他们其实是一回事,只不过写法不一样。
然后JDK 把.java文件编译成.class文件。然后执行,把response(静态的结果)返回给浏览器。 这些所有的东西都是在服务器完成的,客户端接收到的是静态的结果。
JSP最终都会转换成Servlet去执行。
3.JSP具体执行流程
如果.class已经存在就不会再去编译。当修改了JSP 就会重新编译。
4.JSP源代码包含了JSP元素和Template(模版) Data两类
Template Data是指JSP引擎(例如Tomcat)不处理的部分,也就是不处理的部分,写什么就显示什么。
JSP元素也就是java小脚本,标记为<% %>。
****************************************************************************************
JSP 语法分为三种不同的类型:
(1)编译器指令 例如<%@ page import="java.io.*"%>
(2)脚本语法:java小脚本,不是指JavaScript
(3)动作语法:例如<jsp:forward> <jsp:getProperty> <jsp:include>
脚本语法:
HTML注释:<!-- -->
HTML的注释会执行注释的内容,发送到客户端
<!-- new java.util.Date() --> 注释的内容就是 new java.util.Date()
<!-- <%= new java.util.Date() %> --> 注释的内容是 当前的系统时间
隐藏注释(JSP注释)<%-- --%>
JSP注释不会发送到客户端
声明 <%!声明;%>
<%! int a=3; %> (声明)(用的比较少,因为web是要多用户使用的)
<% int b = 3 %> (脚本段)
<%= a-- %>
<%= b-- %>
每次刷新a的值都会减一,但是b不会,b一直是3.
声明的变量,在jsp转换成servlet的代码中,是成员变量,而脚本段中的是 局部变 量,servlet又是单实例的,这样成员变量的值只有一个,互不影响。而局部变量每个用户访问时各有一份。访问一次,调用service方法,a的值减一,b的值也减一,当方法结束的时候,局部变量消失。 所以下一次刷新的时候a的值一直减小,b的值每次都是重新定义的3.
表达式 <%=表达式 %>
脚本段 <% 代码 %>
编译器指令:(常用page和include)
包含指令<%@ include file=" "%>
Page指令,用于定义JSP文件中的全局属性,作用于整个JSP页面,同样包括静态的包含文件。 无论把page指令放在页面的哪个位置作用范围都是整个页面。
属性:language="java"
import="{package.class} "
java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*这几个包在JSP 编 译时已经指定,不需要再导入。
taglib指令 <%@ taglib %>(标签库)
动作语法:
<jsp:forward>用于转向页面,在该指令后面的所有代码都没有机会执行了,因为页面的流程已经转向了另外一个页面了。
<jsp:forward page = "forwardTo.jsp ">
<jsp:param name="username" value="risl" />
</jsp:forward>
<jsp:include> 包含一个静态或动态文件,可以向被包含的页面里传参数。
*******************************************************************************************
JSP的内置对象:
内置对象就是服务器帮我们创建好的实例对象,可以直接使用,不用初始化之类的。
request 请求对象 javax.servlet.ServletRequest的子类
response 响应对象
pageContext 页面上下文对象
session 会话对象 javax.servlet.http.HttpSession的子类。
application 应用程序对象 javax.servlet.ServletContext的子类
out 输出对象
config 配置对象
page 页面对象
exception 异常对象
out.println()的换行是指源代码的换行,<br>是指页面上的换行。
request对象代表的是来自客户端的请求,例如哦我们在FORM表单中填写的信息。最常用的是getParameter(),getParameterNames()返回一个枚举(Enumeration),getParameterValues()返回一个String[]
getParameter 方法是getParameterValues方法的特例,表示请求参数只有一个,如果请求参数有多个,请使用getParameterValues方法。在多选框的情况下,需要使用getParameterValues方法来获取用户所选择的多个复选框的值。
resopnse对象代表的是对客户端的响应,也就是说可以通过response对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用out 对象即可。
pageContext对象直译时可以称作"页面上下文"对象,代表的是当前页面运行的一些属性,常用的方法包括findAttribute,getAttribute等方法。一般Servlet容器会使用该对象,用到的也不是很多。
session 对象代表服务器与客户端所建立的对话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在购物,客户轨迹跟踪等。 HTTP是无状态的协议,Web Server对每一个客户端都没有历史记忆,session是用来保存客户端的状态信息。session可以突破HTTP的无状态协议。常用的方法有setAttribute和getAttribute。
application对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMineType和getRealPath等。
out对象代表了向客户端发送数据的对象,与response不同的是,通过out对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过out对象直接向可短短写一个由程序动态生成HTML文件。常用的方法除了print和println之外,还包括clear,clearBuffer,flush,getBufferSize等,这是因为out对象内部包含了一个缓冲区。
config对象提供了一些配置信息,常用的方法有getInitParameter和getInitParameterNames以获得Servlet初始化时的参数。
page对象代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。
exception 对象则代表了JSP文件运行时所产生的异常对象,比对象不能在一般JSP文件中直接使用,而只能在使用了<%@ page isErrorPage="true" %>的JSP文件中使用。
***********************************************************************************
三种最重要的内置对象:
request请求对象:
1.getAttribute 与 getParameter的区别
getAttribute原型:public java.lang.Object getAttribute(java.lang.String name)以对象的形式返回特定名称的属性值。这个方法允许Servlet引擎给出一个客户请求的特定信息。
getAttribute总是获取服务器端设置的内容,跟客户端没有关系。与setAttribute一般是成对出现的。首先setAttribute设置属性与属性值,然后通过getAttribute方法获取属性值(获取到之后一般都要进行向下类型转换,将这个属性值转换为他真正的对象),这两个方法都是在服务器端内部执行的。
getParameter获取客户端的请求参数,是客户端与服务器端之间的交互。服务器端想要获取客户端发送过来的数据就要使用getParameter方法来获取。并没有setParameter方法。
3.request对象内数据的存活范围就是在request对象的存活范围内,当客户端向福务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了;之后再向服务器端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前request对象中存放的任何数据。
4.session对象内数据的存活范围也就是session对象的存活范围(现在可以简单理解成,只要浏览器不关闭,session就会一直存在,其实这是不正确的)因此在同一个浏览器窗口中,无论向服务器端发送多少个请求,session对象只有一个。
5.application(应用对象):存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在。在整个服务器运行过程当中,application对象只有一个。
6.request,session以及application这三个对象的范围是逐个增加的:request只有一个请求的范围内:request只在一个请求的范围内,session是在浏览器窗口内(不是很准确),application则是在整个服务器的运行过程中。
getRealPath()方法会返回资源在服务器上的绝对路径
application.getRealPath();