struts2.3.24 + sprut4.1.6 + hibernate4.3.11 + mysql5.5.25開発環境の構築と関連する指示。
1。目標
1.従来のSSH開発環境を構築し、それを正常に実行する(挿入、クエリ)
2。C3P0接続プールの構成を理解します
3.冬眠の二次キャッシュを理解し、検証します
4.春のものの構成を理解し、検証します
5。SpringのIOC(依存関係噴射)を理解し、Struts2のアクションオブジェクト(Bean)をスプリング管理、カスタム豆などに引き渡し、検証します
6.スプリングAOP(セクション指向プログラミング)を理解し、結果を確認するためのカスタムセクション関数を記述します
2。準備
開発環境: Java EEの日食。 mysql5.5.25; JDK1.7.0_79; navicat10.1.7(オプション);
データベースのデモを作成します:
/*NAVICAT MYSQLデータ転送サーバー:LocalHost_3306Sourceサーバーバージョン:50519Sourceホスト:LocalHost:3306Source Database:Demotarget Serverタイプ:MySQLTargetサーバーバージョン:50519FILEエンコーディング:65001DATE:2016-01-09 23:36:02*/ ------------------------------ Table structure for `user`-- --------------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `account` varchar(200) NOT NULL, `name` varchar(200) NOT NULL, `address` varchar(1000) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT charset = utf8;
新しいWebプロジェクトを作成すると、ディレクトリ構造は次のとおりです。
JARパッケージを準備して、Web-INF LIBディレクトリに入れます(興味がある場合は、Mavenを使用してプロセスを管理できますが、JARパッケージをダウンロードするのが非常に遅いこともあります...)
関連するJARパッケージは、ダウンロードされたストラット、スプリング、冬眠にあります。こちらが参照です。スプリングMVCパーツのJARパッケージなど、それらのいくつかは削除できます。
3.web.xmlを構成します
struts2フィルターを構成して、すべての *。アクションリクエストをマッピングし、strutsprepareandexecutefilterオブジェクトによって処理されます。
Context-Paramパラメーターを構成し、Spring構成ファイルのパスを指定します。 <context-param>のパラメーターは、servletcontext.getInitParameter( "param-name");を使用して取得できます。
リスナーの構成は、主にApplicationContext.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/nns/javaee xsi:schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/ns/javaee/web-app_0.0.0.xsd" "id" "id" id "id" webaee/wweb-app_0.xsdd <display-name> ssh </display-name> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.strutspareandexecutefilter </filter-class> </filter> <filter-name> <filter-name> <url-pattern>*。アクション</url-pattern> </filter-mapping> <context-param> <param-name> contextconfiglocation </param-name> <param-value> classpath:applicationcontext.xml </param-value> </context-param> <リスナー> <リスナークラス> org.springframework.web.context.contextloaderlistener </ristener-class> </ristener> <welcome-filelist> <welcome-file> index.jsp </welcome-file> </welcome-file-list> </web-app>
4. ApplicationContext.xmlを構成します
SSHパッケージの下で@Repostory、@Service、およびその他の注釈の自動スキャンを構成し、対応する豆を生成します。
データソースを構成します(JDBC接続プールはC3P0です。C3P0の詳細な構成を参照できます)。接続プールの主な機能は、接続をすばやく提供して再利用することです。それぞれの破壊と創造を必要としません。ユーザー名、パスワード、接続の最大数、接続数、初期数の接続数、その他の関連パラメーターの構成が必要です。
Configure SessionFactory(レベル2キャッシュを有効にするように設定するhibernateの詳細な構成を参照できます)、主な関数はセッションを提供し、SQLステートメントを実行することです。ここでは、hibernateTemplateを使用してデータベースを操作して、スプリングの物理的な制御を容易にします。 PS、クラスとデータベーステーブルの間のマッピングも、Hibernate構成で構成する必要があります。
Transaction Manager BeanをHibernatetransactionManagerとして構成し、以前に構成されたSessionFactory Beanにメンバー属性を初期化します。
トランザクションの伝播特性を構成し、それを参照するセクションを構成し、すべてのssh.serviceパッケージとサブパッケージの下ですべての追加、削除、更新、保存のトランザクション制御を実施します。トランザクション伝播動作およびその他のパラメーターを構成することもできます。
最後に、ssh.aop.aoptestのテストから始まるすべてのメソッドを制御するためにカスタムセクション「myaop」を適用するカスタムAOP関連の構成があり、結果は後で検証されます。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:p = "http://www.springframework.org/schema/P" xmlns:Context = "http://www.springframework.org/schema/context" xmlns:tx = "http://www.springframework.org/schema/tx" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:jdbc = "http://www.springframework.org/schema/jdbc" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schean http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <! - 注釈付きコンポーネントのクラスパスをスキャンします( @repostory and @serviceはspring beansとして自動登録されます - > < name = "DataSource" Destroy-Method = "close"> <プロパティ名= "driverclass" value = "com.mysql.jdbc.driver" /> <プロパティname = "jdbcurl" value = "jdbc:mysql:// localhost:3306 /demo" /> <property = "" root " /> < name = "acchireincrement" value = "1"> </property> <property name = "initialpoolsize" value = "80"> </property name> <property name = "maxidletime" value = "60"> </property> <property name = "maxpoolsize" value = "80"> </property name = "minpoolisizezize"> "30" "> </プロパティ= value = "1000"> </property> <property name = "Acquireretryattempts" value = "60"> </property name = "breakafteracquirefailure" value = "false"> </property> <! - あまりにも多くの接続が表示される場合は、構成ファイルを変更する場合はmysqlを変更して最大の接続数を増やします( <bean id = "sessionfactory"> <プロパティ名= "dataSource" ref = "dataSource"/> <プロパティ名= "hibernateproperties"> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </prop> <prop key = "hihbernate.himow_show_sql"> prop> <> <prope> <prop> key = "hibernate.hbm2ddl.auto"> update </prop> <prop key = "current_session_context_class"> prop> <prop key = "hibernate.cache.use_second_level_cache"> true </prop> <prop key = "hibernate.cache.cache.cache.cache.cache.cache.cache.cache. key = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheregionfactory </prop> <prop key = "hibernate.cache.use_query_cache"> true </prop> <prop key = "hibernate.cache.provider_configuration_file_resource_path"> ehcache.xml </prop> </prop> </props> </property> <property name = "mappinglocations"> <> <balue> classpath:ssh/model/user.hbm.xml </property> name = "AnnotatedClasses"> <list> <value> ssh.model.user </value> </list> </property> - > </bean> <! - トランザクションマネージャーの構成 - > <bean id = "transactionmanager"> <プロパティ名= "sessionfactory" ref = "sessionfactory"/> </bean> < <TX:属性> <tx:メソッド名= "add*" propagation = "read" read-only = "false" lollback-for = "java.lang.exception"/> <tx:method name = "delete*" propagation = "readolly =" fals "lollback-for =" java.exception " read-only = "false" lollback-for = "java.lang.exception"/> <tx:method name = "save*" propagation = "read-only =" false "lollback-for =" java.lang.exception "/> </tx:属性> </tx:アドバイス> <aop:aop =" pcut id = "pcmetuts" SSH.Service ..* <aop:aspect ref = "myaop"> <aop:pointcut id = "pcmethodtest" expression = "execution(* ssh.aop.aoptest.test.test*(..)"/> <aop:before pointcut-ref = "pcmethodtest" method = "before"/> <apotcut-ref = "pcmethottest" </aop:aspect> </aop:config> </beans>
5。struts.xmlを構成します
structures.objectfactory定数をspringに構成し、アクションがbeanから春までに取得されることを示します。
結果タイプを「JSON」に設定すると、他のものを構成することもできます。ここでは、フロントエンドとバックエンドのデータインタラクションの便利さのために、JSON形式で構成されています。
AdduserとQueryalluserの2つのアクションを構成します。
<?xmlバージョン= "1.0" encoding = "utf-8"?> <!doctype struts public " - // apacheソフトウェア財団// dtd struts構成name = "struts.enable.dynamicmethodinvocation" value = "false" /> <constant name = "struts.devmode" value = "false" /> <package name = "default" extends = "struts-default、json-default"> <global-results> <result type = "json name = "contentType"> text/html </param> </result> </global-results> <action name = "adduser" method = "adduser"> <result>。
6.関連するコードを書きます
注:
DAOはHibernatedAoSupportクラスを継承し、すべてのデータベース関連操作はHibernateTemplateによって操作されます。
DAO層、サービス層、およびアクションに対応する注釈を追加し、スプリングビーンズとして登録します。
添付のコードは次のとおりです。
useraction.java
パッケージssh.action; import java.io.printwriter; import java.util.list; import javax.annotation.resource; Import javax.servlet.htttpservletrequest; Import javax.servlet.http.httpservletresponse; import.pach.log4j. -logger; org.apache.struts2.servletactionContext; Import org.springframework.stereotype.controller; Import ssh.aop.aoptest; import ssh.model.user; import ssh.service.userservice; Import com.google.gson.gson; logger.getLogger(useraction.class); @Resourceプライベートユーザーサービスユーザーサービス。 @ResourceプライベートAOPTEST AOPTEST; public void adduser(){printwriter out = null; try {httpservletrequest request = servletactioncontext.getRequest(); httpservletResponse応答= servletactionContext.getResponse(); Response.setContentType( "text/html; charset = utf-8");文字列アカウント= request.getParameter( "アカウント");文字列名= request.getParameter( "name");文字列アドレス= request.getParameter( "アドレス"); user user = new user(); user.setAccount(account); user.setAddress(アドレス); user.setname(name); userservice.add(user); out = response.getWriter(); out.write(new gson()。tojson( "success")); } catch(Exception e){e.printstacktrace(); logger.error(e.getmessage()); if(out!= null)out.write(new gson()。tojson( "fail")); }最後に{out.flush(); out.close(); }} public void queryalluser(){printwriter out = null; aoptest.test1(); aoptest.test2(); //logger.error("i "); try {httpservletResponse応答= servletactionContext.getResponse(); Response.setContentType( "text/html; charset = utf-8"); gson gson = new gson();リスト<user> userlist = userservice.queryalluser(); string gsonstr = gson.tojson(userlist); out = response.getWriter(); out.write(gsonstr); } catch(Exception e){e.printstacktrace(); logger.error(e.getmessage()); if(out!= null)out.write(new gson()。tojson( "fail")); }最後に{out.flush(); out.close(); }}}aoptest.java
パッケージssh.aop; public class aoptest {public void test1(){system.out.println( "aoptest test1メソッドが実行されている〜"); } public void test2(){system.out.println( "aoptest test2メソッドが実行されています〜"); }}myaop.java
パッケージssh.aop; public class myaop {public void before(){system.out.println( "befor〜"); } public void after(){system.out.println( "after〜"); }}Basedao.java
パッケージssh.dao.base; import javax.annotation.resource; import org.hibernate.sessionfactory; import org.springframework.orm.hibernate4.support.hibernateaosupport;パブリッククラスBasedaoは、Hibernatedaosupport {@Resource Public void setsissionsessionsextion(evernatedaoSupport) this.setsessionFactory(SessionFactory); }}userdao.java
パッケージssh.dao; Import java.util.arraylist; Import java.util.list; import org.springframework.orm.hibernate4.hibernateteTemplate; Import org.SpringFramework.StringFramework.Stereotype.Repository; Import SSH.Dao.Baseda.Basedao.Model. userdao extends basedao {public void add(user user){this.gethibernateTemplate()。save(user); } @suppresswarnings( "unchecked")public list <user> queryalluser(){list <user> users = new arraylist <user>(); hibernateTemplate hibernateTemplate = this.gethibernateTemplate(); hibernateTemplate.setCachequeries(true); users =(list <user>)hibernatetemplate.find( "from user"); hibernateTemplate.setCachequeries(false);ユーザーを返します。 }}user.java
パッケージssh.model; import java.io.serializable;パブリッククラスユーザーはSerializable { / ** * * / private static final long serialversionuid = -6190571611246371934l;プライベートロングID;プライベート文字列アカウント。プライベート文字列名;プライベート文字列アドレス。 public string getAccount(){returnアカウント; } public string getname(){return name; } public string getAddress(){return Address; } public void setAccount(stringアカウント){this.account = account; } public void setName(string name){this.name = name; } public void setAddress(stringアドレス){this.address = address; } / ** * @return id * / public long getId(){return id; } / ** * @param idを設定するid * / public void setId(long id){this.id = id; }}user.hbm.xml
<?xml version = "1.0"?> <! - 〜〜〜itimatic java〜〜copyright(c)2010、Red Hat Inc.またはサードパーティの貢献者のリレーショナル持続性は、@authorタグまたはExpress Copyright属性〜著作権の属性〜著者によって適用されます。すべてのサードパーティの貢献は、Red Hat Incによってライセンスに基づいて配布されます。 〜〜このプログラムは、それが有用であることを期待して配布されますが、保証はありません。商品性の暗黙の保証さえも、特定の目的に対するフィットネスの保証なし。詳細については、GNU以下の一般公開ライセンス〜を参照してください。 〜〜この配布とともに、GNU以下の一般公開ライセンスのコピーを受け取る必要があります。そうでない場合は、次のように書き込みます。〜Free Software Foundation、Inc。〜51 Franklin Street、5階〜マサチューセッツ州ボストン02110-1301 USA--> <!doctype Hibernate-Mapping Public "-// Hibernate/Hibernate Mapping DTD 3.0 // EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package =" ssh.model "> <class name =" user "table =" user "> <cache usage =" read-write "/> <id name =" column "" id "> < type = "java.lang.string" column = "account"/> <property name = "name" type = "java.lang.String" column = "name"/> <property name = "address" type = "java.lang.string" column = "address"/> </class> </hibernate-mapping>
userservice.java
パッケージssh.service; import java.util.list; import javax.annotation.resource; import org.springframework.stereotype.service; import ssh.dao.userdao; import ssh.model.user; public List <user> queryalluser(){return userdao.queryalluser(); } public void add(user user){userdao.add(user); }}index.jsp(jqueryライブラリを追加することを忘れないでください)
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> < "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <tittle> 20px;} </style> </head> <body> <div style = "text-align:center;"> <div> <about>アカウント:</label> <入力id = "account" type = "text"/> </div> <div> <able> name:</label> <input id = "name" type = "Text"/> type = "text"/> </div> <div> <button id = "adduser"> add </button> </div> <h3>ユーザーリスト:</h3> <ul id = "userlist"> </ul> <script type = "text/javascript" src = "js/jquery-1.11.1.min.js"> </scrip url: 'queryalluser.action'、type: 'post'、datatype: 'json'、success:function(data){for(var i = 0; i <data.length; i ++){$( "#userlist")。 style = 'color:red'> id = "+data [i] .id+" </span>、account = "+data [i] .account+"、name = "+data [i] .name+"、address = "+data [i] .address+" </li> "); }} catch(e){}; }、エラー:function(e){alert( "sys error"); }}); $( "#adduser") }、function(data){$( "#userlist")。 }); }); </script> </body> </html>7。検証結果
最初に戻り、関連するテクノロジーに精通して、結果を確認します
1.従来のSSH開発環境を構築し、それを正常に実行する(挿入、クエリ)
次の図:ユーザーが正常にクエリと追加を追加します。
2。C3P0接続プールの構成を理解します
データベース接続は高価なリソースであり、開閉はパフォーマンスを消費します。したがって、それらは接続プールで管理し、いくつかの接続を初期化し、それらを再利用することができます。これは、スレッドプールに少し似ています。
構成は次のとおりです。実際のプロジェクトの状況に応じて接続の最小数と最大数を合理的に構成するには、各パラメーターの詳細な意味についてはリンクを参照してください。
さらに、接続番号の構成を確認するのは非常に簡単です。自分で検証するプログラムを作成できます。たとえば、接続の最大数が10の場合、それを検証するプログラムを作成できます。 10の接続を開いた後、11番目の接続が待機状態になり、取得できません。したがって、状況に応じて合理的に接続の数を構成する必要があります。そうしないと、アプリケーションのパフォーマンスに影響を与える可能性があります。
<! - サポートデータソース - > <bean name = "dataSource" Destroy-method = "close"> <プロパティ名= "driverclass" value = "com.mysql.jdbc.driver" /> <プロパティ名= "jdbcurl" value = "jdbc:mysql:// localhost:3306 /demo" /> <"" fard "" fard "" fard "" farts値= "root"/> <プロパティ名= "quckireincrement" value = "1" 1 "> </property> <プロパティ名=" initialpoolsize "value =" 80 "> </property name =" maxidletime "value =" 60 "> </property name =" maxpoolsize "value =" 80 " name="acquireRetryDelay" value="1000"></property> <property name="acquireRetryAttempts" value="60"></property> <property name="breakAfterAcquireFailure" value="false"></property> <!-- If Too many connections appear, please note that modify the configuration file my.ini of mysql to increase the maximum number of connections configuration items (see the current connection command: showプロセスリスト) - > </bean>
3.冬眠の二次キャッシュを理解し、検証します
Hibernateの第1レベルのキャッシュは、デフォルトで有効になっているセッション全体のキャッシュを指します。セカンドレベルのキャッシュは、SessionFactory範囲キャッシュです。 SessionFactoryを構成するとき、2レベルのキャッシュをEHCacheとして構成しました。次に、効果を確認し、ユーザー操作を照会します。最初のクエリがデータベースを操作し、SQLステートメントを印刷することを発見し、ページを更新した後、クエリが成功し、SQLステートメントが印刷されていないことがわかりました。下の図に示すように、二次キャッシュの作業は問題ないことがわかります。
4.春のものの構成を理解し、検証します
いわゆるトランザクション制御原則は同じです。これは、原子性、一貫性、分離、および持続性を確保するためです。 JDBCをプログラミングするとき、それはそれ自体で制御されます。 AutoCommit = falseを自動的に送信しないように設定し、特定のデータベース操作の書き込みを開始します。例外が発生した場合、ロールバック、それ以外の場合はコミットします。実際、物事のスプリングの制御原理は似ており、サービスレイヤーのさまざまな方法を制御するなど、より便利なパッケージ、構成などで追加されます。
検証は非常に簡単です。サービスレベルのメソッドに2つの挿入操作を記述します(メソッド名は、Spring構成ファイルで構成されたルールに準拠する必要があることに注意してください)。最初のユーザーが正常に挿入されていることがわかった場合、トランザクションコントロールが無効であることを意味します。そうでなければ問題ありません。
5。SpringのIOC(依存関係噴射)を理解し、Struts2のアクションオブジェクト(Bean)をスプリング管理、カスタム豆などに引き渡し、検証します
慎重に観察する場合、ApplicationContext.xmlファイルを構成するプロセスで、主な作業はBean関連情報を構成することです。これらの豆は事前に作成されますが、実際にはいわゆる豆はオブジェクトです。
スプリングコンテナにオブジェクトの作成を引き渡す目的は、切り離すことです。
さらに、Strutsを使用する場合、SpringはアクションをBeanとして登録します。これはデフォルトではシングルトンです。アクセス中に新しいアクションが発行されるたびに、同時アクセスの場合、リスクが発生します。
ただし、scope = "prototype"を使用して、アクションを複数のケースに設定できます。 PS:Struts2のアクションはデフォルトではマルチケースです。
注:ApplicationContext.xmlで構成された豆とカスタムアノテーションで構成された豆は、プログラムの実行中に直接取得できます。これは簡単に確認できます。小さなプログラムを書くだけです。
6.スプリングAOP(セクション指向プログラミング)を理解し、結果を確認するためのカスタムセクション関数を記述します
このアイデアは、フィルター、インターセプター、トランザクションコントロールなど、この形式のセクションプログラミングの多くの場所で使用されます。
原則はJava反射と動的プロキシであり、実行前後のメソッドを制御し、実行するコードを追加します。
小さな例にセクションが追加され、メソッドが実行される前後に文字列が印刷された後に印刷されます。下の図に示すように、それは正常に機能します。コードの前の部分を参照してください。
<! - カスタムAOP処理テスト - > <bean id = "aoptest"> </bean> <bean id = "myaop"> </bean> <aop:config proxy-target-class = "true"> <aspef = "myaop"> <aop:pointcut id = "pcmethest" expressution(***** ssh.aop.aoptest.test*(..)) "/> <aop:before pointcut-ref =" pcmethodtest "method =" before "/> <aop:pointcut-ref =" pcmethodtest "method ="後 "/> </aop:aspect> </aop:config>
@author風のようなコーダー
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。