序文
今日は、SpringMVC+Hibernateの建設を確認します。私はもともと、Spring-Security Permission Control Frameworkも含めると考えていましたが、コンテンツが多すぎることがわかりました。次の記事に任せましょう。この記事では、主にSpringMVC4.1.4と冬眠4.3.8を構築します。また、以前にSpringMVCをたくさん使用しました。この部分はそれに非常に精通しています。結局のところ、SpringMVCは1年以上開発されてきました。今回は、PersistenceレイヤーはHibernateを使用し、データソースはC3P0を使用し、データベースはMySQLを一時的に使用します。私は主に冬眠をレビューしたいと思っています。 SpringMVC+Hibernateのフレームワークを構築するというアイデアは次のとおりです。
1。データベースの設計:テーブル構造を設計すると、3NFを満たし、Hibernateツールを使用して対応するエンティティエンティティを自動的に生成することをお勧めします。
1. Mavenプロジェクトを作成し、必要に応じてMavenパッケージの依存関係を入力します。
2。スプリングのビルド:コントロール層豆のスプリングインジェクションを構成します。
3.冬眠の構築:データソースの構成、SessionFactoryの構成、トランザクションの構成、およびセカンダリキャッシュehcacheの構成。
4.スプリング+冬眠のフレームワーク構造をテストし、ユニットテストジュニット、テストトランザクションの構成などを書き込みます。
5。入力SpringMVC:SpringMVC構成情報を構成します。
6。web.xmlコンテナを構成します
7. 3つのフレームワークの統合をテストします。Mavenコンパイル、パッケージ、展開サーバー、およびテスト。
1。データベース設計
許可、役割、およびユーザーのテーブルを設計します。もちろん、ユーザーが複数の役割を持つことができる場合、1つの役割は複数のユーザーを所有しています。 1つの役割には複数の権限があり、1つの許可は複数の役割に対応しています。したがって、データベーステーブル構造の設計によると、3NFを満たしている場合、5つのテーブルが存在する必要があります。テーブルの特定の情報はリストされていません(ソースコードにダウンロードできます。また、データベースもあります)。テーブルの関係は次のとおりです。
このIDが使用されるのはUUID(36ビット)です
2。Mavenプロジェクトを作成し、pom.xmlファイルを書きます
Maven WebAppプロジェクトを作成し、pom.xmlファイルを書き、必要なパッケージ依存関係を紹介します。必要なものはすべてここにマッピングします。
pom.xmlファイルのコンテンツは次のとおりです。
<Project XMLNS = "http://maven.apache.org/pom/4.0.0" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation = "http://maven.apach/4.0. http://maven.apache.org/maven-v4_0_0.xsd "> <modelversion> 4.0.0 </modelversion> <groupid> org.andy.sh </groupid> <artifactid> springmvc_hibernate_demo </artifactid> </packagiang> </packaging>> 0.0. <name> springmvc_hibernate_demo maven webapp </name> <url> http://maven.apache.org </url> <Properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding <hibernate.version> 4.3.8.final </hibernate.version> <jackson.version> 2.5.0 </jackson.version> </properties> <dependencies> <! - junit-> <依存> <groupid> <! - spring-> <dependency> groupid> org.springframework </groupid> <artifactid> spring-core </artifactid> <version> $ {spring.version} </dependency> <dependency> spegrency> org.springframework </groupid> spring-beans> artifactid> <バージョン> $ {spring.version} </version> </dependency> <dependency> <groupid> org.springframework </groupid> <artifactid> spring-context </artifactid> <version> $ {spring.version} </version> </dependency> <sependency> <グループ<artifactid> spring-tx </artifactid> <version> $ {spring.version} </version> </dependency> <dependency> <groupid> org.springframework </groupid> <artifactid> spring-web </artifactid> <バージョン> $ {spring.version} < <groupid> org.springframework </groupid> <artifactid> spring-test </artifactid> <version> $ {spring.version} </version> <scope> test </scope> </dependency> <! - springmvc-> <依存関係> <shipid> org.springframework </groupid> <artifactid> spring-webmvc </artifactid> <version> $ {spring.version} </version> </dependency> <! - リレーショナルデータベースを統合する場合、hibernate jpaなどを構成する必要があります。 - > <依存関係> groupId> org.springframework </groupid> <artifactid> spring-orm </artifactid> <bersion> $ {spring.version} </version> </dependency> <! - > <依存関係> <groupid> org.hibernate </groupid> <artifactid> hibernate-core-core-core-core-core-core-core-core-core-core-core <バージョン> $ {hibernate.version} </version> </dependency> <dependency> <expendency> org.hibernate </groupid> <artifactid> $ {hibernate.version} </version> </despency> < <GroupId> net.sf.ehcache </groupid> <artifactid> ehcache </artifactid> <version> 2.9.0 </version> </depence> <! - log4j-> <dependency> <groupid> log4j </groupId> <artifactid> log4j </artifactid> 1.2.17 </</</</< <Dependency> groupId> mysql </groupid> <artifactid> mysql-connector-java </artifactid> <version> 5.1.34 </version> </dependency> <! - c3p0データソース - > <依存関係> <groupid> com.mchange </groupid> </dependency> <! - json-> <依存関係> groupid> com.alibaba </groupid> <artifactid> fastjson </artifactid> <バージョン> 1.2.3 </version> </dependency> <seplency> <バージョン> $ {jackson.version} </version> </dependency> <dependency> <shipid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-core </artifactid> <バージョン> $ {jackson.version} </version> </dependency> dependency <artifactid> jackson-databind </artifactid> <version> $ {jackson.version} </version> </dependency> <! - aop-> <dependency> groupid> aspectj </groupid> <artifactid> aspectjweaver </artifactid> <バージョン<GroupId> javax.servlet </groupid> <artifactid> servlet-api </artifactid> <version> 3.0-alpha-1 </version> <scope> </dependencies> <build> <finalName> springmvc_hibernate_demo </finalName> <Plugins> <! - 孤立したクラスローダーでJunitユニットテストを実行 - > <プラグイン> <groupId> org.apache.maven.plugins </groupid> <artifactid < <configuration> <skiptests> true </skiptests> </configuration> </plugin> <plugin> <groupid> org.apache.maven.plugins </groupid> <artifactid> maven-war-plugin </artifactid> <バージョン> 2.3 </バージョン> <構成> <webxml> src/main/webapp/web-inf/web.xml </webxml> </configuration> </plugin> <! - java doc-> <plugin> <groupid> org.apache.maven.plugins </groupid> <artifactid> maven-javadoc-plugin </>>> <javadocdirectory>ターゲット/javadoc </javadocdirectory> <reportoutputdirectory> gavadoc </reportoutputdirectory> <charset> utf-8 </charset> <encoding> utf-8 </encoding> ecoding> <docencoding>ネイティブに展開 - > <Plugin> <groupid> org.codehaus.cargo </groupid> <artifactid> cargo-maven2-plugin </artifactid> <バージョン> 1.0 </version> <containt </container> <configuration> <type>既存3.スプリング構成を紹介します
構成ファイルを書き込み、構成ファイルをSRC/Main/Resources Resources Directoryに配置します(以下と同じ)。
プロジェクトconfig.propertiesで必要な構成情報
#Application Configs#JDBC C3P0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc:mysql:// localhost:3306/work?useunicode = true&charatleencoding = utf-8jdbc.username = rootjdbc.pass configibernate.dialect = org.hibernate.dialect.mysqldialecthibernate.show_sql = truehibernate.format_sql = falsehibernate.hbm2ddl.auto = upducthibernate.cache.use_second_level_cache = truehibernate.cache__cache.dexached_cache truehibernate.cache.region.factory_class = org.hibernate.cache.ehcache.ehcacheregionfactoryhibernate.cache.provider_configuration_file_resource = ehcache.xml
3.1。スプリング構成
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" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context-4.1.context-4.1.context-4.1. <! - 構成ファイルの読み込み - > <コンテキスト:プロパティプレイスホルダーlocation = "classpath:config.properties"/> <! - スキャンサービスはbeanとして自動的に注入されます - > <コンテキスト:component-scanベースパッケージ= "
上記のスプリングでは、パッケージの下の対応するコンポーネント豆の自動豆噴射管理を構成します。 (@Repository、@Service)など、管理するためにDAOの実装クラスとSpringのサービスを引き渡す必要があります。
3.2。ログファイルの構成LOG4Jを紹介します
log4j.propertiesの構成ファイルは次のとおりです。### logレベルの設定### log4j.rootlogger = info、c、d、e ### console ### log4j.appender.c = org.apache.log4j.consoleappenderlog4j.appender.c.tareget org.apache.log4j.patternlayoutlog4j.appender.c.layout.conversionpattern = [springmvc_hibernate_demo] [%p] [%-dd {yyyy-mm-dd hh:mm:ss}]%C。%m(%l)| %n ### log file ### log4j.appender.d = org.apache.log4j.dailyrollingfileappenderlog4j.appender.d.file = ../logs/springmvc_hibernate_demo.loglog4j.appender.d.Append = TrueLog4J.Appender.d.threshold.d.threshold。 log4j.appender.d.layout = org.apache.log4j.patternlayoutlog4j.appender.d.layout.conversionpattern = [springmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh:mm:ss}]%c。%m(l)| %m%n ### Exception ### log4j.Appender.e = org.apache.log4j.dailyrollingfileappenderlog4j.appender.e.file = ../logs/springmvc_hibernate_demo_error.loglog4j.appender.append = TrueLog4J.Appender.e. log4j.appender.e.layout = org.apache.log4j.patternlayoutlog4j.appender.e.layout.conversionpattern = [sspringmvc_hibernate_demo] %m%n 4。冬眠構成
Hibernateの構成には、主に以下が含まれます。データソースC3P0の構成、SessionFactoryの構成、トランザクションマネージャーの構成、およびトランザクション管理の構成。 spring-hibernate.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:tx = "http://www.springframework.org/schema/tx" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemalocation = " http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework/ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/aop/spring-aop-4.1.xsd "> < id = "DataSource" Destroy-Method = "close"> <プロパティ名= "driverclass" value = "$ {jdbc.driver}" /> <プロパティname = "jdbcurl" value = "$ {jdbc.url}" /> <プロパティname = "user" value = "$ {jdbc.usermame}" /> < value = "$ {jdbc.password}" /> <! - リクエストタイムアウト - > <プロパティ名= "checkouttimeout" value = "30000" /> <! - 60秒ごとに接続プールのすべてのアイドル接続を確認します。デフォルト値:0、check-> <プロパティ名= "idleconnectiontestperiod" value = "30" /> <! - 接続データベース接続の最大アイドル時間 - > <プロパティ名= "maxidletime"値= "30" /> <! <プロパティ名= "maxpoolsize" value = "20" /> <! - 接続プールの接続が使い果たされたときに同時にC3P0によって取得された接続の数。デフォルト値:3-> <プロパティ名= "quckireincrement" value = "5" /> < /bean> <! - hibernate sessionfactory-> <bean id = "sessionfactory"> <! - データソースのソースコードを参照 - > <プロパティ名= "dataSource" ref = "datasource" /> < <Props> <Prop key = "hibernate.dialect"> $ {hibernate.dialect} </prop> <prop key = "hibernate.show_sql"> $ {hibernate.show_sql} </prop> <prop key = "hibernate.format_sql"> $ {prop> </prop> </prop> prop> exp key = "hibernate.hbm2ddl.auto"> $ {hibernate.hbm2ddl.auto} </prop> <! - ターンオンレベル2キャッシュ - > <prop key = "hibernate.cache.use_second_level_cache"> key = "hibernate.cache.use_query_cache"> $ {hibernate.cache.use_query_cache} </prop> <prop key = "hibernate.cache.region.factory_class"> $ {hibernate.cache.region.factory_class} </prop> <prop key = "hibernate.cache.provider_configuration_file_resource_path"> $ {hibernate.cache.provider_configuration_file_resource_path} </prop> </props> </property> < value = "org.andy.work.entity" />> < /bean> <! - configure transaction manager-> <bean id = "transactionmanager"> <プロパティ名= "sessionfactory" sessionfactory " /> < /bean> < <! - 詳細なトランザクション処理セマンティクス - > <tx:属性> <tx:メソッド名= "insert*" propagation = "required" /> <tx:method name = "uppdate*" propagation = "required" /> <tx: "delete*" propagation = "" reby " /> <tx:method =" "proom" "proom" /> name = "find*" propagation = "" read-only = "true" /> <tx:method name = "find*" propagation = "read-only =" true " /> <! - その他はデフォルトのトランザクションメソッドを使用します - > <tx:"*" /> < /tx:属性> < /tx:suptation aop aop aop transaction reagantiant-management-> <> <> <> <> < <aop:pointcut id = "transactionpointcut" expression = "execution(*org.andy.service ..*empr。*(..)" /> <! - txadviceポイントカットでtxadviceトランザクションエンハンスメント処理を適用するよう指定 - > <aop:Advidsactionpoint-cut-ref = </aop:config> </beans>上記は、セカンダリキャッシュとehcacheで構成されています。関連する特定の情報については、以前の記事Hibernate hibernate secondary Cacheとehcache構造構成を参照してください。以下は、セカンダリキャッシュの構成です。
4.1。 ehcache.xml構成
<?xml version = "1.0" encoding = "utf-8"?> <ehcache xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation = "../ config/ehcach.xd"> diskstor <! - defaultcache設定。 - > <defaultCache MaxElementsInmemory = "1000" ETERNAL = "false" TimetOidLeseConds = "120" TimetOlivesConds = "120" MaxElementSondisk = "1000000" Overflowtodisk = "True" MemoryStoreEvictionPolicy = "LRU"> - > <cache name = "org.andy.work.entity.acctuser" maxelementininmemory = "2" memorystoreevictionpolicy = "lru" eter = "true" diskpersistent = "false" overflowtodisk = "fals" maxelementondisk = "10000" /> < /ehcache> < /ehcache>
上記の冬眠二次キャッシュehcacheはd:/ehcacheです
5。ビジネスエンティティを生成します
データテーブルを設計した後、Hibernateエンティティには、ツールHibernateツールが自動的に生成されます。 Eclipseでは、Hibernate Toolsプラグインをインストールする必要があります(オンラインで数回インストールしましたが、成功していません。リンクを使用してオフラインでインストールすることをお勧めします。付録は紹介します)。したがって、手動で書く必要はありません。これは、ユーザー情報を備えたエンティティ、acctuser.javaです
パッケージorg.andy.work.entity; //生成2015-2-3 10:43:00 hibernate Tools 4.0.0.0import java.util.date; Import java.util.hashset; import java.util.set; Import javax.persistence.column; import.persistence.persence.entistence.entistence.entistence。 javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.jointable; import javax.persistence.manytomany; Import javax.persist.table; Import javax.persistence.temporal; Import javax.persistencencencencentencencencentencencence.tempolaltype; org.hibernate.annotations.cache; import org.hibernate.annotations.cacheconcurrencystrategy; Import com.fasterxml.jackson.annotation.annotation.annote.jsonignoreproperties;/** * acctuser hbm2java */@entity@table(name = "acct_user" ")" cacheconcurrencystrategy.read_write)パブリッククラスのacctuserを実装するjava.io.serializable { / ** * * / private static final long serialversionuid = 6980093847795726310l;プライベート文字列ID;プライベートストリングニックネーム;プライベート文字列電話;プライベートデート登録時間;プライベートセット<Acctrole> acctroles = new Hashset <Acctrole>(0); public acctuser(){} public acctuser(string id、string nickname){this.id = id; this.nickname = nickname; } public acctuser(string id、string nickname、string telephone、date Registertime、set <ctrole> acctroles){this.id = id; this.nickname = nickname; this.telephone =電話; this.registerTime = RegisterTime; this.acctroles = acctroles; } @id @column(name = "id"、unique = true、nullable = false、length = 36)public string getid(){return this.id; } public void setid(string id){this.id = id; } @column(name = "nick_name"、nullable = false)public string getnickname(){return this.nickname; } public void setnickname(string nickname){this.nickname = nickname; } @column(name = "電話")public string gettelephone(){return this.telephone; } public void setelephone(string telephone){this.telephone =電話; } @tempolal(themeporaltype.timestamp)@column(name = "register_time"、length = 19)public date getregistertime(){return this.registertime; } public void setRegisterTime(date RegisterTime){this.registerTime = RegisterTime; } @jsonignoreProperties(value = {"acctusers"、 "acctauthorities"})@manytomany(fetch = fetchtype.lazy)@cache(usage = cacheconcurrencystrategy.read_write)@jointable(name = "acct_user_rulm" "user_id"、nullable = false、updatable = false)}、inversejoincolumns = {@joincolumn(name = "role_id"、nullable = false、false = false)})public set <acctrole> getacctroles(){return this.acctrolos; } public void setacctroles(set <ctrole> acctroles){this.acctroles = acctroles; }}上に注意すべきことがいくつかあります:
上記のほとんどは、Hibernateツールによって自動的に生成されますが、手動で追加する必要があるものがいくつかあります。
1.このエンティティがレベル2キャッシュを使用している場合、@cacheアノテーションを追加する必要があります。
2.エンティティに設定要素(設定、マップ、リスト)がある場合、およびエンティティがセカンダリキャッシュを使用したい場合、これらのセット要素も@cacheアノテーションで追加する必要があります。
3。@jsonignorePropertiesアノテーションは、JSONが戻ったときにSpringMVCがループ出力を生成するのを防ぐためです。構成されていない場合、JSON Dead Loopが発生します(および多目的で1対多数のプロパティ)。
4。@jsonignoreはこのプロパティを無視するためにJSONに変換していますが、@jsonignoreProperties(value = {"acctusers"、 "acctauthorities"})は、AcctusersおよびAcctauthoritiesプロパティを無視します。
6. DAOレイヤーを作成します
6.1Daoインターフェイス
DAOレイヤーとサービスレイヤーでフェイシャルインターフェイスプログラミングのアイデアを採用する必要があるため、まず一般的なDAOインターフェイスgenericdao.javaを定義します。
Package org.andy.work.dao; import java.io.serializable; Import java.util.list;/** *作成時間:2015-2-6 2:26:42 PM * * @author * @version 2.2 * * DAO一般インターフェイス */インターフェースgenericdao <t、pk extends serializable> {t loadable t get(pk id); list <t> findall(); void staste(t entity); PK Save(T Entity); void saveorupdate(t entity); void delete(pk id); voidフラッシュ();}特定のuserdao.javaインターフェイスを定義します
パッケージorg.andy.work.dao; Import org.andy.work.entity.acctuser;/** *作成時間:2015-2-6 2:43:50 PM * * @Author Andy * @version 2.2 * *ユーザーDAOインターフェイス */パブリックインターフェイスユーザーダオ拡張genericdao <acctuser> {} {}6.2。 DAOレイヤー実装クラス
DAO層の実装クラスを豆に注入する必要があるため、@Repositoryアノテーションを追加する必要があります。UserDaoImplは次のとおりです。
Package org.andy.work.dao.impl; Import java.util.list; Import org.andy.work.dao.userdao; Import org.andy.work.entity.acctuser; Import org.hibernate.session; Import org.hibernate.sessionfactory; Import framework.annot.Annot org.springframework.stereotype.repository;/** *作成時間:2015-2-6 2:45:14 PM * * @Author Andy * @version 2.2 */ @repository( "userdao")Public Class userdaoimpl Implements userdaoプライベートセッションgetCurrentsession(){return this.sessionfactory.getCurrentsession(); } @Override public acctuser load(string id){return(acctuser)this.getCurrentsession()。load(acctuser.class、id); } @Override public acctuser get(string id){return(acctuser)this.getCurrentsession()。get(acctuser.class、id); } @suppresswarnings( "Unchecked")@override public list <Acctuser> findall(){list <Acctuser> acctusers = this.getCurrentsession()。create query( "from acctuser")。 Acctusersを返します。 } @Override public void persist(acctuser entity){this.getCurrentssession()。永続(エンティティ); } @Override public String Save(acctuser Entity){return(string)this.getCurrentssession()。save(entity); } @Override public void saveorupdate(acctuser entity){this.getCurrentsession()。saveorupdate(entity); } @Override public void delete(string id){acctuser entity = this.load(id); this.getCurrentsession()。delete(entity); } @Override public void flush(){this.getCurrentsession()。flush(); }}7.サービスレイヤーを作成します
7.1。サービスレイヤーインターフェイス
Package org.andy.work.service; Import java.util.list; Import org.andy.andy.entity.acctuser;/** *作成時間:2015-2-6 3:18:57 PM * * @author * @version 2.2 * userservice interface */public interface userservice {acctuser load(String id); acctuser get(string id);リスト<Acctuser> findall(); void persist(acctuserエンティティ);文字列Save(Acctuser Entity); void saveorupdate(acctuserエンティティ); void delete(string id); voidフラッシュ();}7.2。サービスレイヤー実装クラス
userserviceimplは、上記で定義されているDAO層ビーンを注入する必要があります。
Package org.andy.work.service.impl; Import java.util.list; Import org.andy.work.dao.userdao; Import org.andy.work.entity.acctuser; Import org.andy.service.userservice; Import org.springframework.beans.beans.beans.wean org.springframework.stereotype.Service;/** *作成時間:2015-2-6 3:24:16 PM * @Author Andy * @version 2.2 Userservice実装 */ @ @ @ @serves( "userservice")public class userserviceimpl emberte userservice {@autowired private userdao userdao; @Override public acctuser load(string id){return userdao.load(id); } @Override public acctuser get(string id){return userdao.get(id); } @Override public List <Acctuser> findall(){return userdao.findall(); } @Override public void persist(acctuser entity){userdao.persist(entity); } @Override public String Save(Acctuser Entity){return userdao.save(entity); } @Override public void saveorupdate(acctuser entity){userdao.saveorupdate(entity); } @Override public void delete(string id){userdao.delete(id); } @Override public void flush(){userdao.flush(); }}8。スプリングと冬眠の統合をテストします
上記の構成をテストするために、SRC/TEST/JAVAでテストクラスを記述できます。テストが成功した場合、基本的に完了します。
Package org.andy.work.service; Import java.util.date; import java.util.list; import java.util.uuid; Import org.andy.work.entity.acctuser; import org.apache.log4j.logger; import org.junit.test; import.junit.runwith; import org.junit.runwith; org.springframework.beans.factory.annotation.autowired; Import org.springframework.test.context.contextconfiguration; Import org.springframework.test.context.junit4.springjunit4classrunner; import com.alibaba.fhad.json.json.** ** ** ** ** ** ** ** **** 3:31:07 PM * * @Author Andy * @version 2.2 */ @runwith(springjunit4classrunner.class)@contextconfiguration(locations = {"classpath:spring.xml"、 "classpath:spring-hibernate.xml"})公共クラスの精巣.getLogger(testuserservice.class); @Autowiredプライベートユーザーサービスユーザーサービス。 @test public void save(){acctuser acctuser = new acctuser(); acctuser.setid(uuid.randomuuid()。toString()); acctuser.setnickname( "andy"); acctuser.setregistertime(new date()); acctuser.settelephone( "130222211111");文字列id = userservice.save(acctuser); logger.info(json.tojsonstring(id)); }}9。SpringMVCを紹介します
spring-mvc.xmlファイルを追加します
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:mvc = "http://www.springframework.org/schema/mvc" "" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:p = "http://www.springframework.org/schema/p" xmlns:context = "http://ww.springfrext" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.11.xsd http://www. http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd "> <! - 自動スキャン@controllerインジェクションとして - > <コンテキスト:Component-scanベースパッケージ=" org.andy.work.controller " <MVC:annotation-driven> <! - return json data、 @responsed-used-> <mvc:message-converters register-defaults = "true"> <bean> <property name = "supportedmediatypes"> <balue> <balue> </bean> </mvc:message-converters> </mvc:annotation-driven> <! - モデルビュー名を解析します。つまり、モデルビュー名にプレと接尾辞を追加します - > <bean> <プロパティ名= "Viewclass" value = "org.springframework.web.web.servlet.view.view"/> <propicial name "" " value = "/web-inf/views"/> <プロパティname = "suffix" value = "。jsp"/> </bean> </beans>
パッケージスキャンコントローラー[電子メール保護]��、およびビューレイヤー構成は上記で構成されています。
10。web.xmlコンテナを構成します
WebコンテナはWebプロジェクトの脳であるため、WebコンテナはまずSpringを導入し、Springをさまざまなフレームワークを管理し、それらを豆に注入する必要があります。次に、制御レイヤーのフィルター情報を構成します。 SpringMVCによってインターセプトされたURLは、.hmlsで終了するリクエストに構成されています。
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/nns/javaee xmlns:web = "http://java.sun.com/xml/ns/javaee" xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id = "webapp_id"バージョン= "2.5" <param-name> contextconfiglocation </param-name> <param-value> classpath:spring.xml、classpath:spring-hibernate.xml </param-value> </context-param> <filter> <filter> <filter> ecodingfilter </filter-name> <filter-class> org.springframework.web.filter.filter.filtter <init-param> <param-name>エンコード</param-name> <param-value> utf-8 </param-value> </init-param> <init-mame> form-value> true </param-value> </init-param> </filter-mapting> <フィルターマッピング> <フィルターマッピング> <フィルターマッピング> <url-pattern>/*</url-pattern> </filter-mapping> <! - OpenSessionInviewの構成は、セッションの閉鎖レイヤー - > <filter> <filter-name> opensessionInmame> openSession-name> <filter-class> org.springframework.om. <init-param> <param-name> singlessession </param-name> <param-value> true </param-value> </init-param> </filter> <! - contextcontextを聞いてスプリング構成情報を開始する - > <リスナー> <リスナークラス> org.springframework.web.context.context.context.context.context.context.context.context.context.contex <!-- Listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Prevent spring memory overflow listener --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <servlet> <説明>スプリングMVCサーブレット</description> <servlet-name> rest </servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <init-param> <param-name> contextconfiglocation </param-name> <! <param-value> classpath:spring-mvc.xml </param-value> </init-param> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> rest </servet-name> <url-pattern>*。 <filter-name> opensessionInviewfilter </filter-name> <url-pattern>*。htmls</url-pattern> </filter-mapping> <! - sinsion timeout> <in minutes-> <session-timeout> 30 </session-timeout> </session-config> </welcome-file-list> </web-app>
11.コントロールレイヤーコントローラーを作成します
制御層usercontroller
Package org.andy.work.controller; Import java.util.list; Import org.andy.andy.entity.acctuser; Import org.andy.work.service.userservice; Import org.apache.logger; import org.logger; Import org.springframework.beans.Annotation.Annotation; org.springframework.stereotype.controller; import org.springframework.ui.modelmap; Import org.springframework.web.bind.annotation.pathvariable; Import org.springframework.web.bind.annotation.Requestmapping; Import org.springframework.web.bind.annotation.responsebody;/** *作成時間:2015-2-7 11:49:00 am * @author * @version 2.2 *説明:ユーザーコントローラー */ @controller @requestmapping( "/user")パブリッククラスのusercontroller {private static final static final logger = getger grassger @Autowiredプライベートユーザーサービスユーザーサービス。 @RequestMapping( "/showinfo/{userId}")public string showuserinfo(modelmap modelmap、 @pathvariable string userid){ogger.info( "query user:" + userid); AcctUser userInfo = userService.load(userId); modelMap.addAttribute("userInfo", userInfo); return "/user/showInfo"; } @RequestMapping("/showInfos") public @ResponseBody List<AcctUser> showUserInfos(){ LOGGER.info("Query all users of the user"); List<AcctUser> userInfos = userService.findAll(); return userInfos; }}12、创建视图层
在src/main/webapp/WEB-INF/views下创建user/showInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><base href="<%=basePath%>" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" src="js/jquery-1.9.1.min.js"></script><title>userInfo</title></head><body> User information nickname: ${userInfo.nickName} User id: ${userInfo.id} User phone: ${userInfo.telephone } Registration time: <fmt:formatDate value="${userInfo.registerTime }" pattern="yyyy-MM-dd HH:mm:ss" /> Role: [ <c:forEach items="${ userInfo.acctRoles}" var="role"> ${role.name } Permissions[ <c:forEach items="${ role.acctAuthorities}" var="authority"> ${authority.name } </c:forEach> ] </c:forEach> ] <br /> ajax displays all user information: <div id="show_all_user"></div></body><script type="text/javascript"> $.ajax({ type : "get", url : "user/showInfos.htmls", dataType : "json", success : function(data) { $(data).each( function(i, user) { var p = "<p>Nickname:" + user.nickName + " Phone:" + user.telephone + " Registration time:" + user.registerTime + " id:" + user.id + "</p>"; $("#show_all_user").append(p); }); }, async : true });</script></html>13、部署服务器测试
使用Maven打包部署:clean compile package
部署到tomcat,测试主要测试上面的http://localhost:8080/springmvc_hibernate_demo/user/showInfo/6e5afb1d-50e1-45fe-b6fe-b9e399415387.htmls
和http://localhost:8080/springmvc_hibernate_demo/user/showInfos.htmls (json数据返回)
上面视图层就包含了这两条url请求的测试:
ok,到此Spring+SpringMVC+Hibernate搭建完毕。
博客来源:http://blog.csdn.net/fengshizty?viewmode=list
项目源码:http://download.csdn.net/detail/fengshizty/8432647
I hope to help friends in need and continue to add relevant information in the future.このサイトへのご支援ありがとうございます!