struts2搭建一个简单的图书检索系统

本文介绍了一个基于MyEclipse、Tomcat及Oracle的图书检索系统的搭建过程。系统利用Struts2框架实现了前端页面与后端逻辑的分离,通过Ajax实现局部刷新,提升了用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.用到的工具有:MyEclipse、tomcat、Oracle。首先用MyEclipse新建一个名为books_Search的web项目并引入以下jar包


因为我在这个项目中用到了json来传递数据,所以又引用到了操作json数据需要的jar包,如下图所示



2.配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>HelloStruts2</display-name>

  <filter>
    <filter-name>hellostruts</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>hellostruts</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


3.配置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="struts-exception" extends="struts-default">
        <action name="books_*" class="com.books.search.BooksSearchAction"  method="{1}">
			<result name="searchPage">/WEB-INF/jsp/BooksSearch.jsp</result>
	  </action>   
    </package>

</struts>


4.项目中的新建文件如下图



5.新建BookSearch.jsp作为展示页面,用到了jQuery中封装好的ajax来实现局部刷新页面

<%@ page language="java" 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>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	
	<script type="text/javascript" src="${path}/scripts/jquery-1.12.0.js"></script>
	<script type="text/javascript" language="javascript">
	function init(){
		search();
			}
	//按下回车键执行查询功能
	document.onkeyup = function(event) {
		    if(event.keyCode === 13) {
		    	search();
		    };
		};
	//用jQuery中的ajax查询后台符合条件的数据
	function search(){
		var bookName=document.getElementById("bookName").value;
		var author=document.getElementById("author").value;
		var bookId=document.getElementById("bookId").value;
		var seriesBook=document.getElementById("seriesBook").value;
		var publishTime=document.getElementById("publishTime").value;
		$.ajax({
			url:"books_search.action",
			type:"post",
			data:{bookName:bookName,author:author,bookId:bookId,seriesBook:seriesBook,publishTime:publishTime},
			success:function(data1){
				 var data = eval('(' + data1 + ')');
				 var txt="";
				 var intxt="";
				 var innerContent="";
				 for(var i=0,len=data.length;i<len;i++){
				 var x=0;
                for(var key in data[i]){
                var describe=key;
                var content=data[i][key];
                ++x;
                txt+="<td align='center' valign='middle'>"+content+"</td>";
                if(x===5){//每行的数据个数
                intxt="<tr>"+txt+"</tr>";
                innerContent+=intxt;
                txt="";
                x=0;
                }
                }
                if(txt!=""){
                innerContent+="<tr>"+txt+"</tr>";
                txt="";
                }
                }
				document.getElementById("resultTable").innerHTML=innerContent;
				}
		});
	}
	
	</script>
  </head>
<body onload="init();">
<div style="position:absolute;width:100%;height:100%;">
<div style="top:0px;width:100%;height:100px;">
<h1 style="position:absolute;left:35%;" >图书检索系统</h1>
</div >
<div>   
		<table style="margin-left:80px;">
		<tr ><td style="padding-left:120px;">书名:</td><td><input name="bookname" id="bookName" type="text"></td>
		<td style="padding-left:120px;">作者:</td><td ><input name="author" id="author" type="text" /></td> 
		</tr>
		<tr><td style="padding-left:120px;">ISBN:</td><td ><input name="bookId" id="bookId" type="text" /></td> 
		<td style="padding-left:120px;">丛书:</td><td ><input name="seriesBook" id="seriesBook" type="text" /></td>
		</tr>
		<tr><td style="padding-left:120px;">出版时间:</td><td><select style="width:173px;" id="publishTime"  name="book.publishTime">
									 <option value="">-全部-    </option>
									 <option value="1">三个月内 </option>
									 <option value="2">一年内 </option>
									 <option value="3">三年内</option>
									 </select></td></tr>
		</table>
		<br>
		<br>
		<input style="margin-left:750px;" type="button" id="search" onclick="search();" value="检   索" />
		</div>
		<div>
		<br>
		<br>
		 <table  style="margin-left:170px;" table border="1" cellspacing="0">
		 <tr><th width="100px;">ISBN</th><th width="200px;">书名</th><th width="100px;">作者</th><th width="150px;">丛书</th><th width="150px;">出版时间</th></tr>
		  <tbody id="resultTable">
		  </tbody>
		  </table>
		</div>
		</div>
	</body>
</html>


6.新建BookSearchAction.java、BaseAction.java文件来处理前台请求

package com.books.search;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.books.common.BaseAction;
import com.books.vo.Book;

public class BooksSearchAction extends BaseAction{
	private Book book =new Book();
	private BookSearchFacade bookSearchFacade=new BookSearchFacade();
	public String booksSearch(){
		return "searchPage";
	}
	/*
	 * 查询
	 */
   public void search(){
	   try {
		   JSONArray  json =null;
		   String bookName=request.getParameter("bookName");
		   String author=request.getParameter("author");
		   String bookId=request.getParameter("bookId");
		   String seriesBook=request.getParameter("seriesBook");
		   String publish=request.getParameter("publishTime");
		   String publishTime=getPublishTime(publish);
		   book.setBookName(bookName);
		   book.setAuthor(author);
		   book.setBookId(bookId);
		   book.setSeriesBook(seriesBook);
		   book.setPublishTime(publishTime);
		   List<Map<String, Object>> result= bookSearchFacade.search(book);
           json = JSONArray.fromObject(result); 
           String str =json.toString();
           this.ajaxResponse(str);
	} catch (Exception e) {
		System.out.println(e.toString());
	}
   }
   /*
    * 处理出版时间
    */
   public String getPublishTime(String time){
	   String pbltime=null;
	   if(time.equals("1")){//三个月内
		   pbltime= getBeforeDate(3);
	   }else if(time.equals("2")){//一年内
		   pbltime= getBeforeDate(12);
	   }else if(time.equals("3")){//三年内
		   pbltime= getBeforeDate(36);
	   }
	   return pbltime;
   }
   /*
    * 获得*个月前的日期
    */
   public String getBeforeDate(int month){
	   Date now=new Date();
       Date dBefore = new Date();  
       Calendar calendar = Calendar.getInstance(); //得到日历  
       calendar.setTime(now);//把当前时间赋给日历  
       calendar.add(Calendar.MONTH, -month);  //设置为前*月  
       dBefore = calendar.getTime();   //得到前*月的时间  
       SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式  
       String defaultStartDate = sdf.format(dBefore);    //格式化前*个月前的日期 
       return defaultStartDate;
   }

}

BaseAction.java类,所有实现action的类继承该类就OK了:

