① out - javax.servlet.jsp.jspWriter
out对象用于把结果输出到网页上。
方法:
1. void clear() ;
清除输出缓冲区的内容,但是不输出到客户端。
2. void clearBuffer() ;
清除输出缓冲区的内容,并输出到客户端。
3. void close() ;
关闭输出流,清除所有内容。
4. void flush() ;
输出缓冲区里面的数据。
5. int getBufferSize() ;
获取以kb为单位的目前缓冲区大小。
6. int getRemaining() ;
获取以kb为单位的缓冲区中未被占用的空间大小。
7. boolean isAutoFlush() ;
是否自动刷新缓冲区。
8. void newLine() ;
输出一个换行字符。
9. void print( boolean b ) ;
void print( char c ) ;
void print( char[] s ) ;
void print( double d ) ;
void print( float f ) ;
void print( int i ) ;
void print( long l ) ;
void print( Object obj ) ;
void print( String s ) ;
将指定类型的数据输出到Http流,不换行。
10. void println( boolean b ) ;
void println( char c ) ;
void println( char[] s ) ;
void println( double d ) ;
void println( float f ) ;
void println( int i ) ;
void println( long l ) ;
void println( Object obj ) ;
void println( String s ) ;
将指定类型的数据输出到Http流,并输出一个换行符。
11. Appendable append( char c ) ;
Appendable append( CharSequence cxq, int start, int end ) ;
Appendable append( CharSequence cxq ) ;
将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。
成员:
int DEFAULT_BUFFER = 0 - 缺省缓冲区大小
int NO_BUFFER = -1 - writer是否处于缓冲输出状态
int UNBOUNDED_BUFFER = -2 - 是否限制缓冲区大小
② request - javax.servlet.http.HttpServletRequest
request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。
方法:
1. Object getAttribute( String name ) ;
返回由name指定的属性值,该属性不存在时返回null。
2. Enumeration getAttributeNames() ;
返回request对象的所有属性名称的集合。
3. String getAuthType() ;
返回用来保护servlet的认证方法的名称,未受保护时返回null。
4. String getCharacterEncoding() ;
返回请求中的字符编码方法,可以在response对象中设置。
5. int getContentLength() ;
返回请求的BODY的长度,不能确定长度时返回-1。可以在response中设置。
6. String getContentType() ;
返回在response中定义的内容类型。
7. String getContentPath() ;
返回请求的路径。
8. Cookie[] getCookies() ;
返回客户端所有的Cookie的数组。
9. Enumeration getHeaderNames() ;
返回所有HTTP头的名称的集合。
10. Enumeration getHeaders( String name ) ;
返回指定HTTP头的所有值的集合。
11. String getHeader( String name ) ;
返回指定名称的HTTP头的信息。
12. long getDateHeader( String name ) ;
返回指定名称的Data类型的HTTP头的信息。
13. int getIntHeader( String name ) ;
返回指定名称的Int类型的HTTP头的信息。
14. ServletInputStream getInputStream() ;
返回请求的输入流。
15. Locale getLocale() ;
返回当前页的Locale对象,可以在response中设定。
16. Enumeration getLocales() ;
返回请求中所有的Locale对象的集合。
17. String getLocalName() ;
获取响应请求的服务器端主机名。
18. String getLocalAddr() ;
获取响应请求的服务器端地址。
19. int getLocalPort() ;
获取响应请求的服务器端端口
20. String getMethod() ;
获取客户端向服务器端发送请求的方法(GET、POST)。
21. String getParameter( String name ) ;
获取客户端发送给服务器端的参数值。
22. Map getParameterMap() ;
该方法返回包含请求中所有参数的一个Map对象。
23. Enumeration getParameterNames() ;
返回请求中所有参数的集合。
24. String[] getParameterValues( String name ) ;
获得请求中指定参数的所有值。
25. String getQueryString() ;
返回get方法传递的参数字符串,该方法不分解出单独的参数。
26. String getPathInfo() ;
取出请求中处于ServletPath和QueryString之间的额外信息。
27. String getPathTranslated() ;
返回用getPathInfo()方法取得的路径信息的实际路径。
28. String getProtocol() ;
返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。
29. BufferedReader getReader() ;
返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。
30. String getRemoteAddr() ;
获取发出请求的客户端IP地址。
31. String getRemoteHost() ;
获取发出请求的客户端主机名
32. String getRemoteUser() ;
返回经过客户端验证的用户名,未经验证返回null。
33. int getRemotePort() ;
返回发出请求的客户端主机端口。
34. String getRealPath( String path ) ;
返回给定虚拟路径的物理路径。
35. RequestDispatcher getRequestDispatcher( String path ) ;
按给定的路径生成资源转向处理适配器对象。
36. String getRequestedSessionId() ;
返回请求的session的标识。
37. String RequestURI() ;
返回发出请求的客户端地址,但是不包括请求的参数字符串。
38. StringBuffer getRequestURI() ;
返回响应请求的服务器端地址
39. String getScheme() ;
获取协议名称,缺省值为HTTP协议。
40. String getServerName() ;
返回响应请求的服务器名称。
41. String getServletPath() ;
获取客户端所请求的脚本文件的文件路径。
42. int getServerPort() ;
获取响应请求的服务器端主机端口号。
43. void removeAttribute( String name ) ;
在属性列表中删除指定名称的属性。
44. void setAttribute( String name, Object value ) ;
在属性列表中添加/删除指定的属性。
45. void setCharacterEncoding( String name ) ;
设置请求的字符编码格式。
46. HttpSession getSession() ;
HttpSession getSession( boolean create ) ;
获取session,如果create为true,在无session的情况下创建一个。
47. boolean isRequestedSessionIdFromCookie() ;
检查请求的会话ID是否为通过Cookie传入。
48. boolean isRequestedSessionIdFromURL() ;
检查请求的会话ID是否为通过URL传入。
49. boolean isRequestedSessionIdValid() ;
检查请求的会话ID是否仍然有效。
50. boolean isSecure() ;
检查请求是否使用安全链接,如果HTTPS等。
51. boolean isUserInRole( String role ) ;
检查已经通过验证的用户是否在是role所指定的角色。
52. Principal getUserPrincipal() ;
返回包含用户登陆名的一个java.security.Principal对象。
成员:
String BASIC_AUTH = "BASIC" -
String CLIENT_CERT_AUTH = "CLIENT_CERT" -
String DIGEST_AUTH = "DIGEST" -
String FORM_AUTH = "FORM" -
③ response - javax.servlet.http.HttpServletResponse
response对象主要将JSP容器处理后的结果传回到客户端。
方法:
1. void addCookie( Cookie cookie ) ;
添加一个Cookie对象,保存客户端信息。
2. void addDateHeader( String name, long value ) ;
添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息。
3. void addHeader( String name, String value ) ;
添加一个HTTP头,覆盖同名的旧HTTP头。
4. void addIntHeader( String name, int value ) ;
添加一个整型的HTTP头,覆盖同名的旧HTTP头。
5. boolean containsHeader( String name ) ;
判断指定的HTTP头是否存在。
6. String encodeRedirectURL( String url ) ;
对sendRedirect()方法使用的URL进行编码。
7. String encodeURL( String url ) ;
将URL予以编码,回传包含session ID的URL。
8. void flushBuffer() ;
强制把当前缓冲区的内容发送到客户端。
9. int getBufferSize() ;
取得以kb为单位的缓冲区大小。
10. String getCharacterEncoding() ;
获取响应的字符编码格式。
11. String getContentType() ;
获取响应的类型。
12. Locale getLocale() ;
获取响应的Locale对象。
13. ServletOutputStream getOutputStream() ;
返回客户端的输出流对象。
14. PrintWriter getWriter() ;
获取输出流对应的writer对象。
15. boolean isCommitted() ;
判断服务器端是否已经将数据输出到客户端。
16. void reset() ;
清空buffer中的所有内容。
17. void resetBuffer() ;
情况buffer中所有的内容,但是保留HTTP头和状态信息。
18. void sendError( int xc, String msg ) ;
void sendError( int xc ) ;
发送错误,包括状态码和错误信息。
19. void sendRedirect( String locationg ) ;
把响应发送到另外一个位置进行处理。
20. void setBufferSize( int size ) ;
设置以kb为单位的缓冲区大小。
21. void setCharacterEncoding( String charset ) ;
设置响应使用的字符编码格式。
22. void setContentLength( int length ) ;
设置响应的BODY长度。
23. void setContentType( String type ) ;
设置响应的类型。
24. void setDateHeader( String name, long value ) ;
设置指定名称的Data类型的HTTP头的值。
25. void setHeader( String name, String value ) ;
设置指定名称的HTTP头的值。
26. void setIntHeader( String name, int value ) ;
设置指定名称的int类型的HTTP头的值。
27. void setStatus( int xc ) ;
设置响应状态码,新值会覆盖当前值。
成员(HTTP状态码):
int SC_CONTINUE = 100 int SC_SWITCHING_PROTOCOLS = 101
int SC_OK = 200 int SC_NON_AUTHORITATIVE_INFORMATION = 203
int SC_ACCEPTED = 202 int SC_CREATED = 201
int SC_NO_CONTENT = 204 int SC_RESET_CONTENT = 205
int SC_PARTIAL_CONTENT = 206 int SC_MULTIPLE_CHOICES = 300
int SC_MOVED_PERMANENTLY = 301 int SC_MOVED_TEMPORARILY = 302
int SC_FOUND = 302 int SC_SEE_OTHER = 303
int SC_NOT_MODIFIED = 304 int SC_USE_PROXY = 305
int SC_TEMPORARY_REDIRECT = 307 int SC_BAD_REQUEST = 400
int SC_UNAUTHORIZED = 401 int SC_PAYMENT_REQUIRED = 402
int SC_FORBIDDEN = 403 int SC_NOT_FOUND = 404
int SC_METHOD_NOT_ALLOWED = 405 int SC_NOT_ACCEPTABLE = 406
int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408
int SC_CONFLICT = 409 int SC_GONE = 410
int SC_LENGTH_REQUIRED = 411 int SC_PRECONDITION_FAILED = 412
int SC_REQUEST_ENTITY_TOO_LARGE = 413 int SC_REQUEST_URI_TOO_LONG = 414
int SC_UNSUPPORTED_MEDIA_TYPE = 415 int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416
int SC_EXPECTATION_FAILED = 417 int SC_INTERNAL_SERVER_ERROR = 500
int SC_NOT_IMPLEMENTED = 501 int SC_BAD_GATEWAY = 502
int SC_SERVICE_UNAVAILABLE = 503 int SC_GATEWAY_TIMEOUT = 504
int SC_HTTP_VERSION_NOT_SUPPORTED = 505
④ session - javax.servlet.http.HttpSession
session对象表示目前个别用户的会话状态,用来识别每个用户。
方法:
1. Object getAttribute( String name ) ;
获取与指定名字相关联的session属性值。
2. Enumeration getAttributeNames() ;
取得session内所有属性的集合。
3. long getCreationTime() ;
返回session的创建时间,最小单位千分之一秒。
4. String getId() ;
取得session标识。
5. long getLastAccessedTime() ;
返回与当前session相关的客户端最后一次访问的时间,由1970-01-01算起,单位毫秒。
6. int getMaxInactiveInterval( int interval ) ;
返回总时间,以秒为单位,表示session的有效时间(session不活动时间)。-1为永不过期。
7. ServletContext getServletContext() ;
返回一个该JSP页面对应的ServletContext对象实例。
8. HttpSessionContext getSessionContext() ;
9. Object getValue( String name ) ;
取得指定名称的session变量值,不推荐使用。
10. String[] getValueNames() ;
取得所有session变量的名称的集合,不推荐使用。
11. void invalidate() ;
销毁这个session对象。
12. boolean isNew() ;
判断一个session是否由服务器产生,但是客户端并没有使用。
13. void pubValue( String name, Object value ) ;
添加一个session变量,不推荐使用。
14. void removeValue( String name ) ;
移除一个session变量的值,不推荐使用。
15. void setAttribute( String name, String value ) ;
设置指定名称的session属性值。
16. void setMaxInactiveInterval( int interval ) ;
设置session的有效期。
17. void removeAttribute( String name ) ;
移除指定名称的session属性。
⑤ pageContext - javax.servlet.jsp.PageContext
pageContext对象存储本JSP页面相关信息,如属性、内建对象等。
方法:
1. void setAttribute( String name, Object value, int scope ) ;
void setAttribute( String name, Object value ) ;
在指定的共享范围内设置属性。
2. Object getAttribute( String name, int scope ) ;
Object getAttribute( String name ) ;
取得指定共享范围内以name为名字的属性值。
3. Object findAttribute( String name ) ;
按页面、请求、会话和应用程序共享范围搜索已命名的属性。
4. void removeAttribute( String name, int scope ) ;
void removeAttribute( String name ) ;
移除指定名称和共享范围的属性。
5. void forward( String url ) ;
将页面导航到指定的URL。
6. Enumeration getAttributeNamesScope( int scope ) ;
取得指定共享范围内的所有属性名称的集合。
7. int getAttributeScope( String name ) ;
取得指定属性的共享范围。
8. ErrorData getErrorDate() ;
取得页面的errorData对象。
9. Exception getException() ;
取得页面的exception对象。
10. ExpressionEvaluator getExpressionEvaluator() ;
取得页面的expressionEvaluator对象。
11. JspWriter getOut() ;
取得页面的out对象。
12. Object getPage() ;
取得页面的page对象。
13. ServletRequest getRequest() ;
取得页面的request对象。
14. ServletResponse getResponse() ;
取得页面的response对象。
15. ServletConfig getConfig() ;
取得页面的config对象。
16. ServletContext getServletContext() ;
取得页面的servletContext对象。
17. HttpSession getSession() ;
取得页面的session对象。
18. VariableResolver getVariableResolver() ;
取得页面的variableResolver对象。
19. void include( String url, boolean flush ) ;
void include( String url ) ;
包含其他的资源,并指定是否自动刷新。
20. void release() ;
重置pageContext内部状态,释放所有内部引用。
21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,
String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;
初始化未经初始化的pageContext对象。
22. BodyContext pushBody() ;
BodyContext pushBody( Writer writer ) ;
保存当前的out对象,并更新pageContext中page范围内的out对象。
23. JspWrite popBody() ;
取出由pushBody()方法保存的out对象。
24. void handlePageException( Exception e ) ;
void handlePageException( Thrwoable t ) ;
成员:
int PAGE_SCOPE = 1 - 页面共享范围
int REQUEST_SCOPE = 2 - 请求共享范围
int SESSION_SCOPE = 3 - 会话共享范围
int APPLICATION_SCOPE = 4 - 应用程序共享范围
String PAGE = "javax.servlet.jsp.jspPage"
String PAGECONTEXT = "javax.servlet.jsp.jspPageContext"
String REQUEST = "javax.servlet.jsp.jspRequest"
String RESPONSE = "javax.servlet.jsp.jspResponse"
String CONFIG = "javax.servlet.jsp.jspConfig"
String SESSION = "javax.servlet.jsp.jspSession"
String OUT = "javax.servlet.jsp.jspOut"
String APPLICATION = "javax.servlet.jsp.jspApplication"
String EXCEPTION = "javax.servlet.jsp.jspException"
⑥ application - javax.servlet.ServletContext
application主要功用在于取得或更改Servlet的设定。
方法:
1. Object getAttribute( String name ) ;
返回由name指定的application属性。
2. Enumeration getAttributes() ;
返回所有的application属性。
3. ServletContext getContext( String uripath ) ;
取得当前应用的ServletContext对象。
4. String getInitParameter( String name ) ;
返回由name指定的application属性的初始值。
5. Enumeration getInitParameters() ;
返回所有的application属性的初始值的集合。
6. int getMajorVersion() ;
返回servlet容器支持的Servlet API的版本号。
7. String getMimeType( String file ) ;
返回指定文件的类型,未知类型返回null。一般为"text/html"和"image/gif"。
8. int getMinorVersion() ;
返回servlet容器支持的Servlet API的副版本号。
9. String getRealPath( String path ) ;
返回给定虚拟路径所对应物理路径。
10. RequestDispatcher getNamedDispatcher( String name ) ;
为指定名字的Servlet对象返回一个RequestDispatcher对象的实例。
11. RequestDispatcher getRequestDispatcher( String path ) ;
返回一个RequestDispatcher对象的实例。
12. URL getResource( String path ) ;
返回指定的资源路径对应的一个URL对象实例,参数要以"/"开头。
13. InputStream getResourceAsStream( String path ) ;
返回一个由path指定位置的资源的InputStream对象实例。
14. Set getResourcePaths( String path ) ;
返回存储在web-app中所有资源路径的集合。
15. String getServerInfo() ;
取得应用服务器版本信息。
16. Servlet getServlet( String name ) ;
在ServletContext中检索指定名称的servlet。
17. Enumeration getServlets() ;
返回ServletContext中所有servlet的集合。
18. String getServletContextName() ;
返回本web应用的名称。
19. Enumeration getServletContextNames() ;
返回ServletContext中所有servlet的名称集合。
20. void log( Exception ex, String msg ) ;
void log( String msg, Throwable t ) ;
void log( String msg ) ;
把指定的信息写入servlet log文件。
21. void removeAttribute( String name ) ;
移除指定名称的application属性。
22. void setAttribute( String name, Object value ) ;
设定指定的application属性的值。
⑦ config - javax.servlet.ServletConfig
config对象用来存放Servlet初始的数据结构。
方法:
1. String getInitParameter( String name ) ;
返回名称为name的促使参数的值。
2. Enumeration getInitParameters() ;
返回这个JSP所有的促使参数的名称集合。
3. ServletContext getContext() ;
返回执行者的servlet上下文。
4. String getServletName() ;
返回servlet的名称。
⑧ exception - java.lang.Throwable
错误对象,只有在JSP页面的page指令中指定isErrorPage="true"后,才可以在本页面使用exception对象。
方法:
1. Throwable fillInStackTrace() ;
将当前stack信息记录到exception对象中。
2. String getLocalizedMessage() ;
取得本地语系的错误提示信息。
3. String getMessage()
取得错误提示信息。
4. StackTrackElement[] getStackTrace() ;
返回对象中记录的call stack track信息。
5. Throwable initCause( Throwable cause ) ;
将另外一个异常对象嵌套进当前异常对象中。
6. Throwable getCause() ;
取出嵌套在当前异常对象中的异常。
7. void printStackTrace() ;
void printStackTrace( printStream s ) ;
void printStackTrace( printWriter s ) ;
打印出Throwable及其call stack trace信息。
8. void setStackTrace( StackTraceElement[] stackTrace )
设置对象的call stack trace信息。
⑨ page - javax.servlet.jsp.HttpJspPage
page对象代表JSP对象本身,或者说代表编译后的servlet对象,
可以用( (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性。
作者 Budi Kurniawan
JavaServer Face为Java应用程序的开发提速。
JavaServer Faces(JSF)是一项使用Java技术来快速构建Web应用程序的新技术。JSF通过提供以下特性来加速开发进程:标准和可扩展的用户界面组件;极易配置的页面导航;用于输入验证的组件;自动化的Bean管理;事件处理;轻松的错误处理,以及内置的对国际化的支持。
本文介绍如何使用JSF来构建在线比萨(pizza)订购系统。
项目描述
该应用程序被称之为PizzaRia,是一个在线商店,允许用户选择比萨饼并递交选定的比萨饼。PizzaRia与其他在线商店类似,用户可以浏览菜单,向购物车中添加所选产品并进行结账。
该应用程序的用户界面由5个JSP文件组成,它们是index.jsp, details.jsp, shoppingCart.jsp, checkOut.jsp以及order.jsp 。每个用户界面的页面包括3个其它页面:header.jsp, menu.jsp和 footer.jsp 。
数据库
该程序的数据存储在3张表中:products(产品)、orders(定单)和OrderDetails(订单详细项目)。Products表存储产品信息,具有4列:ProductId(产品标识), Name(名称), Description(说明)和 Price(价格)。
Orders表中的每一行存储一个单独的订单,其中的信息包括联系人姓名、送货地址以及信用卡细目。Orders表有6列:OrderId(定单标识), ContactName(联系人姓名), DeliveryAddress(送货地址), CCName(信用卡所属人姓名), CCNumber(信用卡号码)和 CCExpiryDate(信用卡有效期限)。
每个订单的详细项目被存储在OrderDetails表中。OrderDetails表有4列:OrderId(定单标识), ProductId(产品标识), Quantity(数量)和 Price(价格)。Orders与OrderDetails表通过OrderID列有一对多的对应关系。请注意,OrderDetails表在用户下订单的时候就保存相关的价格信息。该价格可能与当前产品价格不同,后者存储在Products表的Price列中。
用于在一个Oracle数据库中创建所需的表的脚本文件pizzaria-oracle.sql存放在
pizzaria.zip
文件中。
业务对象
以下是在该应用程序中使用的业务对象:
ProductBean
用于封装一个产品信息。它具有如下属性:id(标识)、name(名称)、description(说明)和price(价格)。每次details.asp页被访问的时候,JSF实现(implementation)就会自动创建一个ProductBean实例。该JSF实现调用ProductBean的无参数构造器,从数据库中获取相关的数据,并且将其填入相应的字列中。
ProductSummary。
ProductSummary(产品概要)用于表示产品的概要。该类包含2个属性:id(标识)和name(名称)。
ShoppingItemBean。
ShoppingItemBean用于表示购物项目。该类包含4个属性:productId(产品标识), productName(产品名称), price(价格)以及 quantity(数量)。
ShoppingCartBean。
ShoppingCartBean用于表示一个存储在对话(session)对象中的购物车。该类允许用户添加购物项目(使用addShopping方法),获取包含所有购物项目的列表(使用getShoppingItems方法),获得所购货物的总价值(使用getTotal方法)。
OrderBean。
OrderBean表示一个订单。该类具有如下5个属性:contactName, deliveryAddress, creditCardName, creditCardNumber以及 creditCardExpiryDate。
MenuBean。
MenuBean使用getMenu方法显示可供产品的目录。该方法返回一个包含到产品细节的链接的HTML表。
DatabaseUtil。
DatabaseUtil提供了以下3种方法以便访问和操作数据:
-
GetProductSummaries:该方法返回一个包含了产品表中所有产品概要的列表。一个产品概要通过ProductSummary类来表示。
-
GetProductDetails:该方法返回一个ProductBean对象,该对象封装具有特定标识符的产品细节。
- InsertOrder:该方法向Orders表和OrderDetails表插入客户订单。
应用程序上下文监听器
应用程序上下文监听器(AppContextListener类)从web.xml文件读出用于访问数据库的初始参数,然后将其写入ServletContext对象。用到的初始参数如下:jdbcDriver, dbUrl, dbUserName和 dbPassword。在你的web.xml文件中编辑这些值,以便反应你数据库的真实值。
JSF应用程序配置
JSF允许编程人员仅仅通过应用程序配置文件就可以轻松配置应用程序。该文件如果存在的话,则它应该被命名为faces-config.xml,并且应该位于你应用程序下的WEB-INF 目录。
可以在faces-config.xmlz文件中对该应用程序的多个方面进行配置,包括bean管理、页面导航、定制UI(用户界面)组件、定制验证程序和消息资源。在 PizzaRia 应用程序中,我将该faces-config.xml用于bean管理和页面导航的配置。
JavaBean管理。
对于JavaBean管理,可以使用应用程序配置文件faces-config.xml中的managed-bean元件。每个managed-bean元件都会注册一个JavaBean--JSF会将该JavaBean在特定的作用域内实例化和进行储存。managed-bean元件定义如下:
<!ELEMENT managed-bean (description*, display-name*, icon*, managed-bean
name, managed-bean-class, managed-bean-scope, (managed-property* | map-entries |
list-entries))>
每个managed-bean元件都必须包含一个managed-bean-name元件,一个managed-bean-class元件,以及一个managed-bean-scope元件,并且可选择性地包含一些描述、显示名、图标和managed-property/map-entries/list-entries元件。
managed-bean-name指定了被用来在整个应用程序中引用该JavaBean的名称。managed-bean-class元件包含该JavaBean的完全限度的类名。managed-bean-scope元件定义该JavaBean的作用域。该元件可能的值是:application、session、request或者none。如果managed-bean-scope元件是none以外的其他值,那么,所创建的该JavaBean元件将会被存储在相应的对象中。比如说,如果值是"session",那么,该JavaBean就会被存储在一个给定用户的session对象中。
在PizzaRia应用程序中,我注册了如
代码清单1
所示的4个JavaBeans。
页面导航:
页面导航决定了Web应用程序的控制流。本节演示如何在JSF中创立一个页面导航。
JSF使用navigation-rule元件来为页面导航定义规则。其定义如下:
<!ELEMENT navigation-rule
(description*, display-name*, icon*, from-view-id?, navigation-case*)>
from-view-id元件是首页(起始页)的标识符。为了说明被称之为index.jsp的JSP页面的导航规则,下面给出子元件from-view-id的值:
<from-view-id>/index.jsp</from-view-id>
navigation-case元件表示一个可能的目标页面。navigation-rule一个元件可以有零个或者数个navigation-case子元件。
每个navigation-case元件都指定from-view-id的特定处理结果的目标页面。结果可以来自from-view-id元件中 UICommand组件的行动(action)属性。
navigation-case元件由如下所示的代码描述:
<!ELEMENT navigation-case
(description*, display-name*, icon*, from-action?, from-outcome?,
to-view-id, redirect?)>
to-view-id元件指定目标页面。from-outcome值是处理from-view-id的结果。该值来自于在from-view-id中触发了ActionEvent的 UICommand组件的行动属性。
from-action元件也表示处理from-view-id的结果。但其值来自于引发了ActionEvent的UICommand组件的行动属性的运算值。
代码清单2
展示了在PizzaRia应用程序中使用的navigation-rule元件。
在JSP页面中使用UI组件
JSF提供两个定制标记库来帮助用户快速编写Web应用程序:HTML和Core。HTML定制标记库定义了用来表示UI组件的标记。Core定制标记库使用具有组件的验证器(validators)定义了注册事件处理器的核心行动,以及其他一些行动。你可以在自己的JSF应用程序的JSP页面中使用这两个库的标记。
为了在JSP页面中使用HTML和Core定制标记库,必须在页面中包含如下所示的taglib指令:
<%@ taglib uri="http://java.sun.com
/jsf/html/" prefix="h" %>
<%@ taglib uri="http://java.sun.com/
jsf/core/" prefix="f" %>
Prefix的属性值可以是任意值。但是,根据惯例,最好是使用"h"和"f"。
在JSF应用程序中编写JSP页面是每一个页面制作者的责任。除了布置组件之外,他们的责任还包括把组件绑定到模型对象数据并且把Core标记(诸如事件监听器和验证器)添加到组件标记中。
在HTML定制标记库中有25个标记。每个组件都呈现为一个HTML元件,而多个标记被呈现为同一个HTML元件。表1列出了HTML定制标记库中的标记。
标记 |
说明 |
Column |
在UIData组件内表示一个数据列。 |
command_button |
表示一个向服务器提交表单的按钮。 |
command_link |
表示一个指向另一页面或者本页面内其他位置的超链接。 |
data_table |
表示一个支持将数据绑定到一个数据对象的集合上的表。 |
Form |
表示一个表单。 |
graphic_image |
显示一张图片。 |
input_hidden |
表示一个隐藏的元件。 |
input_secret |
表示一个密码输入框。 |
input_text |
表示一个可接受单个字符串的文本输入框。 |
input_textarea |
表示一个可接受多个字符串的文本输入区。 |
Message |
显示给定组件的信息。 |
Messages |
表示一个从FacesContext中获取消息并且将其显示给用户的组件。 |
output_label |
显示文本。 |
output_link |
显示一个超链接。 |
output_message |
显示给定组件的信息。 |
output_text |
显示一行文本。 |
panel_grid |
显示一张表。 |
panel_group |
将一个组件集合分组。 |
selectboolean_checkbox |
表示一个单选文本框。 |
selectmany_checkboxlist |
显示一套复选框,用户从中可以选择多个值。 |
selectmany_listbox |
表示一个多选下拉选择框,用户从中可以选择多个项目。 |
selectmany_menu |
表示一个多选项目列表,用户从中可以选择多个项目。 |
selectone_listbox |
表示一个单选下拉选择框,用户从中只能选择一个项目。 |
selectone_menu |
表示单选项目列表,用户从中只能选择一个项目。 |
selectone_radio |
表示一套单选按钮。 |
使用验证器
验证器使得输入确认简单化并且可以节省开发人员的大量编程时间。JSF提供一套验证器类用于确认输入到输入组件中的值。另外一种方法就是,如果现有的标准验证器不符合需要,那么开发人员还可以编写自己的验证器。
验证器是一个实现类(implementation class),它可以验证输入值,如果是非法输入,就会发出一个错误信息。可以通过将一个验证器嵌入一个其输入需要验证的输入组件中来使用它。如果该验证器判断出用户的输入是非法的,那么JSF servlet就会重新显示刚才提交了表单的那个JSP页面,而不会将本地值复制给绑定到该输入组件上的JavaBean实例。
JSF实现为通用的验证任务提供了3个标准验证器,包括检查必填的域内已填入内容、输入的内容符合长度和范围要求。
表2
列举了标准的验证器。
验证器类 |
标记 |
说明 |
LengthValidator |
validate_length |
确保组件的本地值的长度在规定的范围之内。该值必须是字符串型。 |
LongRangeValidator |
validate_longrange |
确保组件的本地值在规定的范围之内。该值必须能够被转换成长型。 |
DoubleRangeValidator |
validate_doublerange |
确保组件的本地值在规定的范围内。该值必须能够被转换成浮点型。 |
另外,HTML定制标记库中的input_text和input_textarea标记有必填的属性。如果将该属性标赋值为真,那么用户在继续进行操作之前,就必须对文本输入框元件或者文本输入区域进行填写。
在PizzaRia应用程序中,checkOut.jsp页面使用该必填的属性以便保证没有一个域是空的。
事件处理
JSP应用程序是事件驱动型的程序。在JSF中处理事件令人惊奇的简单。以下是处理步骤:
- 编写事件监听器。
- 在程序目录下的WEB-INF/classes or WEB-INF/lib目录中部署事件监听器。
- 在表示组件(其事件被捕获)的标记中,使用Core定制标记库中定义的action_listener或者 valuechange_listener标记。
在JSF中的事件对象。
JSF中的所有事件对象必须提供javax.faces .event.FacesEvent类,以便这些事件被请求处理生命周期支持。FacesEvent类是java.util.EventObject的子类,并添加了getComponent方法,该方法返回引发该事件的UIComponent组件。
FacesEvent类有两个子类:ActionEvent和 ValueChangeEvent。ActionEvent类激活诸如UICommand组件之类的UI组件。
ValueChangeEvent类会发出一个通知,告知本地UIInput组件的值被修改了。然而,如果新值没有被成功地验证为合法的,则不会发出ValueChangeEvent通知。被加入到该类中的两个重要方法是getOldValue 和 getNewValue。getOldValue方法返回引发该事件的组件的旧值。getNewValue方法返回相应的新值。这两种方法的返回值类型都是java .lang.Object。
第三,JSF中的事件监听器。
为捕获一个JSF事件,
需要使用一个事件监听器。JSF程序中的所有监听器都必须实现javax.faces.event.FacesListener接口。该接口提供java.util.EventListener接口,后者是必须由所有Java事件监听器实现的接口。
Faces Listener接口有两个子接口:ActionListener 和 ValueChangeListener。ActionListener接口是为了捕获ActionEvent而必须被实现的接口。该接口添加了一个新的方法--processAction--该方法请求处理生命周期来调用。当为之注册了ActionListener 的ActionEvent发生事件时,就会调用processAction。processAction方法的代码如下:
public void processAction(ActionEvent
event)
throws AbortProcessingException
ValueChangeListener接口是为了捕获ValueChangeEvent而实现的接口。该接口添加了一个方法:processValueChange。当ValueChangeEvent动作被其监听者监听到时,就会调用processValueChange方法。processValueChange方法的代码如下:
public void processValueChange(ValueChangeEvent
event)
throws AbortProcessingException
在PizzaRia应用程序中,开发人员需要一个名为AppAction Listener 的ActionListener。其processAction方法从ActionEvent对象的getLocalValue方法获取传递给该方法的本地值。如果本地值为"Buy(购买)",则processAction获取与用户相关的ShoppingCartBean对象,并且将shoppingItem加入到bean中去。如果本地值为"pay(付款)",那么processAction就从session(会话)对象获取OrderBean对象和ShoppingCartBean对象,并调用DatabaseUtil对象的insertOrder方法。
代码清单3
描述了processAction方法。
AppActionListener类使用两个非常有用的方法:getValueBinding 和getDatabaseUtil。getValueBinding接受指定对象名的字符串,并返回一个可以向下转换类型为对象类型的ValueBinding对象。比如说,为获得用户的在应用程序配置文件中被注册成shoppingCartBean 的ShoppingCartBean实例,开发人员需要通过传递"shoppingCartBean"来调用getValueBinding。
ShoppingCartBean cart = (ShoppingCartBean)
getValueBinding("#{shoppingCartBean}").getValue(facesContext);
getValueBinding方法如下:
private ValueBinding getValueBinding(String valueRef) {
ApplicationFactory factory =
(ApplicationFactory)FactoryFinder
.getFactory(FactoryFinder
.APPLICATION_FACTORY);
Application application = factory.getApplication();
return
application.createValueBinding
(valueRef);
}
getDatabaseUtil方法返回一个对ServletContext中的DatabaseUtil实例的引用:
private DatabaseUtil getDatabaseUtil() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext)
facesContext.getExternalContext()
.getContext();
return (DatabaseUtil) servletContext
.getAttribute("DATABASE_UTIL");
}
运行该应用程序
该PizzaRia JSF应用程序用JSF参考实现(JavaServer Faces [JSF] Beta 1.0)已做过测试。请参看该应用程序的zip文件(
pizzaria.zip
)中的readme.txt文件,以便获得有关部署PizzaRia应用程序的更详细信息。