Предисловие
Сегодня я рассмотрю строительство Springmvc+Hibernate. Первоначально я думал, что в нее также будет включена структура управления разрешением на обеспечение безопасности пружины, но я обнаружил, что содержание слишком много. Давайте оставим это в следующую статью. Эта статья в основном строит Springmvc4.1.4 и Hibernate4.3.8. Я также использовал много Springmvc раньше. Эта часть очень знакома с ней. В конце концов, SpringMVC был разработан более года. На этот раз слой стойкости использует Hibernate, источник данных использует C3P0, а база данных временно использует MySQL. В основном я хочу просмотреть Hibernate. Идея построения структуры Springmvc+Hibernate заключается в следующем:
1. База данных проектирования: проектируйте структуру таблицы, лучше всего соответствовать 3NF и использовать инструменты Hibernate для автоматического генерации соответствующей сущности.
1. Создайте проект Maven и введите зависимости пакета Maven по мере необходимости.
2. СОЗДАТЕЛЬСТВО SPRING: Настройте впруживку пружинного впрыска бобов управляющего слоя.
3. Создайте Hibernate: настройте источники данных, настройте SessionFactory, настраивайте транзакции и настраивайте вторичный кэш Ehcache.
4. Проверьте структуру конструкции Spring+Hibernate, Test Test Junit, конфигурация транзакции тестовой транзакции и т. Д.
5. Ввод Springmvc: настройка информации о конфигурации SpringMVC.
6. Настроить контейнер web.xml
7. Проверьте интеграцию трех структур: Maven Компиляции, пакетов и развертывания серверов и тестов.
1. Дизайн базы данных
Разработайте таблицу разрешений, ролей и пользователей. Конечно, если пользователь может иметь несколько ролей, одна роль владеет несколькими пользователями; Одна роль имеет множество разрешений, и одно разрешение соответствует нескольким ролям. Следовательно, в соответствии с дизайном структуры таблицы баз данных, если она соответствует 3NF, нам нужно 5 таблиц. Конкретная информация таблицы не указана (вы можете загрузить ее в исходном коде, а также есть база данных), и табличное отношение выглядит следующим образом:
Только в этом идентификаторе используется 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.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <doliderversion> 4.0.0 </modelversion> <groupid> org.andy.sh </GroupId> <ArtifactId> springmvc_hibernate_demo </artifactid> <packaging> </packaging> <версия> 0.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1. <mame> springmvc_hibernate_demo maven webapp </name> <url> http://maven.apache.org </url> <properties> <prop.build.sourceEncoding> utf-8 </project.build.sourceending> <spring.version> 4.1.4.srelease.build. <hibernate.version> 4.3.8.final </hibernate.version> <jackson.version> 2.5.0 </jackson.version> </свойства> <Depertiencies> <!-junit-> <dehydency> <groupid> junit </GroupId> <StrifactId> JUNIT </artifactid> <sression> 4.12 <sers> </rappope> </rappope> </rappope> </rappope> </rappope> </rappope> </rappope> </rappope> <//rappope> </rappope> </artifactid> <persion>. --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </depervice> <dependency> <groupid> org.springframework </groupid> <artifactid> spring-context </artifactid> <sersion> $ {spring.version} </version> </repertive> <dependency> <groupd> org.springframework </GroupId> <artifactid> spring-tx </artifactid> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <ArtifactId> Spring-test </artifactid> <sersion> $ {Spring.version} </version> <scope> test </scope> </depervice> <!-Настройка с Springmvc-> <Depection> <groupId> org.springframe </GroupD> <artifactid> spring-webmvc </artifactid> </GroupD> <artifactid> spring-webmv </depertive> <!- При интеграции реляционной базы данных вам необходимо настроить, например, Hibernate JPA. -> <Dependency> <groupId> org.springframework </GroupId> <ArtifactId> Spring-orm </artifactid> <sersive> $ {Spring.version} </version> </depertive> <!-hibernate-> <DepeCted> <groupId> org.hibernate </GroupD> <! <sersion> $ {hibernate.version} </version> </deperency> <depervice> <groupid> org.hibernate </GroupId> <strifactid> hibernate-ehcache </artifactid> <sersiod> $ {hibernate.version} </ression> </vehyse> <!-Secondery Cache ehcache-> </ression> </yehyederency> <!-Secondery Cache ehcache-> </ression> </vehyse> <! <groupId> net.sf.ehcache </GroupId> <ArtifactId> ehcache </artifactid> <sersion> 2.9.0 </version> </devestion> <!-log4j-> <dehyed> <groupid> log4j </GroupId> <strifactid> log4j </artifactid> <serview> 1.2.17 </ression> </artifactid>-artifactid> <serview> 1.2.17. <depervice> <groupid> mysql </GroupId> <ArtifactId> MySQL-Connector-java </artifactid> <sersive> 5.1.34 </version> </depervice> <!-C3P0 Источник данных-> <Depective> <groupId> com.mchange </Groupid> <strifactId> c3p0 </artifactid>. </dependency> <!-json-> <depervice> <groupid> com.alibaba </groupid> <artifactid> fastjson </artifactid> <sersive> 1.2.3 </version> </depertive> <dependency> <groupid> com.fasterxml.jackson.core </GroupD> <strifactId> artifactId> artifactatation <sersion> $ {jackson.version} </version> </deperency> <Dependency> <groupId> com.fasterxml.jackson.core </GroupId> <straCactId> jackson-core </artifactid> <sersion> $ {jackson.version} </ression> </group> <dependency> <groupid> com.fasterxml.cloor.core. <artifactid> jackson-databind </artifactid> <sersive> $ {jackson.version} </version> </depertive> <!-aop-> <depervice> <groupid> org.aspectj </GroupId> <artifactid> AspectJweaver </artifactid> <version> 1.8.4 </версия> </rehylete> </artifactid> <sersive> 1.8.4 </версия> </rehylet> <! <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <buld> <finalname> springmvc_hibernate_demo </finalname> <blicins> <!-Запустите The Junit Unit Tests в изолированном ClassLoader-> <blicin> <groupid> org.apache.maven.plugins </GroupId> <strifactid> maven-surefire-plugin </artifactid> <serive> <serive> <serive> <artifactid> maven-surefire-plugin </artifactid> <serive>. <skiptests> true </skiptests> </configuration> </plagin> <blicin> <groupid> org.apache.maven.plugins </GroupId> <straCactId> mavenwar-plugin </artifactid> <serse> 2,3 </version> <configuration> <bebxml> src/main/webapp/web-inf/web-inf/web-inf/web-inf/web-inf/web-inf/web-infml> </configuration> </plugin> <!-генерировать Java Doc-> <blicin> <groupid> org.apache.maven.plugins </GroupId> <ArtifactId> maven-javadoc-plugin </artifactid> <sersive> 2.9.1 </version> <conitivuration> <javadocdirectory> javadocdirectory> <protectOutputDirectory> target/javadoc </reportOutputDirectory> <CHARSET> UTF-8 </charset> <Coding> UTF-8 </encoding> <Cocencoding> UTF-8 </doceNcoding> <Show> private </show> </configuration> </plagin> <! <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0</version> <configuration> <container> <containerId>tomcat6x</containerId> <home>D:/WebServer/apache-tomcat-6.0.39</home> </container> <configuration> <Weps> существует </type> <mome> d: /webserver/apache-tomcat-6.0.39 </home> </configuration> </configuration> </plugin> </plugins> </build> </project>3. Внедрить конфигурацию пружины
Запишите файл конфигурации и поместите файл конфигурации в каталог ресурсов SRC/Main/Resources (то же самое ниже).
Информация о конфигурации, требуемая для проекта config.properties
#application configs#jdbc c3p0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: // localhost: 3306/horeunicode = true & parmentencoding = utf-8jdbc.usernam org.bhibernate.dialect.mysqlidialecthibernate.show_sql = truebernate.format_sql = falsebernate.hbm2ddl.auto = updatebernate.cache.use_second_level_cache = truehibernate.cache.use_query_cache = truehibernate.cache.care.care.care.care.care.care.care. org.hibernate.cache.ehcache.ehcacheregionfactorybirgernate.cache.provider_configuration_file_resource_path = 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.spramework.orgemabema-4.4. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!-- Loading configuration file --> <context:property-placeholder location="classpath:config.properties"/> <!-- Scan service automatically injected as bean -> <Контекст: Component Scan Base-package = "org.andy.work.service.impl, org.andy.work.dao.impl" /> < /beans>
Вышеупомянутая пружина настраивает автоматическое управление впрыском бобов соответствующих компонентных бобов под пакетом. Нам нужно передать класс внедрения DAO и сервиса Spring для управления, например (@Repository, @Service).
3.2. Представьте Log File Configuration Log4J
Файл конфигурации log4j.properties заключается в следующем: ### Установить уровни журнала ### log4j.rootlogger = info, c, d, e ### Консоль ### log4j.appender.c = org.apache.log4j.consoleappenderlog4j.appender.c.target = system.outlog4j.ppender.c.lay. org.apache.log4j.patternlayoutlog4j.appender. %m%n ### Файл журнала ### log4j.appender.d = org.apache.log4j.dailyrollingfileapenderlog4j.appender.d.file = ../logs/springmvc_hibernate_demo.loglog4j.appender.d.append = truelog4j.appenden org.apache.log4j.patternlayoutlog4j.appender. %m%n ### Исключение ### log4j.appender.e = org.apache.log4j.dailyrollingfileapenderlog4j.appender.e.file = ../logs/springmvc_hibernate_demo_error.loglog4j.appender.e.append = truelog4j.appender. log4j.appender.e.layout = org.apache.log4j.patternlayoutlog4j.appender. %m%n
4. Конфигурация Hibernate
Конфигурация 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://wwww.springform. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-4.4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd "> <! id = "DataSource" Drest Method = "close"> <property name = "DriverClass" value = "$ {jdbc.driver}" /> <name = "jdbcurl" value = "$ {jdbc.url}" /> <name = "user" value = "$ {jdbc.Useranam value = "$ {jdbc.password}" /> <!-Timeout запроса-> <name = "checkouttimeout" value = "30000" /> <!-Проверьте все простоя в пуле соединений каждые 60 секунд. Значение по умолчанию: 0, не проверяйте-> <name = "idleconnectionTestPeriod" value = "30" /> <!-Максимальное время холостого хода для базы соединений соединений-> <name = "maxidletime" value = "30" /> <!-Номер соединений инициализированные соединения в пуле соединений-> <proportme = "initialpoolsize" value = "5" /> <proports valuoos = "min proports valuy valuise =" 5 " /> <propool" MinPOOLS ". /> <Свойство имя = "maxpoolsize" value = "20" /> <!- Количество соединений, полученных C3P0 в одно и то же время, когда соединение в пуле соединения исчерпано. Значение по умолчанию: 3-> <Property name = "Приобретение" value = "5" /> < /bean> <!-Configure Hibernate SessionFactory-> <Bean Id = "SessionFactory"> <!-См. Исходный код для инъекции источника данных-> <property name = "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"> $ {hibernate. key = "hibernate.hbm2ddl.auto"> $ {hibernate.hbm2ddl.auto} </prop> <!-Включите кэш 2 уровня 2 ehcache-> <prop key = "hibernate.cache.use_second_levage_cache"> $ {hibernate.cache.cache_second_cle_levache 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> </provs> </property> <!-Scan the Entity конфигурации Hibernate Annotation-> <phiposceposce namosces namosces namosceStosceStosceStosceStosceStosceS. value = "org.andy.work.entity" /> < /bean> <!-Configure Transaction Manager-> <Bean Id = "TransactionManager"> <Название свойства = "SessionFactory" ref = "SessionFactory" /> < /bean> <!-Configure Transaction Compression Beans и указание транзакционного менеджера! Настройте подробную семантику обработки транзакций-> <TX: атрибуты> <tx: method name = "insert*" opragation = "требуется" /> <tx: method name = "update*" Propagation = "требуется" /> <tx: method name = "delete*" Propagation = "Требуется" /> <TX: Method nameld = "GET*Propagation =" repagation = " /> <tx: Method name =" get*"wat*". name = "find*" opragation = "Поддерживает" read-only = "true" /> <tx: method name = "find*" Propagation = "Поддерживает" read-only = "true" /> <!-Другие используют методы транзакции по умолчанию-> <tx: method name = "*" /> < /tx: атрибуты> < /tx: консультант> <! <aop:pointcut id="transactionPointcut" expression="execution(* org.andy.work.service..*Impl.*(..))" /> <!-- Specify to apply txAdvice transaction enhancement processing at txAdvice pointcut--> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop: config> </beans> Приведенное выше настроено с помощью вторичного кэша и ehcache. Для соответствующей конкретной информации, пожалуйста, см. В предыдущей статье Hibernate Secondary Cache и конфигурации Ehcache Construction. Ниже приведена конфигурация вторичного кэша.
4.1. Ehcache.xml Конфигурация
<? xml version = "1.0" Encoding = "utf-8"?> <ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespaceschemalocation = "../ config/ehcache.xsd"> <diskstore = "/ehcache.xsd"> <drishstore = "/ehcache.xsd"> "/ehcache.xsd"> "! Настройка по умолчанию. -> <defaultcache maxelementsinmemory = "1000" eternal = "false" timeToidLeseconds = "120" timetoliveseconds = "120" maxElementeSondisk = "1000000" OupFlowToDisk = "True" MemoryStoreEvictionPolicy = "lru"> </defflowcache> <!-Специальные объекты. -> <cache name = "org.andy.work.entity.acctuser" maxelementsinmemory = "2" memoryStoreEvictionPolicy = "lru" eternal = "true" diskpersistent = "false" uverflowtodisk = "false" maxelementsondisk = "1000000" /> < /ehcache>
Вышеуказанный вторичный кэш с гибернатом ehcache - d:/ehcache
5. генерировать бизнес -объект
После разработки таблицы данных объекты Hibernate имеют автоматически созданные инструменты Hibernate Tools. Eclipse требует установки плагина Hibernate Tools (я установил его в Интернете несколько раз, но он не успешен. Рекомендуется использовать ссылки для установки автономного режима, и приложение представит его). Поэтому нет необходимости писать вручную. Вот объект с информацией пользователя, Accstuser.java
пакет org.andy.work.entity; // сгенерировано 2015-2-3 10:43:00 с помощью Hibernate Tools 4.0.0Import java.util.date; импорт java.util.hashset; импорт java.util.set; импорт javax.persistence.column; импорт. javax.persistence.id; импорт javax.persistence.joincolumn; import javax.persistence.jointable; импорт javax.persistence.manytomany; импорт javax.persistence.table; импорт javax.persistence. org.hibernate.annotations.cacheconcurrencystrategy; import com.fasterxml.jackson.annotation.jsonignoreproperties;/** * Accstuser, сгенерированный HBM2Java */@entity@table (name = "acct_user", cataloga@public@cache = cachconcurrite ", catalog =")@cache = cachconcurrite ") Accstuser реализует java.io.serializable { / ** * * / private Static Long Long SerialVersionuid = 6980093847795726310L; Приватный идентификатор строки; Приватный прозвище; частный строковый телефон; Частная дата регистрации; Частный набор <Caccstrole> accstroles = new Hashset <ccctrole> (0); public accstuser () {} public accstuser (String Id, String Nickname) {this.id = id; this.nickname = ник; } public accstuser (идентификатор строки, прозвище строки, строковый телефон, дата регистрации, установка <caccstrole> accstroles) {this.id = id; this.nickname = ник; this.telephone = телефон; this.registertime = Registertime; this.acctroles = accstroles; } @Id @column (name = "id", уникальный = 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 = никнам; } @Column (name = "telephone") public String getTelephone () {return this.telephone; } public void setTelephone (строковый телефон) {this.telephone = телефон; } @Temporal (themeraltype.timestamp) @column (name = "Register_time", Length = 19) Публичная дата getregistertime () {return this.registertime; } public void setRegistertime (дата регистрации) {this.registertime = registerTime; } @JsonignoreProperties (value = {"accstusers", "acctauthorities"}) @manytomany (fetch = fetchtype.lazy) @cache (usage = cacheconcurrencystrategy.read_write) @jointable (name = "acct_user_role", catalog = "jointcumb = "user_id", nullable = false, updataitable = false)}, inversejoincolumns = {@joincolumn (name = "role_id", nullable = false, updatable = false)}) public set <ccctrole> getAcctroles () {return this.acctroles; } public void setAcctroles (set <caccstrole> accstroles) {this.acctroles = accstroles; }} Есть несколько вещей, на которые следует отметить:
Большинство из вышеперечисленного автоматически генерируются инструментами Hibernate, но есть несколько, которые необходимо добавить вручную:
1. Если эта сущность использует кэш уровня 2, вам нужно добавить аннотацию @Cache;
2. Если в объекте есть установленные элементы (Set, Map, List), и если объект хочет использовать вторичный кэш, то эти элементы установки также должны быть добавлены с помощью аннотации @Cache.
3. @jsonignoreProperties аннотация должна предотвратить производство SpringMVC, когда JSON возвращается. Если это не настроено, будет происходить Dead Loop JSON (и многие ко многим, от одного ко многим свойствам).
4. @jsonignore конвертируется в JSON, чтобы игнорировать это свойство, в то время как @jsonignoreProperties (value = {«Accstusers», «Acctauthorities»}) игнорирует свойства Accstusers и Acctauthorities в акстролях.
6. Создайте слой DAO
6.1dao интерфейс
Мы должны принять идею программирования интерфейса лица в слое DAO и уровне обслуживания, поэтому мы сначала определили общий интерфейс DAO, geneicDao.java
пакет org.andy.work.dao; import java.io.serializable; import java.util.list;/** * Создано время: 2015-2-6 2:26:42 PM * * @Author Andy * @version 2.2 * * DAO General Interface *//Interface GenericDao <T, PK Edivals> {T нагрузка (PK ID); T get (pk id); Список <t> findall (); пустота сохраняется (t Entity); PK Save (t Entity); void saveorUpdate (t Entity); void delete (pk id); void flush ();}Определите конкретный интерфейс userdao.java
Пакет org.andy.work.dao; import org.andy.work.entity.acctuser;/** * Время создания: 2015-2-6 2:43:50 вечера * * @author andy * @version 2.2 * * Пользователь DAO Interface */public userDao endences geneicdao <accstuser, string> {}}6.2. Класс реализации слоя DAO
Нам необходимо ввести класс реализации слоя DAO в бобы, поэтому нам нужно добавить аннотацию @Repository, пользователь aserdaoimpl выглядит следующим образом:
пакет org.andy.work.dao.impl; import java.util.list; import org.andy.work.dao.userdao; import org.andy.work.entity.acctuser; импорт org.hibernate.session; импорт. org.springframework.stereotype.repository;/** * Время создания: 2015-2-6 2:45:14 * * * @author andy * @Version 2.2 */ @Repository ("userDao") открытый класс пользовательский userDaoImplements Imprements userDao {@Autowired Private SessionFactory; частная сессия getCurrentSession () {return this.sessionFactory.getCurrentSession (); } @Override public accstuser load (string id) {return (accstuser) this.getCurrentSession (). Load (accstuser.class, id); } @Override public accstuser get (string id) {return (accstuser) this.getCurrentSession (). Get (accstuser.class, id); } @Suppresswarnings ("unchecked") @override public list <comtuser> findall () {list <comtuser> accstusers = this.getcurrentsession (). CreateQuery ("from Acctuser"). SetCachable (true) .list (); вернуть актуальные; } @Override public void сохраняется (accstuser entity) {this.getCurrentSession (). Persist (Entity); } @Override public String save (accstuser entity) {return (string) this.getCurrentSession (). Save (Entity); } @Override public void saveorUpdate (accstuser entity) {this.getCurrentSession (). SaveorUpdate (Entity); } @Override public void delete (String id) {accstuser entity = this.load (id); this.getcurrentsession (). Delete (Entity); } @Override public void flush () {this.getCurrentSession (). Flush (); }}7. Создайте сервисный слой
7.1. Интерфейс сервисного уровня
пакет org.andy.work.service; import java.util.list; import org.andy.work.entity.acctuser;/** * Время создания: 2015-2-6 15:18:57 * * * @author andy * @version 2.2 * userservice interface */public userservice {AcctUser Load (строка ID); Accstuser get (String id); Список <Cactuser> findall (); пустота сохраняется (Accstuser Entity); String Save (Accstuser Entity); void saveorUpdate (Accstuser Entity); void delete (String Id); void flush ();}7.2 Класс реализации сервисного уровня
Userserviceimpl должен вводить вклад DAO Layer Bean, определенный выше.
пакет org.andy.work.service.impl; import java.util.list; import org.andy.work.dao.userdao; import org.andy.work.entity.acctuser; import org.andy.work.service.userservice; импорт org.spramework.beans.factory.Annotation.Autwore org.springframework.stereotype.service;/** * Время создания: 2015-2-6 3:24:16 * * * @author andy * @version 2,2 Реализация пользовательского обслуживания */ @service ("userservice") public class userserviceimpl userservice {@auutowired private userdao userdao; @Override public accstuser load (string id) {return userdao.load (id); } @Override public accstuser get (string id) {return userdao.get (id); } @Override public list <cpactuser> findall () {return userdao.findall (); } @Override public void repist (accstuser entity) {userdao.persist (entity); } @Override public String save (accstuser entity) {return userdao.save (entity); } @Override public void saveorUpdate (accstuser entity) {userdao.saveorupdate (entity); } @Override public void delete (String Id) {userDao.delete (id); } @Override public void flush () {userDao.flush (); }}8. Проверьте интеграцию Spring и Hibernate
Мы можем написать тестовый класс в SRC/Test/Java, чтобы проверить вышеуказанную конфигурацию. Если тест успешно, он будет завершен.
пакет org.andy.work.service; import java.util.date; import java.util.list; импорт java.util.uuid; import org.andy.work.entity.acctuser; импорт org.apache.log4j.logger; импорт org.junit.test; импорт org.junit.runner. org.springframework.beans.factory.annotation.autowired; import org.springframework.test.context.contextConfiguration; импорт org.springframework.test.context.junit4.springjunit4classrunner; импорт com.alibaba.json.json;/** ** CREATION: 2015--2-12-13-2-16-2-16-2-16-13-13-13-13-13-13-13-111 pm * * @author andy * @version 2.2 */ @runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classpath: spring.xml", "classpath: spring-hibernate.xml"}) public classerservice {private static final logger gurgerger. @Autowired private userservice userservice; @Test public void said () {accstuser accstuser = new accstuser (); accstuser.setid (uuid.randomuuid (). ToString ()); accstuser.setnickname ("andy"); accstuser.setregistertime (new Date ()); accstuser.settelephone ("1302222211111"); String id = userservice.save (accstuser); 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.spramework.org/schema/mvc" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://wwww.springframe. xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.spramework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.spramework.org/schema/mvc/spring-mv.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.shemaS. Scan @controller Insection As Bean-> <Контекст: Component Scan Base-package = "org.andy.work.controller" /> <!-Следующая конфигурация Springmvc-> <MVC: Annotation-inference> <!-Верно name = "Поддержка MediaTypes"> <sist> <datter> text/html; charset = utf-8 </value> <datter> application/json; charset = utf-8 </value> </list> </property> </bean> </mvc: converterts converters> </mvc: annotation dravely> <! Имя-> <Bean> <name = name = "viewClass" value = "org.springframework.web.servlet.view.jstlview"/> <name = "prefix" value = "/web-inf/views"/> <name = "uffix" value = ". JSP"/> </bean> </beans>
Контроллер сканирования пакетов, [по электронной почте защищена] ��, и конфигурации уровня просмотра настроены выше.
10. Настройка контейнера web.xml
Веб -контейнеры - это мозг веб -проектов, поэтому веб -контейнеры сначала должны вводить Spring, пусть Spring управляйте различными рамками и внедрить их в бобы. Затем настройте информацию о фильтре элемента управляющего уровня. И URL, перехваченный SpringMVC, настроен на запросы, заканчивающиеся .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/ns/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" version = "2,5"> <Slace-Name> springmvc_demo </ismaMo </ismaMo </ismaMo </ismaMo </ismaMo> <Stemb_demo </ismaMo </vise-par <param-name> contextconfiglocation </param-name> <param-value> classpath: spring.xml, classpath: spring-hibernate.xml </param-value> </context-param> <filter> <filter-name> encodingfilter </filter-name> <filter-class> org.springframework.web.filter.characterencodingfilter </filter-class> <init-param> <param-name> кодирование </param-name> <value> utf-8 </param-vale> </init-param> <init-param> <param-name> forceencoding </param-name> paramue> paramue> paramue> paramue </paramue> </iname> </iname> </iname> </iname> </iname> </iname> </iname> </iname> </iname> </iname> </in-vame> </init-param> </filter> <Filter-Mapping> <Filter-name> encodingFilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-opensessioninview configuration-это задержка сеанса, закрывающегося на Layer-> <Filter> <Filter-name> opensevessessionInVeseSessionInVeseSeviewin. <filter-class> org.springframework.orm.hibernate4.support.opensessionInviewFilter </filter-class> <init-param> <param-name> singleSession </param-name> </param-value> true </param-value> </init-param> </filter> <!-Прослушивание Servletcontextextextextectore> </init-param> </filter> <! <lloader-class> org.springframework.web.context.contextloaderListener </stirlicer> </sluster> <!-Слушатель> <LEARSER-CLASS> org.springframework.web.context.contextloaderlister </sluster-class> </sluster> <! <lloader-class> org.springframework.web.util.introspectorCleanuplistener </stirlicer-class> </sluster> <servlet> <socrible> Spring Mvc Servlet </description> <servlet-name> rest </servlet-mame> <servlet-class> org.spramework. <param-name>contextConfigLocation</param-name> <!-- Here is the SpringMVC configuration file --> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>rest</servlet-name> <Url-pattern>*. HTMLS </url-pattern> </servlet-mapping> <filter-mapping> <filter-name> opensessionInviewfilter </filter-name> <url-pattern>*. HTMLS </url-pattern> </filter-картирование> <!-Конфигурация времени сеанса,> <session-configer> </filter> <!-Сессионное время <! </session-config> <belcelping-file-list> <selcload-file>/index.jsp </wervedied-file> </werving-file-list> </web-app>
11. Создать контроллер управляющего слоя
Контрольный слой usercontroller
пакет org.andy.work.controller; import java.util.list; import org.andy.work.entity.acctuser; import org.andy.work.service.userservice; import org.apache.log4j.logger; импорт org.spramework.beans.annotation.annotation.autowired; org.springframework.stereotype.controller; import org.springframework.ui.modelmap; import org.springframework.web.bind.annotation.pathvariable; импорт org.springframework.web.bind.annotation.requestmaping; org.springframework.web.bind.annotation.responsebody;/** * Время создания: 2015-2-7 11:49:00 AM * @author andy * @version 2.2 * Описание: Пользовательский контроллер */ @controller @requestmapping ("/user") public Class usercontroller {private static final logger gorgger = usercasserger (usercass usercass usercasserger (usercass usercasserler {private static goggerger. @Autowired private userservice userservice; @RequestMapping("/showInfo/{userId}") public String showUserInfo(ModelMap modelMap, @PathVariable String userId){ LOGGER.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显示全部用户信息: <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>昵称:" + user.nickName + " 电话:" + user.telephone + " 注册时间:" + 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
希望能帮助有需要的朋友,后续继续补充相关资料,谢谢大家对本站的支持!