Struts2实现CRUD(增 删 改 查)功能实例代码
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 webcontent/book/list.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实现方法,所以有很多功能没有实现,如国际化和数据校验等。大家可以在上面例子的基础将其完善,当作练习也不错。有不明白的地方欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对网站的支持!
推荐阅读
-
Struts2实现CRUD(增 删 改 查)功能实例代码
-
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
-
Android--SQLite(增,删,改,查)操作实例代码
-
Android--SQLite(增,删,改,查)操作实例代码
-
php开发留言板的CRUD(增,删,改,查)操作_php实例
-
php开发留言板的CRUD(增,删,改,查)操作_php实例
-
php开发留言板的CRUD(增,删,改,查)操作_php实例
-
简单的php数据库操作类代码(增,删,改,查)_php实例
-
Android数据库(SQLite)的简单使用——增、删、查改功能的简单实现
-
php开发留言板的CRUD(增,删,改,查)操作_php实例