欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts2实现CRUD(增 删 改 查)功能实例代码

程序员文章站 2024-03-12 14:10:08
crud是create(创建)、read(读取)、update(更新)和delete(删除)的缩写,它是普通应用程序的缩影。如果您掌握了某框架的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,出现如下图所示页面:

Struts2实现CRUD(增 删 改 查)功能实例代码

清单8 列表页面

点击“add book”,出现如下图所示页面:

Struts2实现CRUD(增 删 改 查)功能实例代码

清单9 添加书籍页面

后退回到列表页面,点击“edit”,出现如下图所示页面:

Struts2实现CRUD(增 删 改 查)功能实例代码

清单10 编辑书籍页面

总结

本文只是粗略地了介绍struts 2的crud实现方法,所以有很多功能没有实现,如国际化和数据校验等。大家可以在上面例子的基础将其完善,当作练习也不错。有不明白的地方欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对网站的支持!