用Struts2框架实现图书管理系统
本篇文章主要介绍使用Struts2框架实现图书管理系统的过程,不足之处还请多多提出。
1、首先最基础的是搭建Struts2框架,在框架的基础上完成图书管理系统。
框架的搭建过程这里不做详细讲解,如需参考请看https://blog.csdn.net/weixin_42322648/article/details/83547417
下图是我的框架结构:
我上图是排列方式纵向排列的,如果和你们有点不同这个没关系。
2、下面我们来分析功能和功能的实现。
首先数据库的建库建表,这里不做详解。
然后就是我们功能的实现,
(1)、登录功能
首先做登录的jsp页面, login.jsp这个页面在user文件夹下,下面附属有完整代码。
然后做登录的action LoginAction.class,这action主要是获取从页面发送过来的数据,对参数进行判断,然后确定是否登录成功。
最后就是配置struts.xml文件,
<package name="user" extends="struts-default" namespace="/user">
<action name="login" class="com.hnpi.action.LoginAction"
method="login">
<result name="success">
<param name="actionName">bookList</param>
<param name="namespace">/book</param>
<param name="method">bookList</param>
</result>
<result name="fail" type="redirect">/user/login.jsp</result>
</action>
</package>
这个只是登录的,会有的地方和下面相连,下面有完整的struts.xml的代码。
(2)、查询图书列表功能
这里就要考虑连接数据库了,要用到工具类,这里命名为DButil.java,然后我们还要用到dao层和service层,这里涉及到接口和接口方法的实现,而主要接口方法的实现在BookDaoImpl.java里面,然后在BookServiceImpl.java里面调用dao层的接口和方法的实现,这样可以做到我们实现一个框架,多写点功能,在BookServiceImpl.java里面调用不同的功能就能实现不能的功能,非常方便。
查询图书列表功能的方法也很简单,首先做图书列表的jsp页面 booklist.jsp,这个页面你在book文件夹下。
然后我们要做查询图书列表的action,这里命名为BookAction.java,这个action里面可以实现多种功能,只要是在dao层和Service层写好接口和方法,这里就可以实现,比如图书的更新,删除,新增图书。
所以以下功能就不再一一介绍,代码如下:
login.jsp 在user文件夹下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登录页面</title>
</head>
<body>
<form action="<%=basePath%>user/login" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="text" name="pwd" /></td>
</tr>
</table>
<input type="submit" value="提交" />
</form>
</body>
</html>
bookList.jsp 图书列表页面 在book文件夹下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>图书列表页面</title>
<style type="text/css">
table,table tr th, table tr td {
border: 1px solid grey;
}
</style>
</head>
<body>
<a href="<%=basePath %>book/toAddBook">新增图书</a>
<table cellspacing="0">
<thead>
<tr>
<th>编号</th>
<th>书名</th>
<th>作者</th>
<th>ISBN</th>
<th>出版社</th>
<th>操作</th>
</tr>
</thead>
<s:iterator value="#request.books" status="book">
<tr>
<td><s:property value="id"/></td>
<td><s:property value="bookName"/></td>
<td><s:property value="bookAuthor"/></td>
<td><s:property value="bookIsbn"/></td>
<td><s:property value="bookPublish"/></td>
<td><a href='<%=basePath %>book/selectBookById?book.id=<s:property value="id"/>'>更新</a> <a href='<%=basePath %>book/delBook?book.id=<s:property value="id"/>'>删除</a></td>
</tr>
</s:iterator>
</table>
</body>
</html>
addBook.jsp 新增图书页面,在book文件夹下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>图书增加列表</title>
</head>
<body>
<form action="book/addBook" method="post">
<table>
<tr>
<td>书名:</td>
<td><input type="text" name="book.bookName" /></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" name="book.bookAuthor" /></td>
</tr>
<tr>
<td>ISBN:</td>
<td><input type="text" name="book.bookIsbn" /></td>
</tr>
<tr>
<td>出版社:</td>
<td><input type="text" name="book.bookPublish" /></td>
</tr>
</table>
<input type="submit" value="提交" />
</form>
</body>
</html>
updateBook.jsp 图书更新页面 在book文件夹下:
<%@page import="com.hnpi.bean.Book"%>
<%@page import="com.hnpi.service.impl.BookServiceImpl"%>
<%@page import="com.hnpi.service.BookService"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>更新图书页面</title>
</head>
<body>
<form action="book/UpdateBook" method="post">
<table>
<s:iterator value="#request.booksByID" status="booksByID">
<tr>
<td>Id:</td>
<td><input type="text" value="<s:property value="id"/>" name="book.id" /></td>
</tr>
<tr>
<td>书名:</td>
<td><input type="text" value="<s:property value="bookName"/>" name="book.bookName" /></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" value="<s:property value="bookAuthor"/>" name="book.bookAuthor" /></td>
</tr>
<tr>
<td>ISBN:</td>
<td><input type="text" value="<s:property value="bookIsbn"/>" name="book.bookIsbn" /></td>
</tr>
<tr>
<td>出版社:</td>
<td><input type="text" value="<s:property value="bookPublish"/>" name="book.bookPublish" /></td>
</tr>
</s:iterator>
</table>
<input type="submit" value="提交" />
</form>
</body>
</html>
上面全部都是视图层也就是MVC的v层,下面就是c层和m层,还有工具类。
DBUtil.java 连接数据库的工具类:
package com.hnpi.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
/**
* 连接数据库
* @return
*/
public static Connection getConn(){
String url = "jdbc:sqlserver://localhost:1433;databaseName=Book";
String user = "sa";
String pwd = "1";
Connection conn = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(url, user, pwd);
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库
* @param conn
* @param ps
* @param rs
*/
public static void closeConn(Connection conn,PreparedStatement ps,ResultSet rs){
try{
if(conn!=null){
conn.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
LoginAction.java 用户登录的action:
package com.hnpi.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String login(){
if(name!=null && !"".equals(name)&&pwd!=null && !"".equals(pwd)){
if(name.equals("小四")&&pwd.equals("528")){
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("user", name);
return "success";
}else{
return "fail";
}
}else{
return "fail";
}
}
}
BookAction.java 实现功能的action:
package com.hnpi.action;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.hnpi.bean.Book;
import com.hnpi.service.BookService;
import com.hnpi.service.impl.BookServiceImpl;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport {
private Book book;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
/**
* 中英文切换
*/
public String change(){
return "success";
}
/**
* 图书列表
* @return
*/
public String bookList(){
//将获取的数据传递至bookList.jsp页面
BookService bookService = new BookServiceImpl();
List<Book> books = bookService.selectAllBook();
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("books", books);
return "success";
}
/**
* 准备新增图书
* @return
*/
public String toAddBook() {
return "success";
}
/**
* 新增图书
* @return
*/
public String addBook() {
BookService bookService = new BookServiceImpl();
bookService.addBook(book);
return "success";
}
/**
* 删除图书
* @return
*/
public String delBook(){
BookService bookService = new BookServiceImpl();
bookService.delBook(book.getId());
return "success";
}
/**
* 根据id查询图书 直接跳转到准备更新图书页面
* @return
*/
public String selectBookById(){
BookService bookService = new BookServiceImpl();
Book booksByID = bookService.selectBookById(book.getId());
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("booksByID", booksByID);
return "success";
}
/**
* 更新图书
* @return
*/
public String UpdateBook() {
BookService bookService = new BookServiceImpl();
bookService.updateBook(book);
return "success";
}
}
Book.java 这个是javabean:
package com.hnpi.bean;
public class Book {
private int id;
private String bookName;
private String bookAuthor;
private String bookIsbn;
private String bookPublish;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public String getBookIsbn() {
return bookIsbn;
}
public void setBookIsbn(String bookIsbn) {
this.bookIsbn = bookIsbn;
}
public String getBookPublish() {
return bookPublish;
}
public void setBookPublish(String bookPublish) {
this.bookPublish = bookPublish;
}
@Override
public String toString() {
return "Book [id=" + id + ", bookName=" + bookName + ", bookAuthor="
+ bookAuthor + ", bookIsbn=" + bookIsbn + ", bookPublish="
+ bookPublish + "]";
}
public Book(int id, String bookName, String bookAuthor, String bookIsbn,
String bookPublish) {
super();
this.id = id;
this.bookName = bookName;
this.bookAuthor = bookAuthor;
this.bookIsbn = bookIsbn;
this.bookPublish = bookPublish;
}
public Book() {
super();
}
}
下面就是Service层和dao层接口的方法,和实现的过程:
BookDao.java 定义接口的方法也就是需要实现的功能:
package com.hnpi.dao;
import java.util.List;
import com.hnpi.bean.Book;
public interface BookDao {
/**
* 查询所有图书
* @return
*/
public List<Book> selectAllBook();
/**
* 新增图书
* @return
*/
public boolean addBook(Book book);
/**
* 删除图书
* @return
*/
public boolean delBook(int bookId);
/**
* 根据图书编号查询图书
* @param BookId
* @return
*/
public Book selectBookById(int bookId);
/**
* 更新图书
* @return
*/
public boolean updateBook(Book book);
}
BookDaoImpl.java 对上一层接口的方法的实现:
package com.hnpi.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.hnpi.bean.Book;
import com.hnpi.dao.BookDao;
import com.hnpi.util.DBUtil;
public class BookDaoImpl implements BookDao{
/**
* 实现图书列表的方法
*/
public List<Book> selectAllBook() {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from book";
List<Book> books = new ArrayList<Book>();
try {
ps = conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
Book book = new Book();
book.setId(rs.getInt(1));
book.setBookName(rs.getString(2));
book.setBookAuthor(rs.getString(3));
book.setBookIsbn(rs.getString(4));
book.setBookPublish(rs.getString(5));
books.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.closeConn(conn, ps, null);
}
return books;
}
/**
* 新增图书
*/
public boolean addBook(Book book) {
Connection conn = DBUtil.getConn();
PreparedStatement ps=null;
int result = 0;
String sql = "insert into book (book_name,book_author,book_isbn,book_publish) values (?,?,?,?)";
try {
ps = conn.prepareStatement(sql);
ps.setString(1, book.getBookName());
ps.setString(2, book.getBookAuthor());
ps.setString(3, book.getBookIsbn());
ps.setString(4, book.getBookPublish());
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.closeConn(conn, ps, null);
}
if(result > 0){
return true;
}else{
return false;
}
}
/**
* 删除图书
*/
public boolean delBook(int bookId) {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs=null;
int result = 0;
String sql = "delete from book where id = ?";
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, bookId);
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.closeConn(conn, ps, null);
}
if(result > 0){
return true;
}else{
return false;
}
}
/**
* 根据ID查询图书
*/
public Book selectBookById(int bookId) {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from book where id = ?";
Book book = new Book();
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, bookId);
rs = ps.executeQuery();
if(rs.next()){
book.setId(rs.getInt(1));
book.setBookName(rs.getString(2));
book.setBookAuthor(rs.getString(3));
book.setBookIsbn(rs.getString(4));
book.setBookPublish(rs.getString(5));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeConn(conn, ps, null);
}
return book;
}
/**
* 更新图书
*/
public boolean updateBook(Book book) {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs=null;
int result = 0;
String sql = "update book set book_name = ?,book_author = ?,book_isbn = ?,book_publish = ? where id =?";
try {
ps = conn.prepareStatement(sql);
ps.setString(1, book.getBookName());
ps.setString(2, book.getBookAuthor());
ps.setString(3, book.getBookIsbn());
ps.setString(4, book.getBookPublish());
ps.setInt(5, book.getId());
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closeConn(conn, ps, null);
}
if (result > 0){
return true;
}
else{
return false;
}
}
}
BookService.java 这个和上面的BookDao.java一样都是定义接口的方法也就是需要实现的功能:
package com.hnpi.service;
import java.util.List;
import com.hnpi.bean.Book;
public interface BookService {
/**
* 查询所有图书
* @return
*/
public List<Book> selectAllBook();
/**
* 新增图书
* @return
*/
public boolean addBook(Book book);
/**
* 删除图书
* @return
*/
public boolean delBook(int bookId);
/**
* 根据图书编号查询图书
* @param BookId
* @return
*/
public Book selectBookById(int bookId);
/**
* 更新图书
* @return
*/
public boolean updateBook(Book book);
}
BookServiceImpl.java 这里面就是调用dao层方法的实现来实现功能了:
package com.hnpi.service.impl;
import java.util.List;
import com.hnpi.bean.Book;
import com.hnpi.dao.BookDao;
import com.hnpi.dao.impl.BookDaoImpl;
import com.hnpi.service.BookService;
public class BookServiceImpl implements BookService {
/**
* 调用Dao层实现查询
*/
public List<Book> selectAllBook() {
BookDao bookDao = new BookDaoImpl();
List<Book> books = bookDao.selectAllBook();
return books;
}
/**
* 调用Dao层实现新增
*/
public boolean addBook(Book book) {
BookDao bookDao = new BookDaoImpl();
return bookDao.addBook(book);
}
/**
* 调用Dao层实现删除
*/
public boolean delBook(int bookId) {
BookDao bookDao = new BookDaoImpl();
return bookDao.delBook(bookId);
}
/**
* 调用Dao层实现根据Id查询图书
*/
public Book selectBookById(int bookId) {
BookDao bookDao = new BookDaoImpl();
Book book = bookDao.selectBookById(bookId);
return book;
}
/**
* 调用Dao层实现更新
*/
public boolean updateBook(Book book) {
BookDao bookDao = new BookDaoImpl();
return bookDao.updateBook(book);
}
}
还有一个拦截器。就是你在未登录的情况下访问别的网页是没有权限的,会自动跳转到登录页面:
UserInterceptor.java 这个在com.hnpi.interceptor包下:
package com.hnpi.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class UserInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String user=(String) ActionContext.getContext().getSession().get("user");
if (user==null||"".equals(user)) {
return "fail";
}
return invocation.invoke();
}
}
下面就是最最重要的struts.xml配置文件的内容了,这里面稍微有一点错误,功能都实现不了。
<?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="user" extends="struts-default" namespace="/user">
<action name="login" class="com.hnpi.action.LoginAction"
method="login">
<result name="success" type="chain">
<param name="actionName">bookList</param>
<param name="namespace">/book</param>
<param name="method">bookList</param>
</result>
<result name="fail" type="redirect">/user/login.jsp</result>
</action>
</package>
<package name="book" extends="struts-default" namespace="/book">
<interceptors>
<interceptor name="userInterceptor" class="com.hnpi.interceptor.UserInterceptor"></interceptor>
<interceptor-stack name="selfStack">
<interceptor-ref name="userInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="selfStack"></default-interceptor-ref>
<global-results>
<result name="fail">/user/login.jsp</result>
</global-results>
<action name="bookList" class="com.hnpi.action.BookAction"
method="bookList">
<result name="success">/book/bookList.jsp</result>
</action>
<action name="toAddBook" class="com.hnpi.action.BookAction"
method="toAddBook">
<result name="success">/book/addBook.jsp</result>
</action>
<action name="addBook" class="com.hnpi.action.BookAction"
method="addBook">
<result name="success" type="chain">bookList</result>
</action>
<action name="delBook" class="com.hnpi.action.BookAction"
method="delBook">
<result name="success" type="chain">bookList</result>
</action>
<action name="selectBookById" class="com.hnpi.action.BookAction"
method="selectBookById">
<result name="success">/book/updateBook.jsp</result>
</action>
<action name="UpdateBook" class="com.hnpi.action.BookAction"
method="UpdateBook">
<result name="success" type="chain">bookList</result>
</action>
</package>
</struts>
以上就是我的整个Struts2框架实现的图书管理系统了。就是简单的功能的实现,希望大家多多提出意见。谢谢。