SSHベースの個人情報管理システム

### はじめに:

ソースGitHubのプロジェクト住所:https://github.com/hlk-1135/SSH_PersonInformation

(あなたが好きなら、私にスターをお願いし、交換や共通の進展を歓迎!)


機能モジュール:ログイン、登録、個人情報管理、連絡先管理、スケジューリング、ファイル管理。
要件:
(1)ログインと登録ページ入力の検証を持っている、すなわち-validation.xmlプロファイルの形で、実現するためにStruts2の検証フレームワークを取ります。
(2)アドレス帳の検索機能は、あいまいクエリをサポートしている必要があります。
注意:登録はモデル駆動型フォームを使用する必要があります。

あなたがフォローアップを完了したい場合、これは、実際には、現在の実験は、Struts2のが小さな場合には、ロジックは、以前のライブラリ管理システムに似た非常に複雑な、単機能モジュール、教師によって与えられた必要条件ではありませんされていますが、まだ仕事の非常に大きな額でありますJDBCは、データベースを操作するために使用されてきたため、このプロジェクトでは、我々は春+ Struts2の+休止状態を使用することにしました。


#### モジュール:

  1. 個々のユーザのログインや登録、利用JSは、登録情報を確認してください。(これではインターセプターは、唯一のログイン後の連絡先、ドキュメント、およびその他の関連操作することができ、または唯一のホーム・ページにアクセスすることができます。)
  2. 追加および削除は、検索アドレス帳の連絡先を変更するには、名前や電話番号でファジークエリをサポートします。(更新:バルク削除の友人の完了)
  3. 追加および削除は、検索スケジュールを変更します。(私は実現しなかったので、連絡先は、何の違いをCRUDません)
  4. ファイルを管理するための(データベースにアップロードされたファイルとファイル情報を保存)

#### :第一には、環境設定
の使用MyEclipselを。フロントエンドフレームブートストラップを使用して、Struts2の+スプリング+休止状態を使用して、後端フレーム。
#### 1、データベース:
Userテーブルとデータを作成し、挿入する友人のテーブル:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `userId` int(100) NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `work` varchar(100) NOT NULL,
  `realName` varchar(100) NOT NULL,
  `phone` varchar(100) NOT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for `friends`
-- ----------------------------
DROP TABLE IF EXISTS `friends`;
CREATE TABLE `friends` (
  `friendId` int(100) NOT NULL AUTO_INCREMENT,
  `userId` int(100) NOT NULL,
  `friendName` varchar(100) NOT NULL,
  `friendPhone` varchar(100) NOT NULL,
  `friendCompany` varchar(100) NOT NULL,
  `friendQQ` varchar(100) NOT NULL,
  PRIMARY KEY (`friendId`),
  KEY `user_id` (`userId`),
  CONSTRAINT `user_id` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'hlk1135', '123456', '学生', '王五', '17862828631');

-- ----------------------------
-- Records of friends
-- ----------------------------
INSERT INTO `friends` VALUES ('1', '1', '张三', '17862821111', '阿里巴巴', '862186722');
INSERT INTO `friends` VALUES ('2', '1', '李四', '17862821111', '百度', '111111111');

#### 2、プロジェクト構造を設定します。

書き込み絵は、ここで説明しました

自動的に自分自身をインポートする追加のMyEclipseを使用するときに最初にSSH環境を設定しますが、理由のjarパッケージ間の競合のため、手動ですべてのインポートを変更します。いくつかのjarパッケージがありますが、SSHを統合した後、あなたのjarパッケージを与える冗長ですが、私は全く競合していることを保証することはできません、と確かに良いSSHプロジェクト起動して実行することができます。
Struts2の+ Spring3 + Hibernate4統合のjarパッケージダウンロード

1)のweb.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置Spring的监听器,用于初始化ApplicationContext对象 -->  
  <listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  </listener>  
  <context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value>  
  </context-param>  
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>
  		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
    <!-- 自动扫描action -->  
    <init-param>  
      <param-name>actionPackages</param-name>  
      <param-value>com.hlk.action</param-value>  
    </init-param> 
  </filter>
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
 </web-app>

注:そこcontextConfigLocationのxmlファイルを使用する場合はclasspath:、次のエラーのようなレポートを。

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/beans.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/beans.xml]  
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/beans.xml] 

最後に、継続的なテスト、チューニング、以下の結論を得て、参照用のみ:

