jsp笔记
application: ServletContext
session: HttpSession
request: HttpServletRequest
page: JspContext
response: HttpServletResponse
out: JspWriter
exception: Throwable
pageContext: PageContext
config: ServletConfig
注: 在 pageContext中,可以取得 application,session,request,response,config的引用,
其实,JSP就是依靠这个对象来获得 servlet 的这些个信息的.
pageContext 是不能跨越请求的,它只在当前页面有效,离开 _jspService(req,res) 方法就销毁.
四种不同的范围域.
application
|
session
|
request
|
pageContext
所以,在application范围中不宜存放太大的数据信息,因为它的生命周期太长.
Attribute in different scopes: 属性在不同的范围
Access: [访问]
.getAttribute(String name);
.setAttribute(String name,Object obj);
.removeAttribute(String name);
<jp:useBean id="var" scope="page|request|session|application"/>
注:
Attribute 在 application 为整个应用所共享.
Attribute 在 session 为不同的请求(同一客户端发出的)所共享.
Attribute 在 request 为同一请求的不同页面所共享.
Attribute 在 pageContext 只能在当前页面所共享.
* session 范围对象的推荐使用.
在JSP中,默认情况下是一定会创建 session 的,如果确定不需要追踪 client 的状态,可以关闭 session
<%@ page session="false" %> default is true.
存放在 session 范围的对象应该小一点会比较好?
1, 因为客户端数量是不可预知的,但服务器资源却是有限的.
2, 大对象状态应该存放在持久化介质中.如DB
用 session 来维护同一客户端所发出的请求状态.
1, 基于 cookie ,优先考虑.
web容器自动创建一个cookie(JSESSIONID)并且把它发送到 browser
2, 基于 URL 重写.
如果cookie被禁用,你必须使用URL重写来维护 同一客户请求状态.
HttpServletResponse.encodeURL(String url);
HttpServletResponse.encodeRedirectURL(String url);
5. 编码问题.
有三种类型.
1. JSP源码编码
<%@ page pageEncoding="UTF-8" %> 当前页面的编码.
2. 回应内容的编码
<%@ page contentType="text/html;charset=UTF-8" %>
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
3. 请求内容编码
request.setCharacterEncoding("UTF-8");
一般使用 Servlet 过滤器技术解决编码问题.
还可以在 web.xml中申明 page Encoding
<jsp-config>
<jsp-property-group>
<description>....</description>
<display-name>...</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>UTF-8<page-encoding>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
下面我们来看一下如何在 web.xml中配置一个 jsp实现的控制器
. . .
<servlet>
<servlet-name>controller</servlet-name>
<jsp-file>/controller.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
. . .
java web 应用的体系结构
两层体系结构: Client ---> Server
多层体系结构: Client ---> WebServer(JSP) ---> DB
Model1:
Web Client --> JSP(WEB SERVER) ---> JAVABEAN ---> DB
Model2:
Web Client -->JSP --> Servlet(web server) --> jsp --> JAVABEAN/EJB ---> DB
//----------------------------------------------------
EL Expression Language EL表达式语言
语法:
1. 通过名字访问变量
2. 支持下标访问操作[] 去访问 maps,lists,arrays对象和 JavaBean对象 的 Properties(属性)
3. 操作可以任意地嵌套使用.
4. 可以使用 "." 来访问 JavaBean 属性
5. 允许使用JAVA标准的关系操作符
如:
...
<c:forEach var="book" items="${store['all']}" varStatus="status"> //scope.getAttribute("store").getAll()
<td>${status.count|index}</td>
<td>${book.id}</td>
<td>${book["name"]}</td>
</c:forEach>
...
可以看出,EL中没有单引,双引之分的.
EL 中的操作符:
1. 数学操作符:
"+", "-", "*", "/", "%"
2. 关系操作符
'==' or 'eq', '!=' or 'ne', '<' or 'lt'
'>' or 'gt', '<=' or 'le', '>=' or 'ge'
3. 逻辑操作符
'&&' and 'and', '||' and 'or', '!' and 'not'
4. empty 操作符 (*)
'empty': 一个前缀操作符,可以决定一个值是否为 null or empty ?
用来修饰某一变量. 返回 boolean型
以下四种情况使用 empty 都将返回 true
a. undefined 变量未定义 如: ${empty abc} 如果abc未定义
b. null 值为null 如: ${empty null}
c. "" 如: ${emtpy ""}
d. collection.isEmpty() 判断 collection是否为空?还要判断 isEmpty()
如:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Times 99</title>
</head>
<body>
Hi, <c:if test="${!empty param.user}">
${param.user}
</c:if>
EL is funnly and useful, right? <br/>
<c:forEach var="i" begin="1" end="9">
<c:forEach var="j" begin="1" end="${i}">
${j} * ${i} = ${j * i}
</c:forEach> <br/>
</c:forEach>
</body>
</html>
########### records
二,Function in EL
1.调用语法;
ns:f(a1,a2,...an) or f(a1,a2,...an)
2.所有映谢主方法必需是公开静态方法.
在WEB-INF/ 文件夹下建一个 .tld文件
并在tld文件中增加函数的描述:
ex:
. . .
<function>
<name>sin</name>
<function-class>java.lang.Math</function-class>
<function-signature>double sin(double)</function-signature>
</function>
. . .
在你的JSP文件中: 使用
<%@ taglib prefix="f" uri="/WEB-INF/jspdev20.tld" %>
. . .
sin(3.14/2) = ${f:sin(3.14/2)}
. . .
见例子: el-function.jsp
三.在el中的隐式对象
a. pageContext -- The pageContext Object
b. pageScope -- 一个Map. 映射了page-scope 范围的属性名和值
c. requestScope -- . . .
d. sessionScope -- . . .
e. applicationScope -- . . .
f. param -- 通过调用 request.getParameter(String name) 来获得
g. paramValues -- ... request.getParameterValues(String name) ...
h. header -- ... request.getHeader(String name) ...
i. headerValues -- ... requestHeaders(String name)...
j. cookie -- 一个Map, 映谢了一个 cookie名到一个Cookie对象
k. initParam -- 通过调用ServletContext.getInitParameter(String name) ...
见例子: el-implicit.jsp