今天給大家分享個Javaweb源碼,基於ssh網上圖書管理的項目。
首先是項目所需要的spring、Struts、hibernatejar包,該資源包上傳在我的上傳資源中,積分也不多,可以下載下。
下載地址是:https://mp.csdn.net/console/upDetailed
導包這個就不用多說了吧,相信大家都非常熟練啦
在一個就是數據庫配置文件,我的是jdbc.properties文件。配置如下:
########################################
######## database configuration #######
#######################################
##driver
jdbc.driver=com.mysql.jdbc.Driver
##url
jdbc.url=jdbc:mysql://localhost:3306/book
##username
jdbc.username=root
##password
jdbc.password=1234
########################################
######## c3p0 configuration #######
#######################################
## initialPoolSize Default: 3
c3p0.initialPoolSize=3
##minPoolSize Default: 3
c3p0.minPoolSize=2
##maxPoolSize Default: 15
c3p0.maxPoolSize=10
##maxIdleTime(s), (<mysql 28800) Default: 0
c3p0.maxIdleTime=28000
##idleConnectionTestPeriod(s), (<mysql 28800) Default: 0
c3p0.idleConnectionTestPeriod=3600
########################################
######## hibernate configuration #######
#######################################
##hibernate dialect
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#hibernate.dialect=org.hibernate.dialect.SQLServerDialect
#hibernate.dialect=org.hibernate.dialect.OracleDialect
##show sql
hibernate.show_sql=true
##format sql
hibernate.format_sql=false
##connection use unicode
hibernate.connection.useUnicode=true
##connection encoding
hibernate.connection.characterEncoding=utf8
以上代碼可以直接添加到你的數據庫配置文件中。
同時log4j文件必不可少哦 log4j.properties
##FATAL, ERROR, WARN, INFO, DEBUG, TRACE
#log4j.rootLogger=WARN, stdout, file
log4j.rootLogger=ERROR, stdout
########################
#### ConsoleAppender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%date [%p] %l - %msg%n
########################
#### DailyRollingFileAppender
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.File=/logs/log4j.log
#log4j.appender.file.Append=false
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%date [%t] (%p) %l - %msg%n
########################
#### SMTPAppender
#log4j.appender.mail=org.apache.log4j.net.SMTPAppender
#log4j.appender.mail.Threshold=ERROR
#log4j.appender.mail.BufferSize=5
#log4j.appender.mail.SMTPHost=smtp.qq.com
#log4j.appender.mail.Subject=subject
#log4j.appender.MAIL.SMTPUsername=username
#log4j.appender.MAIL.SMTPPassword=passowrd
#log4j.appender.mail.To=to
#log4j.appender.mail.From=from
#log4j.appender.mail.layout=org.apache.log4j.PatternLayout
#log4j.appender.mail.layout.ConversionPattern=%date [%t] (%p) %l - %msg%n
#########################
#### package or class lever
#log4j.logger.org.springframework=INFO
#log4j.logger.org.springframework.web=WARN
#log4j.logger.org.springframework.core=WARN
#log4j.logger.org.springframework.beans=WARN
#log4j.logger.org.springframework.context=WARN
用法同上,複製粘貼簡單快捷。
幾個工具類也給大家奉上分頁工具類PageUtil
package com.itbaizhan.util;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
/**
* 分頁工具類
*/
public class PageUtil {
/**
* 獲取分頁工具
* @param total 總記錄數
* @param page 當前頁面
* @param size 每頁數量
* @return
*/
public static String getPageTool(HttpServletRequest request, long total, int page, int size){
if (total <= 0) {
return null;
}
// 計算總頁數
int pages = (int) (total % size ==0 ? total/size : total /size + 1);
pages = pages == 0 ? 1 : pages;
// 請求地址
String url = request.getRequestURL().toString();
// 請求參數
StringBuilder paramBuilder = new StringBuilder();
Enumeration<String> params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = params.nextElement();
if(param.indexOf("page") > -1) {
continue;
}
paramBuilder.append("&").append(param).append("=").append(request.getParameter(param));
}
// 分頁字符串
StringBuilder pageBuilder = new StringBuilder();
pageBuilder.append("<div class='pagination'>");
// 上一頁
if (page <= 1) { // 如果已經是第一頁, 上一頁按鈕disabled
pageBuilder.append("<span class='disabled'><<</span>");
}else{
pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page-1)
.append(paramBuilder).append("'>").append("<<").append("</a>").append("</span>");
}
// 中間數字頁碼
if (pages <= 7) { // 全部顯示
for (int i = 1; i <= pages; i++) {
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, i));
}
}else{ // 顯示部分
if (page<4 || page>pages-3) { // 1 2 3 ... pages-2 pages-1 pages
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 1));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 2));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 3));
pageBuilder.append(" ... ");
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages-2));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages-1));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages));
}else{ // 1 2 ... page-1 page page+1 ... pages-1 pages
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 1));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 2));
pageBuilder.append(" ... ");
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, page-1));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, page));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, page+1));
pageBuilder.append(" ... ");
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages-1));
pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages));
}
}
// 下一頁
if (page >= pages) { // 如果已經是最後一頁, 上一頁按鈕disabled
pageBuilder.append("<span class='disabled'>>></span>");
}else{
pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page+1)
.append(paramBuilder).append("'>").append(">>").append("</a>").append("</span>");
}
pageBuilder.append("</div>");
return pageBuilder.toString();
}
/**
* 封裝分頁項
* @param url
* @param params
* @param page
* @param i
* @return
*/
private static String packPageItem(String url, String params, int page, int i) {
StringBuilder pageBuilder = new StringBuilder();
if (i == page) {
pageBuilder.append("<span class='current'>").append(i).append("</span>");
}else{
pageBuilder.append("<a href='").append(url).append("?").append("page=").append(i)
.append(params).append("'>");pageBuilder.append(i).append("</a>");
}
return pageBuilder.toString();
}
/**
* 後臺管理分頁
* @param request
* @param total
* @param page
* @param size
* @return
*/
public static String getPageToolAdmin(HttpServletRequest request, long total, int page, int size) {
if (total <= 0) {
return null;
}
// 計算總頁數
int pages = (int) (total % size ==0 ? total/size : total /size + 1);
pages = pages == 0 ? 1 : pages;
// 請求地址
String url = request.getRequestURL().toString();
// 請求參數
StringBuilder paramBuilder = new StringBuilder();
Enumeration<String> params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = params.nextElement();
if(param.indexOf("page") > -1) {
continue;
}
paramBuilder.append("&").append(param).append("=").append(request.getParameter(param));
}
// 分頁字符串
StringBuilder pageBuilder = new StringBuilder();
pageBuilder.append("<div style='width:140px;float:right;'>");
// 上一頁
if (page <= 1) { // 如果已經是第一頁, 上一頁按鈕disabled
pageBuilder.append("<span style='color:lightgray'>上一頁</span>");
}else{
pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page-1)
.append(paramBuilder).append("'>").append("上一頁").append("</a>").append("</span>");
}
// 中間數字頁碼
pageBuilder.append("[").append(page).append("/").append(pages).append("]");
// 下一頁
if (page >= pages) { // 如果已經是最後一頁, 上一頁按鈕disabled
pageBuilder.append("<span style='color:lightgray'>下一頁</span>");
}else{
pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page+1)
.append(paramBuilder).append("'>").append("下一頁").append("</a>").append("</span>");
}
pageBuilder.append("</div>");
return pageBuilder.toString();
}
}
安全工具類SafeUtil
package com.itbaizhan.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.springframework.util.Base64Utils;
/**
* 安全工具類
*/
public class SafeUtil {
/**
* md5加密字符串
* @param str
* @return
*/
public final static String md5(String str){
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
messageDigest.update(str.getBytes());
return Base64Utils.encodeToString(messageDigest.digest());
}
/**
* sha1加密字符串
* @param str
* @return
*/
public final static String sha1(String str){
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
messageDigest.update(str.getBytes());
return Base64Utils.encodeToString(messageDigest.digest());
}
/**
* 使用特定加密範式加密
* @param str
* @return
*/
public final static String encode(String str){
return md5(sha1(md5(str)));
}
public static void main(String[] args) {
System.out.println(encode("1"));
}
}
上傳工具類UploadUtil
package com.itbaizhan.util;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
/**
* 上傳工具類
*/
public class UploadUtil {
/**
* 圖片上傳
* @return 返回相對路徑
* @param photo 圖片文件
* @param photoFileName 文件名
* @param savePath 文件保存路徑(相對於web根目錄)
* @return
*/
public static String fileUpload(File photo, String photoFileName, String savePath){
if (photo == null) {
return null;
} // 如果上傳圖片不爲空則進行上傳圖片操作
// 文件存儲路徑
String path = ServletActionContext.getServletContext().getRealPath("/")+savePath;
// 獲取當前文件類型
String type = photoFileName.substring(photoFileName.lastIndexOf(".")+1, photoFileName.length());
// 獲取當前系統時間字符串
String time = new SimpleDateFormat("yyMMddssSSS").format(new Date());
// 構建新文件名
String newFileName = time+"."+type;
// 按指定路徑重命名構建文件
File savefile = new File(path,newFileName);
// 若保存文件的文件夾不存在則創建
if(!savefile.getParentFile().exists()){
savefile.getParentFile().mkdirs();
}
System.err.println("上傳文件絕對路徑: "+savefile.getPath());
try {// 將上傳文件的內容複製到新建文件中
FileUtils.copyFile(photo, savefile);
} catch (IOException e) {
e.printStackTrace();
}
return savePath+"/"+newFileName;
}
}
可以將上面三個工具類放在一個package中,我的就是。
下面在看幾個文件配置,首先是spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- spring註解搜尋範圍 -->
<context:component-scan base-package="com"/>
<!-- 引用數據庫配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置數據源 -使用c3p0連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- c3p0連接池參數配置 -->
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" /><!-- 初始化連接數 -->
<property name="minPoolSize" value="${c3p0.minPoolSize}" /><!-- 最小連接數 -->
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" /><!-- 連接池中保留的最大連接數 -->
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" /><!-- 連接的過期時間(秒) -->
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" /><!-- 檢查連接池中的空閒連接間隔時間(秒) -->
</bean>
<!-- 配置hibernate - sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 實體類所在的包 對包中每個類進行註解掃描 省去逐一配置-->
<property name="packagesToScan">
<list><value>com.itbaizhan.entity</value></list>
</property>
<!-- 配置Hibernate屬性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop><!-- 數據庫方言 -->
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop><!-- 是否打印sql語句 -->
<prop key="hibernate.connection.useUnicode">${hibernate.connection.useUnicode}</prop><!-- 連接數據庫時是否使用Unicode編碼 -->
<prop key="hibernate.connection.characterEncoding">${hibernate.connection.characterEncoding}</prop><!-- 連接數據庫時數據的傳輸字符集編碼方式 -->
</props>
</property>
</bean>
<!-- 配置hibernate事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 使用註解-註冊事務管理類或方法 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
struts.xml文件配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 請求參數的編碼方式 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->
<constant name="struts.action.extension" value="action" />
<!-- 當struts.xml改動後,是否重新加載。默認值爲false,開發階段最好打開 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 是否使用struts的開發模式。開發模式會有更多的調試信息 -->
<constant name="struts.devMode" value="false" />
<!-- 設置瀏覽器是否緩存靜態內容。默認值爲true,開發階段最好關閉 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 是否開啓動態方法調用 - 允許使用! 匹配請求 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 指定由spring負責action對象的創建 -->
<constant name="struts.objectFactory" value="spring" />
</struts>
接下來就是實體類entity、action、service、dao層代碼編寫,代碼太多,在這裏就分享下每個層的基類,entity實體類除外
entity文件夾下的admin類:
package com.itbaizhan.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity // 註解爲hibernate實體 對應數據庫中同名表
public class Admin {
@Id // 註解主鍵
@GeneratedValue //id生成策略 默認auto 相當於hibernate的native - 自增字段
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
action文件下的adminAction:
package com.itbaizhan.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.itbaizhan.entity.Admin;
@Repository // 註冊dao層bean等同於@Component
@SuppressWarnings("unchecked")
public class AdminDao extends BaseDao{
/**
* 通過用戶名查找
* @param username
* @return
*/
public Object getByUsername(String username) {
return (Admin)getSession().createQuery("from Admin where username=:username")
.setString("username", username).uniqueResult();
}
/**
* 通過用戶名和密碼查找
* @param username
* @param password
* @return 無記錄返回null
*/
public Admin getByUsernameAndPassword(String username, String password){
return (Admin)getSession().createQuery("from Admin where username=:username and password=:password")
.setString("username", username).setString("password", password).uniqueResult();
}
/**
* 獲取列表
* @param page
* @param rows
* @return 無記錄返回空集合
*/
public List<Admin> getList(int page, int rows){
return getSession().createQuery("from Admin").setFirstResult(rows*(page-1)).setMaxResults(rows).list();
}
/**
* 總數
* @return
*/
public long getTotal() {
return (Long) getSession().createQuery("select count(*) from Admin").uniqueResult();
}
}
service文件下的adminService:
package com.itbaizhan.service;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.itbaizhan.dao.AdminDao;
import com.itbaizhan.entity.Admin;
import com.itbaizhan.util.SafeUtil;
@Service // 註解爲service層spring管理bean
@Transactional // 註解此類所有方法加入spring事務, 具體設置默認
public class AdminService {
@Resource //spring注入類對象
private AdminDao adminDao;
/**
* 驗證用戶密碼
* @param username
* @param password
* @return
*/
public boolean checkUser(String username, String password){
return adminDao.getByUsernameAndPassword(username, SafeUtil.encode(password)) != null;
}
/**
* 是否存在
* @param username
* @return
*/
public boolean isExist(String username) {
return adminDao.getByUsername(username) != null;
}
/**
* 列表
* @param page
* @param rows
* @return
*/
public List<Admin> getList(int page, int rows) {
return adminDao.getList(page, rows);
}
/**
* 總數
* @return
*/
public long getTotal() {
return adminDao.getTotal();
}
/**
* 通過id查詢
* @param id
* @return
*/
public Admin get(int id) {
return adminDao.get(Admin.class, id);
}
/**
* 添加
* @param admin
*/
public Integer add(Admin admin) {
admin.setPassword(SafeUtil.encode(admin.getPassword()));
return adminDao.save(admin);
}
/**
* 更新
* @param user
*/
public boolean update(Admin admin) {
return adminDao.update(admin);
}
/**
* 刪除
* @param user
*/
public boolean delete(Admin admin) {
return adminDao.delete(admin);
}
}
dao文件下的adminDao:
package com.itbaizhan.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.itbaizhan.entity.Admin;
@Repository // 註冊dao層bean等同於@Component
@SuppressWarnings("unchecked")
public class AdminDao extends BaseDao{
/**
* 通過用戶名查找
* @param username
* @return
*/
public Object getByUsername(String username) {
return (Admin)getSession().createQuery("from Admin where username=:username")
.setString("username", username).uniqueResult();
}
/**
* 通過用戶名和密碼查找
* @param username
* @param password
* @return 無記錄返回null
*/
public Admin getByUsernameAndPassword(String username, String password){
return (Admin)getSession().createQuery("from Admin where username=:username and password=:password")
.setString("username", username).setString("password", password).uniqueResult();
}
/**
* 獲取列表
* @param page
* @param rows
* @return 無記錄返回空集合
*/
public List<Admin> getList(int page, int rows){
return getSession().createQuery("from Admin").setFirstResult(rows*(page-1)).setMaxResults(rows).list();
}
/**
* 總數
* @return
*/
public long getTotal() {
return (Long) getSession().createQuery("select count(*) from Admin").uniqueResult();
}
}
每個層的代碼因爲太多了,就給大家分享了每個層的一個類的方面的代碼。
下面給大家要是如何使項目運行起來:當我們導入項目後,基礎設置修改好,就來這裏配置下項目所需的配置。
進入後通常problem這裏會提示錯誤
出現錯誤先不着急修改,先看上面的配置是否正確。先看modules這一塊
往下走Libraries
如果以上都沒有錯的話,就可以配置tomcat了
到這所有的配置都已完成,就可以啓動tomcat看看效果了
訪問成功,說明自己的配置沒有錯誤,不知道你們學會了沒。
如果想要這個源碼的話,也可以私聊我。