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
效果: