Struts2框架实现图书管理系统

用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>密&nbsp;码:</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>&nbsp;<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框架实现的图书管理系统了。就是简单的功能的实现,希望大家多多提出意见。谢谢。

发布了31 篇原创文章 · 获赞 13 · 访问量 7924

猜你喜欢

转载自blog.csdn.net/weixin_42322648/article/details/83821773
今日推荐