package com.books.common;

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport implements ServletResponseAware, ServletRequestAware {
	  protected HttpServletResponse response;
	  protected HttpServletRequest request;
	public void setServletResponse(HttpServletResponse response) {
		 this.response = response;
		
	}
	public void setServletRequest(HttpServletRequest request) {
		 this.request = request;
		
	}
	 protected String getParameter(String name) {
	        if (name == null)
	            return "";
	        return ServletActionContext.getRequest().getParameter(name);
	    }
	 // AJAX输出
	    public void ajaxResponse(String content) {
	        try {
	            response.setCharacterEncoding("UTF-8");
	            response.setContentType("text/plain;charset=UTF-8");
	            response.setHeader("Pragma", "No-cache");
	            response.setHeader("Cache-Control", "no-cache");
	            response.setDateHeader("Expires", 0);
	            response.getWriter().write(content);
	            response.getWriter().flush();
	            response.getWriter().close();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
}


7.新建BookSearchFacade.java文件,目的是当项目中引入spring来进行事物管理

package com.books.search;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.books.vo.Book;

public class BookSearchFacade {
	private BookSearchServer bookSearchServer =new BookSearchServer();
	public List<Map<String, Object>> search(Book book) throws SQLException, ClassNotFoundException{
		return bookSearchServer.search(book);
	}
}


8.新建BookSearchServer.java文件来实现数据库操作:

package com.books.search;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.books.database.dao.CommonDao;
import com.books.vo.Book;


public class BookSearchServer {
	private	CommonDao dao=new CommonDao();
	
	/*
	 * 图书检索
	 */
	public List<Map<String, Object>> search(Book book) throws SQLException, ClassNotFoundException{
		
	    String sql ="select *from books where 1=1";
	    if(book.getBookId()!=null&&book.getBookId().length()>0){
	    	sql+=" and bookid = '"+book.getBookId()+"'";
	    }if(book.getBookName()!=null&&book.getBookName().length()>0){
		    	sql+=" and bookname like '%"+book.getBookName()+"%'";
	    }if(book.getAuthor()!=null&&book.getAuthor().length()>0){
	    	sql+=" and author like '%"+book.getAuthor()+"%'";
	    }if(book.getSeriesBook()!=null&&book.getSeriesBook().length()>0){
	    	sql+=" and seriesbook like '%"+book.getSeriesBook()+"%'";
	    }if(book.getPublishTime()!=null&&book.getPublishTime().length()>0){
	    	sql+=" and publishtime > to_date('"+book.getPublishTime()+"',"+"'yyyy-mm-dd')";
	    }
	    sql+=" order by publishtime ";
		List<Map<String, Object>> result =dao.excuteSQL(sql);
		return result;
	}

}


9.新建Book.java实体类

package com.books.vo;
/*
 * 实体类Book
 */
public class Book {
 private String bookName;        //书名
 private String author;          //作者
 private String bookId;          //ISBN
 private String seriesBook;      //丛书
 private String publishTime;     //出版时间
public String getBookName() {
	return bookName;
}
public void setBookName(String bookName) {
	this.bookName = bookName;
}
public String getAuthor() {
	return author;
}
public void setAuthor(String author) {
	this.author = author;
}
public String getBookId() {
	return bookId;
}
public void setBookId(String bookId) {
	this.bookId = bookId;
}
public String getSeriesBook() {
	return seriesBook;
}
public void setSeriesBook(String seriesBook) {
	this.seriesBook = seriesBook;
}
public String getPublishTime() {
	return publishTime;
}
public void setPublishTime(String publishTime) {
	this.publishTime = publishTime;
}
}


10.新建操作数据库的dao层,CommonDao.java文件(这个项目用到的是原生jdbc操作Oracle数据库)

package com.books.database.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CommonDao {
	/*
	 * 连接数据库
	 * 注意:这个需要自己配置!!!
	 */
	public Connection connection() throws ClassNotFoundException, SQLException {  
        Class.forName("oracle.jdbc.driver.OracleDriver"); // 加载Oracle驱动程序  
        String url = "jdbc:oracle:thin:@10.157.244.72:1521:hrdbtest"; // 连接使用的url  
        String user = "******"; // 数据库用户名  
        String password = "******"; // 密码  
        Connection  con = DriverManager.getConnection(url, user, password);// 获取连接  
        return con;  
    } 
	/*
	 * 原生jdbc执行查询
	 */
	public List<Map<String, Object>> excuteSQL(String sql) throws SQLException, ClassNotFoundException {  
        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
        Connection con =connection();
        Statement  sta = con.createStatement();  
        ResultSet   rs = sta.executeQuery(sql); 
        ResultSetMetaData md = rs.getMetaData(); //获得结果集结构信息,元数据  
        int columnCount = md.getColumnCount();   //获得列数   
        while(rs.next()){
            Map<String,Object> rowData=new HashMap<String,Object>();
            for(int i=1;i<=columnCount;i++){
                //String key=md.getColumnName(i);//获得表头
            	String orderKey =String.valueOf(i);//为了使hashmap中的数据存储顺序和数据库一致
            	Object value=null;
                if(rs.getObject(i)!=null){
                	value=rs.getObject(i).toString();//为了解决从数据库中取出的Date格式的数据不能转化为json格式的问题
                }
                rowData.put(orderKey, value);
            }
            list.add(rowData);
        }
        con.close();
        return list;  
    }  

}


11.在Oracle中建如下图所示的名为books的数据表,并自定义一些数据:




12.配置tomcat下的server.xml文件以启动该项目(参考下图)



13.运行该项目,在浏览器输入http://localhost:8383/books_booksSearch.action

效果:













评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值