本篇内容为读马月坤、赵全明两位老师编著清华大学出版社出版的《Java Web 程序设计与开发》的读书笔记。之前读了一天的人民邮电出版社的《JSP程序设计慕课版》,可能是我没有结合视频的缘故,感觉效果不好,因而换了这本书。
有关HTML和JS的东西直接略过了。
1、 因为JSP声明中的变量是全局变量,所以它可以在任何地方被使用。
2、 因为在JSP容器中,JSP会在运行前被转化为Servlet,而对于每一个Servlet,在运行的时候通常只会产生一个实例,如果此时多个客户端同时访问某一个Servlet的全局变量(实例变量),可能会引起多线程的问题,因此,在JSP中声明变量、方法的时候要注意同步问题。
3、 所谓Scriptlet,其实就是插入到JSP程序中的Java代码段。在JSP中,可以在任何地方插入任何数量的Scriptlet,但是需要注意的是,Scriptlet不能相互嵌套。
4、 JSP表达式
其基本语法:<%=expression%>
(1) JSP表达式只能单独出现,也就是说,不能再一对“<%”和“%>”之间出现多条语句;
(2) JSP表达式和普通的Java语句不同,不能用分号结束;
(3) JSP表达式的“<%=”、“%>”和expression只能在同一行上;
(4) “<%=”是一个完整的符号,中间不能有空格;
(5) 这个表达式必须能求职,表达式的值由服务器负责计算,并将计算结果用字符串的形式发送到客户端显示;
(6) 表达式expression必须能够转换成字符串形式。
5、/*看到这里感觉整个文件还是一个HTML文件,只不过有的部分是需要服务器计算然后把结果返回到客户端来显示的,Java代码就是服务器端要运行的依据,不知道正确与否*/
1、 JSP的9个内置对象
内置对象 |
类型 |
描述 |
作用范围 |
pageContext |
javax.servlet.jsp.PageContext |
代表当前正在处理的页面中的所有对象 |
page |
request |
javax.servlet.http.HttpServletRequest |
封装所有用户请求 |
request |
response |
javax.servlet.http.HttpServletResponse |
JSP向客户端发送响应数据 |
page |
session |
javax.servlet.http.HttpSession |
跟踪客户访问特定网络时间段的客户信息 |
session |
application |
javax.servlet.ServletContext |
表示所有用户的共享信息 |
application |
config |
javax.servlet.ServletConfig |
服务器配置可以取得初始化参数 |
page |
out |
javax.servlet.jsp.JspWriter |
页面输出 |
page |
page |
java.lang.Object |
代表当前页,取得当前页的属性和方法 |
page |
exception |
java.lang.Throwable |
代表当前页中的所有异常 |
page |
2、 内置对象的作用范围
在JSP中提供了4种属性的作用范围(scope)。所谓属性的作用范围,指的就是一个内置对象可以在多少个页面中保存并继续使用。四种属性范围分别如下:
page:只在一个页面中保存属性,跳转之后无效(不管是否人为干预);
request:只在一次请求中保存,服务器跳转之后依然有效(可以跨越多个页面,但必须在一次请求之内,再次人为干预则无效);
session:再一次会话范围中,无论何种跳转都可以使用,但是新打开的浏览器无法使用;
application:在整个服务器上保存,所有用户或所有的web应用都可以使用。
3、 不管是在单一页面中设置/取得属性值还是跨页面设置/取得属性值,在取得属性值时都要加入强制类型转换。
4、 关于request属性范围的理解:request表示的是客户端的请求,正常情况下,一次请求服务器只会给予一次回应,这时如果是服务器端跳转,请求的地址栏没有改变,也就是相当于回应了一次;而如果地址栏改变了,就相当于发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。
一个例子:requestDemo01.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert title here
<%
request.setAttribute("name","zqm");
request.setAttribute("password","123456");
%>
requestDemo02.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
String name =(String)request.getAttribute("name");
String password = (String)request.getAttribute("password");
%>
name:<%=name %>
password:<%=password %>
点击我进入到第三个页面
requestDemo03.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert title here
<%
String name = (String)request.getAttribute("name");
String password = (String)request.getAttribute("password");
%>
name:<%=name %>
password:<%=password %>
运行截图如下:
点击链接后:
由于这里需要页面浏览者第二次干预,所以和前两个页面不再是同一个请求,点击这个超链接无法取得前面设置的属性值对。
5、 如果现在希望一个属性在设置之后可以在任何一个与设置页面相关的页面中取得,就可以使用session属性范围,使用session设置属性之后,不管是客户端跳转还是服务器端跳转,只要属性设置了就可以取得。
6、 如果希望设置一个属性,可以让所有的用户(每一个session)都能看得见,则可以降属性范围设置为application。/*session的意思为会议、阶段,看来在这里可以看做是一个用户与服务器的“会议”,这里好像不太好描述,意会即可*/
7、 request内置对象是使用最多的一个对象,其主要作用是接受客户端发送来的请求信息,如请求参数、发送的头信息等。
request内置对象常用功能:获取用户输入信息、处理乱码、获得客户端服务器等的相关信息。
8、 page对象代表JSP对象本身,或者说代表编译后的Servlet对象,也就是JSP页面对应的Servlet类的实现对象。
9、 pageContext对象是一个比较特殊的对象。它相当于页面中所有其他对象功能的最大集大成者,即使用它可以访问本页面中所有其他对象,例如request、response以及out等。
10、 session对象表示目前个别用户的会话状态,用来识别每个用户。session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。/*我们平时登录网银网页的时候好像就有这种体会*/
11、 当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户再次访问连接到该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个session对象。有时,用户可能会忘记退出登录或关闭浏览器,这时,往往需要制定会话持续时间,也就是没有请求操作的持续时间,默认是30分钟的过期时间。
12、 application对象开始于服务器的启动,直到服务器关闭,在此期间,此对象将一直存在。在JSP服务器运行时刻,仅有一个application对象,它由服务器创建,也由服务器自动清除,不能被用户创建和清除。开发人员只能创建这个application对象的同步副本。 application对象可以存储和获取应用的有效属性对象,获取服务器信息,返回web应用名,返回指定文件的MIME类型,获取初始参数,获取指定path的实际路径,进行日志管理。