Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 329|回复: 0

[jsf学习]JSF实例学习--比萨(pizza)订购系统。

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 03:55:08 | 显示全部楼层 |阅读模式
    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.jsp页被访问的时候,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表。
    package pizzaria; import java.util.ArrayList;
    import java.util.Iterator;
    import javax.faces.context.FacesContext;
    import javax.Servlet.ServletContext; public class MenuBean {     String browsePage = "details.jsp";
        public String getBrowsePage() {
            return browsePage;
        }

        public void setBrowsePage(String page) {
           browsePage = page;
        }

        public String getMenu() {
          // get DatabaseUtil instance
          FacesContext facesContext = FacesContext.getCurrentInstance();
          ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
          DatabaseUtil dbUtil = (DatabaseUtil) servletContext.getAttribute("DATABASE_UTIL");       StringBuffer buffer = new StringBuffer(512);
          buffer.append("<table>
    ");
          ArrayList summaries = dbUtil.getProductSummaries();
          Iterator iterator = summaries.iterator();
          while (iterator.hasNext()) {
               ProductSummary summary = (ProductSummary) iterator.next();
               buffer.append("<tr><td>");
               buffer.append("<a href="" + browsePage + "?productId=" + summary.getId() + "">" +
                      summary.getName() + "</a>");
              buffer.append("</td></tr>
    ");
          }
          buffer.append("</table>
    ");
          return buffer.toString();
        }
    }

    DatabaseUtil。DatabaseUtil提供了以下3种方法以便访问和操作数据:  

      
      GetProductSummaries:该方法返回一个包含了产品表中所有产品概要的列表。一个产品概要通过ProductSummary类来表示。
      
      


      
      
       GetProductDetails:该方法返回一个ProductBean对象,该对象封装具有特定标识符的产品细节。
         
      
      
       InsertOrder:该方法向Orders表和OrderDetails表插入客户订单。
       
    应用程序上下文监听器       应用程序上下文监听器(AppContextListener类)从web.xml文件读出用于访问数据库的初始参数,然后将其写入
    ServletContext对象。用到的初始参数如下:jdbcDriver, dbUrl, dbUserName和 dbPassword。在你的web.xml文件中编辑这些值, 以便反应你数据库的真实值。


    1. package pizzaria;
    2. import javax.servlet.ServletContext;
    3. import javax.servlet.ServletContextEvent;
    4. import javax.servlet.ServletContextListener;
    5. public class AppContextListener implements ServletContextListener {
    6.    //从web.xml文件中读取Servlet上下文初始化参数,构造一个DatabaseUtil对象
    7.   public void contextInitialized(ServletContextEvent event) {
    8.     DatabaseUtil dbUtil = new DatabaseUtil();
    9.     ServletContext servletContext = event.getServletContext();
    10.     String jdbcDriver = servletContext.getInitParameter("jdbcDriver");
    11.     String dbUrl = servletContext.getInitParameter("dbUrl");
    12.     String dbUserName = servletContext.getInitParameter("dbUserName");
    13.     String dbPassword = servletContext.getInitParameter("dbPassword");
    14.     dbUtil.setJdbcDriver(jdbcDriver);
    15.     dbUtil.setDbUrl(dbUrl);
    16.     dbUtil.setDbUserName(dbUserName);
    17.     dbUtil.setDbPassword(dbPassword);
    18.     servletContext.setAttribute("DATABASE_UTIL", dbUtil);
    19.   }
    20.   public void contextDestroyed(ServletContextEvent event) {
    21.     ServletContext servletContext = event.getServletContext();
    22.     servletContext.removeAttribute("DATABASE_UTIL");
    23.   }
    24. }
    复制代码

      JSF应用程序配置
         JSF允许编程人员仅仅通过应用程序配置文件就可以轻松配置应用程序。该文件如果存在的话,则它应该被命名为faces-config.xml, 并且应该位于你应用程序下的WEB-INF 目录。    可以在faces-config.xml文件中对该应用程序的多个方面进行配置,包括bean管理、页面导航、定制UI(用户界面)组件、
    定制验证程序和消息资源。在 PizzaRia 应用程序中,我将该faces-config.xml用于bean管理和页面导航的配置。

       <?xml version="1.0"?>
    <!DOCTYPE faces-config PUBLIC
    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
    "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
    <faces-config>
       <managed-bean>
           <managed-bean-name>menuBean</managed-bean-name>
           <managed-bean-class>pizzaria.MenuBean</managed-bean-class>
           <managed-bean-scope>application</managed-bean-scope>
        </managed-bean>
        <managed-bean>
           <managed-bean-name>productBean</managed-bean-name>
           <managed-bean-class>pizzaria.ProductBean</managed-bean-class>
           <managed-bean-scope>request</managed-bean-scope>
        </managed-bean>
        <managed-bean>
           <managed-bean-name>shoppingCartBean</managed-bean-name>
           <managed-bean-class>pizzaria.ShoppingCartBean</managed-bean-class>
           <managed-bean-scope>session</managed-bean-scope>
         </managed-bean>
         <managed-bean>
            <managed-bean-name>orderBean</managed-bean-name>
            <managed-bean-class>pizzaria.OrderBean</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
          </managed-bean>       <navigation-rule>
             <from-view-id>/details.jsp</from-view-id>
             <navigation-case>
                  <to-view-id>/shoppingCart.jsp</to-view-id>
             </navigation-case>
          </navigation-rule>
          <navigation-rule>
              <from-view-id>/shoppingCart.jsp</from-view-id>
              <navigation-case>
                 <from-outcome>checkOut</from-outcome>
                 <to-view-id>/checkOut.jsp</to-view-id>
              </navigation-case>
          </navigation-rule>
          <navigation-rule>
              <from-view-id>/checkOut.jsp</from-view-id>
              <navigation-case>
                 <from-outcome>order</from-outcome>
                 <to-view-id>/order.jsp</to-view-id>
              </navigation-case>
          </navigation-rule>
    </faces-config>

    事件处理     在这个应用程序中,开发人员需要一个名为AppAction Listener 的ActionListener。其processAction方法从ActionEvent对象的getLocalValue方法获取传递给该方法的本地值。如果本地值为"Buy(购买)",则processAction获取与用户相关的ShoppingCartBean 对象,并且将shoppingItem加入到bean中去。如果本地值为"pay(付款)",那么processAction就从session(会话)对象获取 OrderBean对象和ShoppingCartBean对象,并调用DatabaseUtil对象的insertOrder方法。  

    1. package pizzaria;
    2. import java.util.Map;
    3. import javax.faces.FactoryFinder;
    4. import javax.faces.application.Application;
    5. import javax.faces.application.ApplicationFactory;
    6. import javax.faces.component.UICommand;
    7. import javax.faces.context.FacesContext;
    8. import javax.faces.el.ValueBinding;
    9. import javax.faces.event.ActionEvent;
    10. import javax.faces.event.ActionListener;
    11. import javax.servlet.ServletContext;
    12. public class AppActionListener implements ActionListener {
    13.   public void processAction(ActionEvent event) {
    14.     FacesContext facesContext = FacesContext.getCurrentInstance();
    15.     String localValue = (String) ((UICommand) event.getComponent()).getValue();
    16.     if ("Buy".equals(localValue)) {
    17.       String productId = (String)
    18.         facesContext.getExternalContext().getRequestParameterMap().get("myForm:productId");
    19.       Map sessionMap = facesContext.getExternalContext().getSessionMap();
    20.       ShoppingCartBean cart = (ShoppingCartBean) sessionMap.get("shoppingCartBean");
    21.       if (cart==null) {
    22.         cart = new ShoppingCartBean();//创建购物车
    23.         sessionMap.put("shoppingCartBean", cart);
    24.       }
    25.       
    26.       ProductBean product = getDatabaseUtil().getProductDetails(productId);
    27.       ShoppingItemBean shoppingItem = new
    28.         ShoppingItemBean(product.getId(), product.getName(), product.getPrice(), 1);
    29.       cart.addShoppingItem(shoppingItem);
    30.     }
    31.     else if ("Pay".equals(localValue)) {
    32.       // insert a record into the database
    33.       OrderBean order = (OrderBean) getValueBinding("#{orderBean}").getValue(facesContext);
    34.       ShoppingCartBean cart = (ShoppingCartBean)
    35.         getValueBinding("#{shoppingCartBean}").getValue(facesContext);
    36.       if (cart!=null && order!=null) {
    37.         getDatabaseUtil().insertOrder(order, cart);
    38.         // empty shopping cart
    39.         cart.removeShoppingItems();
    40.       }
    41.     }
    42.   }
    43.   private ValueBinding getValueBinding(String valueRef) {
    44.     ApplicationFactory factory =
    45.          (ApplicationFactory)FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
    46.     Application application = factory.getApplication();
    47.     return application.createValueBinding(valueRef);
    48.   }
    49.   private DatabaseUtil getDatabaseUtil() {
    50.     FacesContext facesContext = FacesContext.getCurrentInstance();
    51.     ServletContext servletContext = (ServletContext)
    52. facesContext.getExternalContext().getContext();
    53.     return (DatabaseUtil) servletContext.getAttribute("DATABASE_UTIL");
    54.   }
    55. }
    56.                         
    复制代码

              AppActionListener类使用两个非常有用的方法:getValueBinding 和getDatabaseUtil。getValueBinding接受指定对象名的
    字符串,并返回一个可以向下转换类型为对象类型的ValueBinding对象。比如说,为获得用户的在应用程序配置文件中被注册成shoppingCartBean 的ShoppingCartBean实例,开发人员需要通过传递"shoppingCartBean"来调用getValueBinding。  
    1.     ShoppingCartBean cart = (ShoppingCartBean) getValueBinding("#{shoppingCartBean}").getValue(facesContext);
    2. getDatabaseUtil方法返回一个对ServletContext中的DatabaseUtil实例的引用:
    复制代码

    1. private DatabaseUtil getDatabaseUtil() {
    2.    FacesContext facesContext = FacesContext.getCurrentInstance();
    3.    ServletContext servletContext = (ServletContext)facesContext.getExternalContext().getContext();
    4.    return (DatabaseUtil) servletContext.getAttribute("DATABASE_UTIL");
    5.   }
    6. 运行程序:
    7. http://127.0.0.1:8080/pizza/faces/index.jsp
    8.    该PizzaRia JSF应用程序原作者使用JavaServer Faces[JSF] 1.0。为了学习方便,站长将其改用了jsf1.1+Access,并改写了
    9. 所有jsp文件。请下载源码分析。

    复制代码

      
       
       
         
         

          
         

          
         
       
      


    源码下载:http://file.javaxxz.com/2014/10/10/035506796.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-5-8 05:57 , Processed in 0.367708 second(s), 54 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表