Struts 学习已经告一个段落,现在我们运用之前学习的知识做一个小的总结,完成一个示例小程序:图书管理系统的图书添加操作!
(1)图书类型为下拉框,其中的数据来自“图书类别表”;
(2)图书封面可以上传一个图片文件;
(3)提交后将图书名称、图书单价、图书类型、图片名称 保存到数据库中,库结构自定义;
(4)将图书封面保存到网站中的一个文件夹中;
(5)参考界面如下,可以根据需要在表单中添加其它的图书信息:

(1)数据库结构
- 图书类别TABLE
DROP TABLE IF EXISTS `type`; CREATE TABLE `type` ( `typeId` int(11) NOT NULL auto_increment, `typeName` varchar(100) NOT NULL, PRIMARY KEY (`typeId`) ) ENGINE=MyISAM INSERT INTO `type` VALUES (1,'数据库编程'); INSERT INTO `type` VALUES (2,'JAVA编程'); INSERT INTO `type` VALUES (3,'.NET编程');
DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `bookId` int(11) NOT NULL auto_increment, `bookName` varchar(100) NOT NULL, `bookPrice` decimal(18,0) NOT NULL, `bookType` int(11) NOT NULL, `bookImage` varchar(100) NOT NULL default 'default.gif', PRIMARY KEY (`bookId`), KEY `foreignkey_booktype_type` (`bookType`) ) ENGINE=MyISAM
(2)根据数据库建立相应的实体BEAN
- BookType.java
package cn.net.royakon.entity;
public class BookType {
private int typeId;
private String typeName;
public int getTypeId() {
return typeId;
}
public void setTypeId(int typeId) {
this.typeId = typeId;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
}
package cn.net.royakon.entity;
import org.apache.struts.upload.FormFile;
public class Book {
private int bookId;
private String bookName;
private double bookPrice;
private int bookType;
private String bookImageName;
//FormFile 类型的属性为冗余的属性,为了上传图书保存图片文件信息建立
private FormFile bookImage;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
public int getBookType() {
return bookType;
}
public void setBookType(int bookType) {
this.bookType = bookType;
}
public String getBookImageName() {
return bookImageName;
}
public void setBookImageName(String bookImageName) {
this.bookImageName = bookImageName;
}
public FormFile getBookImage() {
return bookImage;
}
public void setBookImage(FormFile bookImage) {
this.bookImage = bookImage;
}
}
(3)数据库连接DAO利用 《优化的 JAVA 通用数据库dao》
(4)数据库操作Model
package cn.net.royakon.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.jstl.sql.Result;
import cn.net.royakon.dao.GenericDao;
import cn.net.royakon.entity.Book;
import cn.net.royakon.entity.BookType;
public class BookModel extends GenericDao{
/**
* 添加图书到数据库
* @param book
* @return
*/
public int addBook(Book book) {
//设定添加语句的SQL
String sqlValue = "insert into books.book values( null, ? , ? , ? , ? )";
super.setSqlValue(sqlValue);
//设定商品信息的参数
List values = new ArrayList();
values.add(book.getBookName());
values.add(book.getBookPrice());
values.add(book.getBookType());
values.add(book.getBookImageName());
super.setValues(values);
//添加商品
int result = 0;
try {
result = super.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
//返回受影响的行数,0为添加失败
return result;
}
/**
* 得到图书类型的集合
* @return
*/
public List getBookType() {
List bookTypeList = new ArrayList();
String sql = "select * from books.type";
super.setSqlValue(sql);
try {
Result rs = super.executeQuery();
for(int i=0;i<rs.getRowCount();i++) {
Map record = rs.getRows()[i];
BookType bookType = new BookType();
bookType.setTypeId((Integer)record.get("typeId"));
bookType.setTypeName((String)record.get("typeName"));
bookTypeList.add(bookType);
}
} catch (Exception e) {
e.printStackTrace();
}
return bookTypeList;
}
}
(5)编写添加图书的VIEW层代码 addbook.jsp
<%@ page language="java" pageEncoding="GB18030"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %> <!-- 载入页面时判断 REQUEST 作用域是否存在 图书类别的集合 如果不存在就调用 取得图书类型 的 ACTION --> <logic:notPresent scope="request" name="bookTypeList"> <jsp:forward page="/getBookType.do"></jsp:forward> </logic:notPresent> <h2 align="center">添加图书</h2> <!-- 如果表单需要上传 非文本信息需要: enctype="multipart/form-data" --> <html:form action="addBook.do" method="post" enctype="multipart/form-data"> <table border="0" align="center"> <tr> <th colspan="2">添加图书</th> </tr> <tr> <td>图书名称</td> <!-- 绑定 ActionForm 属性 --> <td><html:text property="book.bookName"></html:text></td> </tr> <tr> <td>图书单价</td> <!-- 绑定 ActionForm 属性 --> <td><html:text property="book.bookPrice"></html:text></td> </tr> <tr> <td>图书类型</td> <td> <!-- 绑定 ActionForm 属性 --> <html:select property="book.bookType" size="1"> <!-- optionsCollection 标签 列表 select 项 name=列表集合 value=Struts 将自动回溯 列表内 对象 的属性 图书类型ID 作为列表值 label=Struts 将自动回溯 列表内 对象 的属性 图书类型名称 作为列表显示标签 --> <html:optionsCollection value="typeId" label="typeName" name="bookTypeList" /> </html:select> </td> </tr> <tr> <td>图书封面</td> <!-- 绑定 ActionForm 属性 --> <td><html:file property="book.bookImage" /></td> </tr> <tr> <td><html:submit>确定</html:submit></td> <td><html:reset>重置</html:reset></td> </tr> </table> </html:form>
(6)取得图书类别集合的 ACTION
/**
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.net.royakon.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import cn.net.royakon.model.BookModel;
public class GetBookTypeAction extends Action {
/**
* 取得图书类别集合并存入 REQUEST 作用域的 ACTION
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
BookModel bookModel = new BookModel();
List bookTypeList = bookModel.getBookType();
//取得图书类型集合 并保存至 REQUEST 作用域
request.setAttribute("bookTypeList", bookTypeList);
//跳转回调用的页面
return mapping.findForward("result");
}
}
(7)提交添加图书页面的ActionForm
/**
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.net.royakon.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import cn.net.royakon.entity.Book;
/**
* MyEclipse Struts
* Creation date: 01-06-2009
*
* XDoclet definition:
* @struts.form name="bookForm"
*/
public class BookForm extends ActionForm {
/**
* Generated fields
*/
/** 对象作为 ActionForm 的属性 需要实例化*/
private Book book = new Book();
/**
* Generated Methods
*/
/**
* Method validate
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
}
/**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
/**
* Returns the book.
* @return Book
*/
public Book getBook() {
return book;
}
/**
* Set the book.
* @param book The book to set
*/
public void setBook(Book book) {
this.book = book;
}
}
(8)添加图书信息的Action
/**
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.net.royakon.action;
import java.io.File;
import java.io.FileOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import cn.net.royakon.entity.Book;
import cn.net.royakon.form.BookForm;
import cn.net.royakon.model.BookModel;
public class AddBookAction extends Action {
/**
* 添加图书数据到数据库
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
BookForm bookForm = (BookForm) form;
// TODO Auto-generated method stub
int result = 0;
Book book = new Book();
book = bookForm.getBook();
try {
//为图书名称重新设置编码
book.setBookName(new String(book.getBookName().getBytes("iso8859-1"),"gb2312"));
//保存图书封面
FormFile photo= book.getBookImage();
//得到文件名
book.setBookImageName(photo.getFileName());
String path=this.servlet.getServletConfig().getServletContext().getRealPath("/photos");
//生成文件输出流
FileOutputStream file_out=new FileOutputStream(path + File.separator + book.getBookImageName());
file_out.write(photo.getFileData());
file_out.close();
//销毁内存中的文件
photo.destroy();
//调用 Model 添加图书信息
BookModel bookModel = new BookModel();
result = bookModel.addBook(book);
} catch (Exception e) {
e.printStackTrace();
}
if (result==0) {
return mapping.findForward("fail");
}
request.setAttribute("book", book);
return mapping.findForward("ok");
}
}
(9)添加成功后的跳转页面 result.jsp
<%@ page language="java" pageEncoding="GB18030"%>
<h2 align="center">添加图书成功!</h2>
<table border="0" align="center">
<tr>
<th colspan="2">添加图书成功</th>
</tr>
<tr>
<td>图书名称</td>
<td>${book.bookName}"</td>
</tr>
<tr>
<td>图书单价</td>
<td>${book.bookPrice}</td>
</tr>
<tr>
<td>图书类型</td>
<td>${book.bookType}</td>
</tr>
<tr>
<td>图书封面</td>
<td><img src="photos/${book.bookImageName}" /></td>
</tr>
</table>
Categories: 网页编程