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入门到精通教程
查看: 232|回复: 0

[struts学习]在Struts 2中实现CRUD

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

    [LV.1]初来乍到

    发表于 2014-10-11 07:17:27 | 显示全部楼层 |阅读模式
    CRUD是Create(创建)、Read(读取)、Update(更新)和Delete(删除)的缩写,它是普通应用程序的缩影。如果您掌握了某框架的CRUD编写,那么意味可以使用该框架创建普通应用程序了,所以大家使用新框架开发OLTP(Online Transaction Processing)应用程序时,首先会研究一下如何编写CRUD。这类似于大家在学习新编程语言时喜欢编写“Hello World”。
            本文旨在讲述Struts 2上的CRUD开发,所以为了例子的简单易懂,我不会花时间在数据库的操作上。取而代之的是一个模拟数据库的哈希表(Hash Map)。
        具体实现
        首先,让我们看看的“冒牌”的DAO(Data Access Object,数据访问对象),代码如下:
       
      
       
       
         
       

       
       
      
      
          
       
       
        package
         tutorial.dao;


        import
         java.util.Collection;

        import
         java.util.concurrent.ConcurrentHashMap;

        import
         java.util.concurrent.ConcurrentMap;


        import
         tutorial.model.Book;


        public
         
        class
         BookDao
       
        {
        private static final BookDao instance;
        private static final ConcurrentMap<String, Book> data;
       
        static {
            instance = new BookDao();
            data = new ConcurrentHashMap<String, Book>();
            data.put("978-0735619678", new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
            data.put("978-0596007867", new Book("978-0596007867", "The Art of Project Management", 35.96));
            data.put("978-0201633610", new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
            data.put("978-0596527341", new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
            data.put("978-0735605350", new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
        }
       
        private BookDao() {}
       
        public static BookDao getInstance() {
            return instance;
        }
       
        public Collection<Book> getBooks() {
            return data.values();
        }
       
        public Book getBook(String isbn) {
            return data.get(isbn);
        }
       
        public void storeBook(Book book) {
            data.put(book.getIsbn(), book);
        }
            
        public void removeBook(String isbn) {
            data.remove(isbn);
        }
       
        public void removeBooks(String[] isbns) {
            for(String isbn : isbns) {
                data.remove(isbn);
            }
        }
    }
        清单1 src/tutorial/dao/BookDao.java 以上代码相信不用解释大家也清楚,我使用ConcurrentMap数据结构存储Book对象,这主要是为了方便检索和保存Book对象;另外,我还将data变量设为静态唯一来模拟应用程序的数据库。 接下来是的数据模型Book类,代码如下:
       
       
        package
         tutorial.model;


        public
         
        class
         Book
       
        {
        private String isbn;
        private String title;
        private double price;
       
        public Book() {        
        }
       
        public Book(String isbn, String title, double price) {
            this.isbn = isbn;
            this.title = title;
            this.price = price;
        }

        public String getIsbn() {
            return isbn;
        }

        public void setIsbn(String isbn) {
            this.isbn = isbn;
        }

        public double getPrice() {
            return price;
        }

        public void setPrice(double price) {
            this.price = price;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }   
    }
        清单2 src/tutorial/model/Book.java Book类有三个属性isbn,、title和price分别代表书籍的编号、名称和价格,其中编号用于唯一标识书籍(相当数据库中的主键)。 然后,我们再来看看Action类的代码:
       
       
        package
         tutorial.action;


        import
         java.util.Collection;


        import
         tutorial.dao.BookDao;

        import
         tutorial.model.Book;


        import
         com.opensymphony.xwork2.ActionSupport;


        public
         
        class
         BookAction
        extends
         ActionSupport
       
        {
        private static final long serialVersionUID = 872316812305356L;
       
        private String isbn;
        private String[] isbns;
        private Book book;
        private Collection<Book> books;
        private BookDao dao =  BookDao.getInstance();
            
        public Book getBook() {
            return book;
        }

        public void setBook(Book book) {
            this.book = book;
        }

        public String getIsbn() {
            return isbn;
        }

        public void setIsbn(String isbn) {
            this.isbn = isbn;
        }

        public String[] getIsbns() {
            return isbns;
        }

        public void setIsbns(String[] isbns) {
            this.isbns = isbns;
        }
            
        public Collection<Book> getBooks() {
            return books;
        }

        public void setBooks(Collection<Book> books) {
            this.books = books;
        }

        public String load() {
            book = dao.getBook(isbn);
            return SUCCESS;
        }

        public String list() {
            books = dao.getBooks();
            return SUCCESS;
        }
            
        public String store() {
            dao.storeBook(book);
            return SUCCESS;
        }
       
        public String remove() {
            if(null != isbn) {
                dao.removeBook(isbn);
            } else {
                dao.removeBooks(isbns);
            }
            return SUCCESS;
        }
    }
        清单3 src/tutorial/action/BookAction.java BookAction类中属性isbn用于表示待编辑或删除的书籍的编号,属性isbns用于表示多个待删除的书籍的编号数组,属性book表示当前书籍,属性books则表示当前的书籍列表。BookAction有四个Action方法分别是load、list、store和remove,也即是CRUD都集中在BookAction中实现。 再下来是Action的配置代码:
       
        <?
        xml version="1.0" encoding="UTF-8"
        ?>
       


        <!
        DOCTYPE struts PUBLIC
         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
         "http://struts.apache.org/dtds/struts-2.0.dtd"
        >
       


        <
        struts
        >
       
         
        <
        package
        name
        ="Struts2_CRUD_DEMO"
         extends
        ="struts-default"
         namespace
        ="/Book"
        >
       
             
        <
        action
        name
        ="List"
         class
        ="tutorial.action.BookAction"
         method
        ="list"
        >
       
                
        <
        result
        >
        List.jsp
        </
        result
        >
       
             
        </
        action
        >
       
             
        <
        action
        name
        ="Edit"
         class
        ="tutorial.action.BookAction"
         method
        ="load"
        >
       
                
        <
        result
        >
        Edit.jsp
        </
        result
        >
       
             
        </
        action
        >
       
             
        <
        action
        name
        ="Store"
         class
        ="tutorial.action.BookAction"
         method
        ="store"
        >
       
                
        <
        result
        type
        ="redirect"
        >
        List.action
        </
        result
        >
       
             
        </
        action
        >
       
             
        <
        action
        name
        ="Remove"
         class
        ="tutorial.action.BookAction"
         method
        ="remove"
        >
       
                
        <
        result
        type
        ="redirect"
        >
        List.action
        </
        result
        >
       
             
        </
        action
        >
       
         
        </
        package
        >
       

        </
        struts
        >
        清单4 src/struts.xml 以上的配置中,我使用了四个Action定义。它们都在“/Book”名值空间内。这样我就可以分别通过“http://localhost:8080/Struts2_CRUD/Book/List.action”、“http://localhost:8080/Struts2_CRUD/Book/Edit.action”、“http://localhost:8080/Struts2_CRUD/Book/Store.action”和“http://localhost:8080/Struts2_CRUD/Book/Remove.action”来调用BookAction的四个Action方法进行CRUD操作。当然,这只是个人喜好,你大可以只定义一个Action(假设其名称为“Book”),之后通过“http://localhost:8080/Struts2_CRUD/Book!list.action”的方式来访问,详细做法请参考《Struts 2.0的Action讲解》。另外,我由于希望在完成编辑或删除之后回到列表页,所以使用类型为redirect(重定向)的result。 下面是列表页面的代码:
       
        <%
        @ page language
        =
        "
        java
        "
         contentType
        =
        "
        text/HTML; charset=utf-8
        "
         pageEncoding
        =
        "
        utf-8
        "
         
        %>
       

        <%
        @ taglib prefix
        =
        "
        s
        "
         uri
        =
        "
        /struts-tags
        "
         
        %>
       


        <!
        DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
        >
       

        <
        html
        xmlns
        ="http://www.w3.org/1999/xhtml"
        >
       

        <
        head
        >
       
         
        <
        title
        >
        Book List
        </
        title
        >
       
         
        <
        style
        type
        ="text/css"
        >
       
             table
        {
       
                 border
        :
         1px solid black
        ;
       
                 border-collapse
        :
         collapse
        ;
       
             
        }
       
             
             table thead tr th
        {
       
                 border
        :
         1px solid black
        ;
       
                 padding
        :
         3px
        ;
       
                 background-color
        :
         #cccccc
        ;
       
             
        }
       
             
             table tbody tr td
        {
       
                 border
        :
         1px solid black
        ;
       
                 padding
        :
         3px
        ;
       
             
        }
       
         
        </
        style
        >
       

        </
        head
        >
       

        <
        body
        >
            
         
        <
        h2
        >
        Book List
        </
        h2
        >
       
         
        <
        s:form
        action
        ="Remove"
         theme
        ="simple"
        >
       
             
        <
        table
        cellspacing
        ="0"
        >
       
                
        <
        thead
        >
       
                     
        <
        tr
        >
       
                         
        <
        th
        >
        Select
        </
        th
        >
       
                         
        <
        th
        >
        ISBN
        </
        th
        >
       
                         
        <
        th
        >
        Title
        </
        th
        >
       
                         
        <
        th
        >
        Price
        </
        th
        >
       
                         
        <
        th
        >
        Operation
        </
        th
        >
       
                     
        </
        tr
        >
       
                
        </
        thead
        >
       
                
        <
        tbody
        >
       
                     
        <
        s:iterator
        value
        ="books"
        >
       
                         
        <
        tr
        >
       
                            
        <
        td
        ><
        input
        type
        ="checkbox"
         name
        ="isbns"
         value
        ="<s:property
        value
        ="isbn"
         
        />
        " />
        </
        td
        >
       
                            
        <
        td
        ><
        s:property
        value
        ="isbn"
         
        /></
        td
        >
       
                            
        <
        td
        ><
        s:property
        value
        ="title"
         
        /></
        td
        >
       
                            
        <
        td
        >
        $
        <
        s:property
        value
        ="price"
         
        /></
        td
        >
       
                            
        <
        td
        >
       
                                 
        <
        a
        href
        ="<s:url
        action
        ="Edit"
        ><
        s:param
        name
        ="isbn"
         value
        ="isbn"
         
        /></
        s:url
        >
        ">
                                     Edit
                                 
        </
        a
        >
       
                                 
         
       
                                 
        <
        a
        href
        ="<s:url
        action
        ="Remove"
        ><
        s:param
        name
        ="isbn"
         value
        ="isbn"
         
        /></
        s:url
        >
        ">
                                     Delete
                                 
        </
        a
        >
       
                            
        </
        td
        >
       
                         
        </
        tr
        >
       
                     
        </
        s:iterator
        >
       
                
        </
        tbody
        >
       
             
        </
        table
        >
       
             
        <
        s:submit
        value
        ="Remove"
         
        /><
        a
        href
        ="Edit.jsp"
        >
        Add Book
        </
        a
        >
       
         
        </
        s:form
        >
            

        </
        body
        >
       

        </
        html
        >
        清单5 WebContentBookList.jsp 以上代码,值得注意的是在<s:form>标签,我设置了theme属性为“simple”,这样可以取消其默认的表格布局。之前,有些朋友问我“如果不希望提交按钮放在右边应该怎样做?”,上述做汗是答案之一。当然,更佳的做法自定义一个theme,并将其设为默认应用到整个站点,如此一来就可以得到统一的站点风格。我会在以后的文章中会对此作详细的描述。 编辑或添加书籍的页面代码如下:
       
        <%
        @ page language
        =
        "
        java
        "
         contentType
        =
        "
        text/html; charset=utf-8
        "
         pageEncoding
        =
        "
        utf-8
        "
         
        %>
       

        <%
        @ taglib prefix
        =
        "
        s
        "
         uri
        =
        "
        /struts-tags
        "
         
        %>
       


        <!
        DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
        >
       

        <
        html
        xmlns
        ="http://www.w3.org/1999/xhtml"
        >
       

        <
        head
        >
       
         
        <
        title
        >
        Book
        </
        title
        >
       

        </
        head
        >
       

        <
        body
        >
            
         
        <
        h2
        >
       
             
        <
        s:if
        test
        ="null == book"
        >
       
                 Add Book
             
        </
        s:if
        >
       
             
        <
        s:else
        >
       
                 Edit Book
             
        </
        s:else
        >
       
         
        </
        h2
        >
       
         
        <
        s:form
        action
        ="Store"
         
        >
       
             
        <
        s:textfield
        name
        ="book.isbn"
         label
        ="ISBN"
         
        />
       
             
        <
        s:textfield
        name
        ="book.title"
         label
        ="Title"
         
        />
       
             
        <
        s:textfield
        name
        ="book.price"
         label
        ="Price"
         
        />
       
             
        <
        s:submit
        />
       
         
        </
        s:form
        >
       

        </
        body
        >
       

        </
        html
        >
        清单6 WebContent/Book/Edit.jsp 如果book为null,则表明该页面用于添加书籍,反之则为编辑页面。 为了方便大家运行示例,我把web.xml的代码也贴出来,如下:
       
        <?
        xml version="1.0" encoding="UTF-8"
        ?>
       

        <
        web-app
        id
        ="WebApp_9"
         version
        ="2.4"
       
         xmlns
        ="http://java.sun.com/xml/ns/j2ee"
       
         xmlns:xsi
        ="http://www.w3.org/2001/XMLSchema-instance"
       
         xsi:schemaLocation
        ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
        >
       

         
        <
        display-name
        >
        Struts 2 Fileupload
        </
        display-name
        >
       
         
         
        <
        filter
        >
       
             
        <
        filter-name
        >
        struts2
        </
        filter-name
        >
       
             
        <
        filter-class
        >
       
                 org.apache.struts2.dispatcher.FilterDispatcher
             
        </
        filter-class
        >
       
         
        </
        filter
        >
       

         
        <
        filter-mapping
        >
       
             
        <
        filter-name
        >
        struts2
        </
        filter-name
        >
       
             
        <
        url-pattern
        >
        /*
        </
        url-pattern
        >
       
         
        </
        filter-mapping
        >
       

         
        <
        welcome-file-list
        >
       
             
        <
        welcome-file
        >
        index.html
        </
        welcome-file
        >
       
         
        </
        welcome-file-list
        >
       


        </
        web-app
        >
        清单7 WebContent/WEB-INF/web.xml 大功告成,下面发布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_CRUD/Book/List.action,出现如下图所示页面:
    清单8 列表页面  点击“Add Book”,出现如下图所示页面:
    清单9 添加书籍页面  后退回到列表页面,点击“Edit”,出现如下图所示页面:
    清单10 编辑书籍页面  总结 本文只是粗略地了介绍Struts 2的CRUD实现方法,所以有很多功能没有实现,如国际化和数据校验等。大家可以在上面例子的基础将其完善,当作练习也不错。如果过程中有不明白之处,可以参考我早前的文章或给我发E-Mail:max.m.yuan@gmail.com
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-23 00:01 , Processed in 0.496473 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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