<!-- needed for ContextLoaderListener -->
 <!-- 指定spring配置文件的位置 -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <!-- 可以成功加载配置文件 -->
  <!-- <param-value>/WEB-INF/classes/beans.xml,/WEB-INF/classes/action-beans.xml</param-value> -->
  <!-- 不能成功加载配置文件 -->
  <!-- <param-value>/WEB-INF/beans.xml,/WEB-INF/action-beans.xml</param-value> -->
  <!-- 可以成功加载配置文件 -->
  <!-- <param-value>classpath:*beans.xml</param-value> -->
  <!-- 不能成功加载配置文件 -->
  <!-- <param-value>classpath:beans.xml,action-beans.xml</param-value> -->
  <!-- 可以成功加载配置文件 -->
  <param-value>classpath:beans.xml,classpath:action-beans.xml</param-value>
 </context-param>
 <!-- Bootstraps the root web application context before servlet initialization -->
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

この文でStackOverflowの:

Do not use classpath. This may cause problems with different ClassLoaders (container vs. application). WEB-INF is always the better choice.

2)applicationContext.xmlを:(Spring構成ファイル)

<?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"      
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd      
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd      
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">  

    <!-- 自动扫描dao和service包(自动注入) -->
	<context:component-scan base-package="com.hlk.dao,com.hlk.service"/>
	<!-- 引入属性文件 -->
	<context:property-placeholder location="/WEB-INF/classes/config.properties"/>
	<!-- 配置数据源 -->
	<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
		<!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
		<property name="driverClassName" value="${driverClassName}" />
		<!-- 基本属性 url、user、password -->
		<property name="url" value="${jdbc_url}" />
		<property name="username" value="${jdbc_username}" />
		<property name="password" value="${jdbc_password}" />
		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="3" />
		<property name="minIdle" value="3" />
		<property name="maxActive" value="20" />
		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="60000" />
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="validationQuery" value="${validationQuery}" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<!-- 配置监控统计拦截的filters -->
		<property name="filters" value="stat" />
	</bean>
	<!-- 配置hibernate session工厂 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
			</props>
		</property>
		<!--自动扫描注解方式配置的hibernate类文件  -->    
        <property name="packagesToScan">
        	<list>
				<value>com.hlk.model</value>
			</list>
        </property> 
	</bean>
	<!-- 用注解来实现事务管理 -->    
    <bean id="txManager" name="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">    
        <property name="sessionFactory" ref="sessionFactory"></property>          
    </bean>
    <!-- 注解方式配置事物 -->  
    <tx:annotation-driven transaction-manager="txManager"/> 
</beans>

この用途では、私が導入を行うことはありません、データベース接続プーリング、非常に詳細にコードのコメントをドルイド。

3)プロパティファイルconfig.properties:

hibernate.dialect=org.hibernate.dialect.MySQLDialect
driverClassName=com.mysql.jdbc.Driver
validationQuery=SELECT 1
jdbc_url=jdbc:mysql://127.0.0.1:3306/information?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
jdbc_username=root
jdbc_password=

hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true

4)Struts2のプロファイルstruts.xml。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

	<!-- 指定由spring负责action对象的创建 -->
	<constant name="struts.objectFactory" value="spring" />
	<!-- 是否启用开发模式 -->
	<constant name="struts.devMode" value="true" />
	<!-- struts配置文件改动后,是否重新加载 -->
	<constant name="struts.configuration.xml.reload" value="true" />
	<!-- 设置浏览器是否缓存静态内容 -->
	<constant name="struts.serve.static.browserCache" value="false" />
	<!-- 请求参数的编码方式 -->
	<constant name="struts.i18n.encoding" value="utf-8" />
	<!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
	<constant name="struts.i18n.reload" value="true" />
	<!-- 文件上传最大值 -->
	<constant name="struts.multipart.maxSize" value="104857600" />
	<!-- 让struts2支持动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<!-- Action名称中是否还是用斜线 -->
	<constant name="struts.enable.SlashesInActionNames" value="false" />
	<!-- 允许标签中使用表达式语法 -->
	<constant name="struts.tag.altSyntax" value="true" />
	<!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
	<constant name="struts.dispatcher.parametersWorkaround" value="false" />
</struts>

4)リバースエンジニアリングや友人ユーザー生成された2つのJavaのエンティティクラスを休止。

書き込み絵は、ここで説明しました

書き込み絵は、ここで説明しました

私が行う方法でのHibernateリバースエンジニアリングのMyEclipseを使用していないだろうか?問題ありません!こちらをクリック!
あなたを伝えるために、この上でクリックしてください!

#### まあ、これらはその後、我々は我々のニーズの友人を実装するコードをノックすることができ、仕事も出ています。


#### 第二に、各モジュールの実装の機能:

図1に示すように、ユーザ・モジュール

1)ユーザログイン

書き込み絵は、ここで説明しました

ログインインターセプト:

私たちは、ログイン、ユーザーオブジェクトのログオンセッションがある場合、それがnullの場合、その後、参照してくださいログインページに戻るにはチェックしない場合、操作は、URLを行ってもらいます。

public class UserInterceptor extends AbstractInterceptor{
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//获取当前执行的方法
		String methodName = invocation.getProxy().getMethod();
		ActionContext ac = invocation.getInvocationContext();
		//从session中获取登录的用户对象
		Object obj = ac.getSession().get("userInfo");
		
		if(!"login".equals(methodName)) {
			if(obj == null) { //如果session中userInfo对象为null
				return "login";
			} else {
				return invocation.invoke();//允许执行操作
			}
		}
		return invocation.invoke(); 
	}
}

2)ユーザを登録する)検証JSを使用して(

書き込み絵は、ここで説明しました

2、ログイン成功のメインページ

セッションへのログインに成功すると、ログイン情報の後に、他のディスプレイモジュールを見つけるとフォローすることが容易となります。

書き込み絵は、ここで説明しました

図3に示すように、コンタクト管理モジュール

ので、ここで外部キーテーブルの友人へのidユーザテーブル、ユーザのログイン画面ためだけ他の連絡先に、ユーザの操作、連絡先を照会しません。そのため、セッションにユーザーを超える役割を果たしました。

書き込み絵は、ここで説明しました

1)連絡先を追加します。

ここでは、問題に注意を払う必要があり、我々は連絡先、連絡先レコードを追加するとき、我々は連絡先オブジェクトに設定したユーザオブジェクトを、見つける、その後、接触保存する必要があるので、また、USERIDは含まれていること。あります

	public String save() {
		//先根据userId,查出user对象;再设置到联系人对象中
		User user = userService.findUserById(userId);
		friends.setUser(user);
		// 调用Service,保存联系人
		friendService.save(friends);
		return "frilistAction";
	}

書き込み絵は、ここで説明しました

2)表示の連絡先の詳細

ここで再び、モーダルボックスブートストラップ特定の操作を使用して、あなたはデモ小型の具体的な内容について学ぶことができます。------ Struts2のシンプルなライブラリ管理システム

書き込み絵は、ここで説明しました

3)変更の連絡先情報

書き込み絵は、ここで説明しました

4)名前と電話番号によってあいまいクエリ
ここでは、ファジィクエリのサポートは、両方のは、名前だけを使用し、電話番号のみを使用することです。

	/**
	 * 根据姓名和手机号模糊查询
	 */
	@Override
	public List<Friends> getAll(String friendName, String friendPhone) {
		HttpServletRequest request = ServletActionContext.getRequest();
		User user = (User)request.getSession().getAttribute("userInfo");
		int uid = user.getUserId();
		return this.getCurrentSession()
				.createQuery("from Friends where friendName like ? and friendPhone like ? and userId=?")
				.setParameter(0, "%" + friendName + "%")
				.setParameter(1, "%" + friendPhone + "%")
				.setInteger(2, uid)
				.list();
	}

クエリ情報を入力します。

書き込み絵は、ここで説明しました

クエリ結果:

書き込み絵は、ここで説明しました

5)バッチ削除の連絡先

スプライシングを分割する文字列;ボックスを取得するループの削除操作

<input type="checkbox" name="checkboxes" value="<s:property value="#friend.friendId"/>"/>
function delchecked() {
		var ids="";
		var obj=$("input[name='checkboxes']");
		
		for(var i=0;i<obj.length;i++) {
			if(obj[i].checked)
				if(ids=="") {
					ids += obj[i].value;
				} else {
					ids += "," + obj[i].value;
				}
		}
		alert(ids);
		if(ids == ""){
			alert("请勾选要删除的项"); 
			return false; 
		}
		if(confirm("你确定要删除选定项?"))
			location.href="fri_deletemany?ids=" + ids;	//跳转到action
}

FriendAction.java:

public String deletemany() {
		//获取出需要删除的联系人的id
		String str = ServletActionContext.getRequest().getParameter("ids");
		String[] s = str.trim().split(",");
		for (int i = 0; i < s.length; i++) {
			int id = Integer.parseInt(s[i]);
			Friends f = friendService.findById(id);
			friendService.delete(f);
		}
		return "frilistAction";
	}

4、ファイル管理モジュール

1)アップロードファイル

書き込み絵は、ここで説明しました

2)ファイルの一覧表示

書き込み絵は、ここで説明しました


### フォローアップ機能モジュールを改善し続け、コードの更新は、仕上げのGithubにアップロードされます。

SSHベースの個人情報管理システムプロジェクトのソースコード

公開された128元の記事 ウォンの賞賛239 ビュー330 000 +

おすすめ

転載: blog.csdn.net/HLK_1135/article/details/66472207