jsp笔记

JSP 9个内置对象
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}">
       &nbsp; ${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

posted @ 2009-11-10 08:40  stanleyshi  阅读(338)  评论(0编辑  收藏  举报