学习JSP主要学习他的9大对象(request, response, pageContext, session, application, out, config, page, exception ),这些对象都是静态对象,不用定义就可以直接使用,把他们都了解清楚并会运用,就可以在简历上添上一个熟悉技能:JSP
Jsp内置对象
|
功能
|
主要方法
|
out
|
向客户端输出数据
|
print() println() flush() clear() isAutoFlush() getBufferSize() close() …………
|
request
|
向客户端请求数据 通过它取得来自客户端的parameters,cookies,header等信息 |
getAttributeNames() getCookies() getParameter() getParameterValues() setAttribute() getServletPath() …………..
|
response
|
封装了jsp产生的响应,然后被发送到客户端以响应客户的请求
|
addCookie() sendRedirect() setContentType()
flushBuffer() getBufferSize() getOutputStream()
sendError() containsHeader()……………
|
application
|
应用程序级对象(即应用程序上下文),多个用户之间共享信息
|
|
config
|
表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet JSP的配置信息,作用域为页面 |
getServletContext() getServletName() getInitParameter() getInitParameterNames()……………
|
page
|
对应this关键字。JSP网页本身,Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问
|
flush()………
|
pagecontext
|
为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问 网页的属性是在这里管理
|
forward() getAttribute() getException() getRequest() getResponse() getServletConfig()
getSession() getServletContext() setAttribute()
removeAttribute() findAttribute() ……………
|
session
|
用户级对象,用来保存每个用户的信息,以便跟踪每个用户的操作状态通过 <%@ page session ="false" %>该页面禁止会话
|
getAttribute() getId() getAttributeNames() getCreateTime() getMaxInactiveInterval()
invalidate() isNew()
|
exception
|
反映运行的异常只有在page指令中指定isErrorPage = "true"属性,才可以使用这个对象。
|
getMessage()…………
getLocalizedMessage( )
toString( ) |
他们分别继承于
①request javax.servlet.http.HttpServletRequest
②response javax.servlet.http.HttpServletResponse
③pageContext
④session javax.servlet.http.Httpsession
⑤out javax.servlet.jsp.JspWriter
⑥application javax.servlet.servletContext
⑦config javax.servlet.servletConfig
⑧page java.lang.Object
⑨exception java.lang.Throwable
由此看出他与servlet的关系。你以看看9大JSP隐式对象与Servlet之间的暧昧,看看他们的暧昧关系.
使用示例
①out
返回类型
|
方法
|
説明
|
void
|
clear( )
|
|
void
|
clearBuffer( )
|
|
void
|
close( )
|
|
void
|
flush( )
|
|
void
|
newLine( )
|
|
void
|
print(var)
|
|
void
|
println(var)
|
|
更多方法请看API Reference
< html >
< head >
< title > バッファの制御(outオブジェクト) </ title >
</ head >
< body >
<% ...
for(int i=0;i<=10;i++){
Thread.sleep(1000);
/* データベース処理など、処理時間の長い処理 */
out.print("…");
out.flush();
}
%>
</ body >
</ html >
②request
返回类型
|
方法
|
説明
|
Cookie[ ]
|
getCookies( )
|
|
String
|
getHeader(String)
|
|
Enumeration
|
getHeaderNames( )
|
|
Enumeration
|
getHeaders(String)
|
|
String
|
getMethod( )
|
|
String
|
getParameter(String)
|
|
String[ ]
|
getParameterValues(String)
|
|
Enumeration
|
getParameterNames( )
|
|
void
|
setCharacterEncoding(String)
|
|
更多方法请看API Reference
sample.html
< tr >< th > キー名 </ th >< th > 値 </ th ></ tr >
<!-- 返回值为ENUMERATION的处理 -->
<%
request.setCharacterEncoding( " Shift_JIS " );
Enumeration objEnm = request.getParameterNames();
while (objEnm.hasMoreElements()) ... {
String strKey=(String)(objEnm.nextElement());
%>
<tr>
<td><%=strKey%></td>
<td><%=request.getParameter(strKey)%></td>
</tr>
<% } %>
<!-- 返回值为COOKIE的处理 -->
<%
Cookie[] cookies = request.getCookies();
for ( int i = 0 ; i < cookies.length; i ++ ) ... {
Cookie c = cookies[i];
String name = c.getName();
String value = c.getValue();
<%>
<tr>
<td><% out.print(name);%></td>
<td><% out.print(value);%></td>
</tr>
<% } %>
</ table >
③response
response 与out 都是向客户端输出信息,他们的区别可以这样简单的区分,前者负责输出不可见的元素,后者负责可见的。
返回类型
|
方法
|
説明
|
void
|
addCookie(Cookie)
|
|
void
|
addHeader(String, String)
|
■
|
void
|
addDateHeader(String, long)
|
■
|
void
|
addIntHeader(String, int)
|
■
|
String
|
encodeURL(String)
|
|
String
|
encodeRedirectURL(String)
|
|
void
|
sendError(int)
|
|
void
|
sendRedirect(String)
|
|
void
|
setHeader(String, String)
|
■负责持有string类型的Header
|
void
|
setDateHeader(String, long)
|
■负责持有long类型的Header
|
void
|
setIntHeader(String, int)
|
■负责持有int类型的Header
|
void
|
setStatus(int)
|
|
<% ... @ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
<% ...
Calendar objCal1=Calendar.getInstance();
Calendar objCal2=Calendar.getInstance();
objCal2.set(1970,0,1,0,0,0);
response.setDateHeader("Last-Modified",objCal1.getTime().getTime());
response.setDateHeader("Expires",objCal2.getTime().getTime());
//response.addIntHeader("Expires", -1); -1 指定客户端不缓存
response.setHeader("pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
%>
<!-- 主要的header有:
Accept-Language 対応言語
Connection 连接方法
Content-Type CONTENTSType(MIME)
Date Content 的発行日
If-Modified-Since 缓存の最終更新日
Referer 链接源
User-Agent 客户端の種類
WWW-Authenticate 認証ID/密码
-->
<!-- ❷操作COOKIE -->
<% ...
Cookie objCok=new Cookie("email",request.getParameter("email"));
objCok.setMaxAge(60*60*24*180);
response.addCookie(objCok);
response.sendRedirect("request_cookie.jsp");
%>
<!-- COOKIE本身也是一个对象
Cookie ckName=new Cookie(strName,strValue); //定义方法
COOKIE主要方法有
getComment()/setComment(str) Commentの取得/設定
getDomain()/setDomain(str) 対象Domainの取得/設定
getMaxAge()/setMaxAge(int) 有効期限の取得/設定(秒)
getName() COOKIE名の取得
getPath()/setPath(str) 対象PATHの取得/設定
getSecure()/setSecure(bln) SSL通信要否の取得/設定
getValue()/setValue(str) COOKIE値の取得/設定
getVersion()/setVersion(int) VERSION値の取得/設定
-->
④APPLICATION
返回类型
|
方法
|
説明
|
Object
|
getAttribute(String)
|
|
Enumeration
|
getAttributeNames( )
|
返回所有可用的
APPLICATION
作用域内的属性名称
|
String
|
getInitParameter(String)
|
|
Enumeration
|
getInitParameterNames( )
|
返回所有可用的
APPLICATION
作用域内的变量名称
|
String
|
getRealPath(String)
|
返回作为参数的
相対
路径
(/index.html)
的
絶対
路径
(http://localhost/contextPath/index.html)
|
String
|
getServerInfo( )
|
返回
ServletContainer
的名称和版本
|
void
|
log(String)
|
把作为参数的信息写入
ServletContainer
指定的
log
文件
|
void
|
removeAttribute(String)
|
|
void
|
setAttribute(String, Object)
|
|
< web-app >
... ...
< context-param >
< param-name > myName </ param-name >
< param-value > wth </ param-value >
</ context-param >
< context-param >
< param-name > myPassword </ param-name >
< param-value > %&#$%& </ param-value >
</ context-param >
... ...
</ web-app >
<% ... @ page contentType ="text/html;charset= windows-31j" %>
< html >
< body >
<% ...
String id = application.getInitParameter("myName");
String pwd = application.getInitParameter("myPassword");
%>
我的名字是 <% = di %> ,密码是 <% = pwd %>
<!-- 应为application属性,变量,是应用程序级别的 我们可以用它来做一个小小的访问记数器 -->
<% ... ...
String strCnt = (String)(application.getAttribute("cnt"));
if(strCnt == null) {
strCnt = 1;
} else {
strCnt = Interget.toString(Integer.parseInt(strCnt));
}
application.setAttribute("cnt", strCnt);
%>
现在的访问数是 <% = strCnt %>
</ body >
</ html >
⑤SESSION
返回类型
|
方法
|
説明
|
Object
|
getAttribute(String)
|
|
Enumeration
|
getAttributeNames( )
|
|
String
|
getId( )
|
返回分配给
SESSION
唯一的
ID
|
int
|
getMaxInactiveInterval( )
|
取得指定
SESSION
保持的秒数
|
ServletContext
|
getServletContext( )
|
返回属性这个SESSION的
ServletContext
对象
|
void
|
invalidate( )
|
生成されているセッションIDを破棄します。
|
boolean
|
isNew( )
|
当客户端没有这个
SESSION
(
第一次访问时,或者客户端
cookie
禁止使用时
)
返回
TRUE
|
void
|
removeAttribute(String)
|
|
void
|
setAttribute(String, Object)
|
|
void
|
setMaxInactiveInterval(int)
|
指定
SESSION
保持的时间,单位为秒数
。
|
< html >
< body >
<% ...
if(session.isNew()){
session.setAttribute("id","guest_1");
out.println(session.getAttribute("id") + "Nice to meet you !");
} esle {
out.prinln("Hello!" + session.getAttribute("id") );
}
%>
</ body >
</ html >
⑥pageContext (管得最宽的一个家伙)
返回
类型
|
方法
|
説明
|
void
|
forward(String)
|
把
request
转送给参数指定的
URL
(
可以是相对路径
),
实行
forward
方法之前不能有任何输出
,
否则会出错
.
|
void
|
include(String)
|
|
Exception
|
getException( )
|
返回
exception
对
象
|
JspWriter
|
getOut( )
|
返回
out
对
象
|
Object
|
getPage( )
|
返回
page
对
象
|
ServletRequest
|
getRequest( )
|
返回
request
对
象
|
ServletResponse
|
getResponse( )
|
返回
response
对
象
|
ServletConfig
|
getServletConfig( )
|
返回
ServletConfig
|
ServletContext
|
getServletContext( )
|
返回
ServletContext
|
HttpSession
|
getSession( )
|
返回
session
对
象
|
Object
|
findAttribute(String)
|
搜索指定数据
(
page
→request→session→application
)
|
Object
|
getAttribute(String, int)
|
第二参数指定
SCOPE
作用域范围
PAGE_SCOPE
/
REQUEST_SCOPE
/
SESSION_SCOPE
/
APPLICATION_SCOPE
|
Enumeration
|
getAttributeNamesInScope(int)
|
返回指定
SCOPE
内的所有参数
|
int
|
getAttributesScope(String)
|
返回指定数据的
SCOPE
|
void
|
removeAttribute(String, int)
|
|
void
|
setAttribute(String, Object, int)
|
|
<% ... @ page contentType = "text/html;charset = windows-31j" %>
< html >
< body >
<% ...
String str_in_requst= "str_from_request";
String str_in_session= "str_from_session";
pageContext.setAttribute("name", str_in_requst, pageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", str_in_session, pageContext.SESSION_SCOPE);
%>
<% = request.getAttribute( " str_in_request " ) %>
<% = session.getAttribute( " str_in_session " ) %>
<!-- 注意page,request,session.application各个作用域内的可以用同一个变量名
但是findAttribute(String), getAttributesScope(String)方法的搜索顺序是从小到大(page→request→session→application)
-->
</ body >
</ html >
⑦config
返回
类型
|
方法
|
説明
|
Object
|
getInitParameter(String)
|
|
Enumeration
|
getInitParameterNames( )
|
|
ServletContext
|
getServletContext( )
|
|
String
|
getServletName( )
|
|
<! DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
< servlet >
<!-- ①指定<jsp-file>JSP程序对应的Servlet名为<servlet-name>
也可以为<jsp-class>指定名称,具体可以参考我另外一篇文章《JSP/Servlet 入门示例》
-->
< servlet-name > servletName </ servlet-name >
< jsp-file > /sample.jsp </ jsp-file >
<!-- ②在 <init-param>中初始化变量名及对应值,可以在这里数据库设置连接字符窜 -->
< init-param >
< param-name > name </ param-name >
< param-value > I am WTH </ param-value >
<param-value>org.gjt.mm.mysql.Driver</param-value>
<param-value>jdbc:mysql://localhost/dbNameXx?user=UserXx&password=
passwordXx&useUnicode=true&characterEncoding=Shift_JIS</param-value>
</ init-param >
</ servlet >
<!-- ③<servlet-mapping>指定servlet程序的访问路径,如下例,
当URL里含有"/sample.jsp"时,就可以访问对应的servlet程序servletName ,然后实行对应的sample.jsp
如果不明白,可以参考我另外一篇文章《JSP/Servlet 入门示例》
-->
< servlet-mapping >
< servlet-name > servletName </ servlet-name >
< url-pattern >/sample.jsp </ url-pattern >
</ servlet-mapping >
</ web-app >
sample.jsp
import java.sql.*
%>
< HTML >
< BODY >
<% ... ... out.println("name: "); %>
<% = config.getInitParameter( " name " )) %> <!-- 注意与application.getInitParameter(String) 的区别 -->
<% ...
Class.forName(config.getInitParameter("driverName"));
Connection db=DriverManager.getConnection(
config.getInitParameter("connectString"));
/* 操作数据库 */
db.close();
%>
</ BODY >
</ HTML >
⑧page (略)
⑨exception
返回类型
|
方法
|
説明
|
String
|
getMessage( )
|
详细的
error meesage
|
String
|
getLocalizedMessage( )
|
国际化对应
message
和
getMessage()
返回的一样
|
String
|
toString( )
|
简单的
error message
|
<% ... -- 设定errorPage属性 -- %>
<% ... @ page contentType="text/html; charset=windows-31j"
errorPage="/exception.jsp" %>
< html >
< body >
<% ...
//除0计算 生成错误;
int x = 1/0;
%>
</ body >
</ html >
<% ... -- 设置isErrorPage属性-- %>
<% ... @ page contentType="text/html; charset=windows-31j"
isErrorPage="true" %>
< html >
< body >
<% = exception.toString() %>
</ body >
</ html >
补充:
application request/responce session page 都有关于Attribute Parameters的方法,心想是不是谁的方法都可以啊。注意啦,其实他们处理的不是同一个对象,他们是不同作用域内的Attribute和Prameter。
另外application 和 config 都有getInitParameter()方法,都可以从web.xml中取数据,要注意他们的区别,他们处理的是不同的字段。
参考文章:
http://www.javaroad.jp/servletjsp/index.html
http://www.javaroad.jp/opensource/index.html