料理の学習:Spring 3 MVC + Spring Security + Hibernate

こんにちは 私の名前はアントン・シャスニーです。



これは、Java Webアプリケーション開発に関する次の記事です。 SpringフレームワークとHibernateライブラリを使用して記述された小さな顧客会計システムを作成することをお勧めします。



アプリケーションの内容:



データベースへの新しいエントリの追加、既存のエントリの表示、不要なエントリの削除を可能にする簡単な連絡先マネージャがあります。 情報はデータベースに保存されます。 アプリケーションへのアクセスはWebを介して行われ、ユーザーの認証と承認が必要です。



使用するもの:





インフラ





Spring MVCについての以前の記事では、Javaコードでアノテーションを使用し、Mavenを使用してプロジェクトをビルドする際にいくつかの点を見落としていました。 この記事では、省略を修正しようとしました。



この記事の目的は、初期のWeb開発者にJavaプラットフォームのさまざまなテクノロジーの共同使用を示すことです。





内容



  1. IDEで新しいプロジェクトを作成します。
  2. パッケージ構造の作成。
  3. ドメインモデルへのエンティティクラスの追加。
  4. データアクセス層。
  5. サービス層。
  6. Webを追加します。
  7. コントローラー
  8. 表示。
  9. アプリケーションの起動。
  10. 安全性
  11. おわりに




開発中のアプリケーションのアーキテクチャ。

開発中のアプリケーションのアーキテクチャ。



1. IDEで新しいプロジェクトを作成する





Eclipse IDEに基づいた便利なエディターであるSpringSource Tool Suite (STS)でプロジェクトを開発します。



STSをインストールした後、テンプレートプロジェクトを作成します。

「ファイル」>「新規」>「Springテンプレートプロジェクト」>「Spring MVCプロジェクト」。



プロジェクト名: ContactManager

最上位パッケージ: net.schastny.contactmanager



STS



エディターは、次の構造を持つ基本設定を持つテンプレートWebプロジェクトを作成します。

src / main / java アプリケーションのJavaクラス。
src / main /リソース 作業に必要な他のすべてのファイル(リソース):たとえば、 log4j.xmlロガー設定ファイル、 META-INFフォルダー。
src / test / java JUnitテスト用のフォルダー。
src / test / resources 単体テストリソースフォルダー。
src / main / webapp 連絡先マネージャーのWebコンポーネントのファイルがあるフォルダー:アプリケーションweb.xmlのデプロイメント記述子、Springフレームワークの設定を含むxml-files、jsp-page。

注意、静的アプリケーションリソース:写真、CSS、JSスクリプトはリソースフォルダーにあります。
pom.xml Mavenのプロジェクト設定ファイルには、プロジェクトの名前とサードパーティライブラリからのプロジェクトの依存関係のリストが含まれています。




プロジェクト設定(pom.xml)で、Springバージョンを3.0.4.RELEASEから3.0.5.RELEASE変更します。



注:IDE以外でMavenプロジェクトを作成する方法については、 こちらをお読みください



2.パッケージ構造の作成



net.schastny.contactmanager.dao データアクセス層。

その中に、データアクセスオブジェクト-データアクセスオブジェクトを配置します。
net.schastny.contactmanager.domain ドメイン層。

これは、システムのエンティティオブジェクトを記述するPOJOクラスが存在する場所です。 私たちの場合、これはContactクラスです。
net.schastny.contactmanager.service サービス層アプリケーション。

アプリケーションの機能を説明するインターフェースが含まれています。 これらのインターフェイスの1つ以上の実用的な実装も含まれています。
net.schastny.contactmanager.web Web層アプリケーション。

以下は、ユーザーがWeb経由でシステムと対話する方法を記述するコントローラークラスです。


注:エディターによって作成されたコントローラークラスは削除できます。



3.ドメインモデルへのエンティティクラスの追加



package net.schastny.contactmanager.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "CONTACTS") public class Contact { @Id @Column(name = "ID") @GeneratedValue private Integer id; @Column(name = "FIRSTNAME") private String firstname; @Column(name = "LASTNAME") private String lastname; @Column(name = "EMAIL") private String email; @Column(name = "TELEPHONE") private String telephone; // Getters and setters }
      
      





Beanプロパティのgetterおよびsetterメソッドを忘れずに追加してください。



プロジェクトの依存関係をpom.xmlファイルに追加します。 ドメインモデルのクラスは、SpringまたはHibernateに依存しないことに注意してください。

  <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency>
      
      





使用されている注釈の説明。

@Entity



クラスは、長期間保存する必要があるオブジェクトを表します。
@Table(name = "CONTACTS")



クラスプロパティは、CONTACTSテーブルに保存されます。
@Column(name = "FIRSTNAME")



このプロパティは、firstname列に保存されます。
@Id



このフィールドはオブジェクトに対して一意です。つまり、そのフィールドでオブジェクトを検索します。
@GeneratedValue



このフィールドの値は当社によって割り当てられませんが、自動的に生成されます。




4.データアクセス層



データアクセスオブジェクトのインターフェイスと実用的な実装。

 package net.schastny.contactmanager.dao; import java.util.List; import net.schastny.contactmanager.domain.Contact; public interface ContactDAO { public void addContact(Contact contact); public List<Contact> listContact(); public void removeContact(Integer id); }
      
      





 package net.schastny.contactmanager.dao; import java.util.List; import net.schastny.contactmanager.domain.Contact; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class ContactDAOImpl implements ContactDAO { @Autowired private SessionFactory sessionFactory; public void addContact(Contact contact) { sessionFactory.getCurrentSession().save(contact); } @SuppressWarnings("unchecked") public List<Contact> listContact() { return sessionFactory.getCurrentSession().createQuery("from Contact") .list(); } public void removeContact(Integer id) { Contact contact = (Contact) sessionFactory.getCurrentSession().load( Contact.class, id); if (null != contact) { sessionFactory.getCurrentSession().delete(contact); } } }
      
      





pom.xmlファイルでプロジェクトの依存関係を更新します。 Hibernateを追加します。

  <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.3.2.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.3.1.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-commons-annotations</artifactId> <version>3.3.0.ga</version> </dependency>
      
      





使用されている注釈の説明。

@Repository



概要は、クラスがリポジトリとして機能し、透過的な例外変換が必要であることを示しています。 例外変換の利点は、DAOレイヤーで使用されるデータアクセステクノロジに関係なく、サービスレイヤーがSpring例外の一般的な階層(DataAccessException)を処理することです。
@Autowired



注釈を使用すると、SessionFactoryフィールドの値を自動的に設定できます。




5.サービス層



システムとのユーザーインタラクションのインターフェイスについて説明します。

 package net.schastny.contactmanager.service; import java.util.List; import net.schastny.contactmanager.domain.Contact; public interface ContactService { public void addContact(Contact contact); public List<Contact> listContact(); public void removeContact(Integer id); }
      
      





サービスインターフェイスの実用的な実装は、ContactServiceImpl.javaクラスです。

 package net.schastny.contactmanager.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import net.schastny.contactmanager.dao.ContactDAO; import net.schastny.contactmanager.domain.Contact; @Service public class ContactServiceImpl implements ContactService { @Autowired private ContactDAO contactDAO; @Transactional public void addContact(Contact contact) { contactDAO.addContact(contact); } @Transactional public List<Contact> listContact() { return contactDAO.listContact(); } @Transactional public void removeContact(Integer id) { contactDAO.removeContact(id); } }
      
      





pom.xmlファイルでプロジェクトの依存関係を更新します。 トランザクションサポートを追加します。

  <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework-version}</version> </dependency>
      
      





使用されている注釈の説明。

@サービス この注釈を使用して、このクラスがサービス(サービス層のコンポーネント)を表すことを宣言します。 サービスは@Componentクラスのサブタイプです。 このアノテーションを使用すると、Beanサービスを自動的に検索できます(root-context.xmlの詳細を参照)。
@Transactional この注釈でマークされたメソッドが実行される前に、トランザクションが開始され、メソッドが実行された後、トランザクションがコミットされ、RuntimeExceptionがスローされると、ロールバックされます。




6. Webを追加する



最も重要なことであるxmlファイルの暗闇を使用して、Webアプリケーションのカスタマイズを開始します。 大規模なアプリケーションでは、さまざまなファイルにさまざまな設定を保存すると非常に便利です。



xml-footclothsの後、単純なコントローラーを作成します。



以下のリンクで設定ファイルを見つけることができます。

web.xml これは展開記述子です。 サーバー上のアプリケーション展開設定を記述するファイル。
spring / root-context.xml ルートコンテキスト 。 アプリケーション全体のコンテキスト。 ここで説明するBeanは、すべてのサーブレットとフィルターで使用できます。 ここでは、セキュリティとデータアクセスのビンについても説明する必要があります(この構成では、それらは別々のファイルに取り出されます)。
spring / data.xml データを操作するためのリソース設定を含むファイル。
spring / security.xml セキュリティ設定付きのファイル。
spring / appServlet / servlet-context.xml DispatcherServletコンテキスト 。 1つのサーブレットと、このサーブレットでのみ使用可能なBeanの設定を定義します。
spring / appServlet / controllers.xml このサーブレットのコントローラー設定を含むファイル。




spring / security.xml

 <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> </beans:beans>
      
      







使用済みBeanの説明。

messageSource アプリケーションの国際化を提供するBean。 以下では、ロシア語と英語のローカライズされたメッセージを含むmessages_en.propertiesおよびmessages_ru.propertiesファイルを作成します
propertyConfigurer データベース設定jdbc.propertiesでファイルをダウンロードするには。
dataSource データベースへの接続に使用されるデータソース 。 jdbcドライバークラス、ユーザー名、パスワード、およびその他の設定を提供します。
sessionFactory これはHibernate構成Beanです。 hibernate.cfg.xmlファイルには、エンティティクラスのマッピングが含まれます。
transactionManager トランザクションマネージャ設定Bean 。 トランザクションマネージャーを使用して、アプリケーションのトランザクションを管理します。


ファイル:

/src/main/resources/messages_en.properties

/src/main/resources/messages_ru.properties

/src/main/resources/hibernate.cfg.xml

WEB-INF / jdbc.properties



7.コントローラー



 package net.schastny.contactmanager.web; import java.util.Map; import net.schastny.contactmanager.domain.Contact; import net.schastny.contactmanager.service.ContactService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class ContactController { @Autowired private ContactService contactService; @RequestMapping("/index") public String listContacts(Map<String, Object> map) { map.put("contact", new Contact()); map.put("contactList", contactService.listContact()); return "contact"; } @RequestMapping("/") public String home() { return "redirect:/index"; } @RequestMapping(value = "/add", method = RequestMethod.POST) public String addContact(@ModelAttribute("contact") Contact contact, BindingResult result) { contactService.addContact(contact); return "redirect:/index"; } @RequestMapping("/delete/{contactId}") public String deleteContact(@PathVariable("contactId") Integer contactId) { contactService.removeContact(contactId); return "redirect:/index"; } }
      
      





使用されている注釈の説明。

@Controller 注釈は、Javaクラスをコントローラークラスに魔法のように変換するために使用されます。

このクラスは、 通常のサーブレット(HttpServlet) (HttpServletRequestおよびHttpServletResponseオブジェクトを使用)と同様のコンポーネントですが、MVCアプリケーションで使用するための高度な機能を備えています。
@RequestMapping 注釈は、リクエストのURLを指定されたメソッドまたはクラスにマップするために使用されます。 クエリは、クラスメソッドまたはクラス全体のいずれかにマップできます。 処理される特定のHTTPメソッド(GET / POST)を指定し、要求パラメーターを渡すことができます。
@ModelAttribute メソッドパラメータまたはメソッドの戻り値を、jspページを表示するときに使用されるモデルの属性に関連付ける注釈。
@PathVariable メソッドパラメータをURLの変数に関連付ける必要があることを示す注釈。




8.ビュー



/src/main/webapp/WEB-INF/views/contact.jsp



9.アプリケーションの起動



システムを起動する前に、さらに2つのことを行う必要があります。



最初に、 jdbc.propertiesファイルの設定に従って、アプリケーションのデータベースとそのユーザーを作成します。

 CREATE USER contactmanager@localhost identified BY '1234'; GRANT usage ON *.* TO contactmanager@localhost identified BY '1234'; CREATE DATABASE IF NOT EXISTS contactmanager; GRANT ALL privileges ON contactmanager.* TO contactmanager@localhost; USE contactmanager; CREATE TABLE CONTACTS ( id INT PRIMARY KEY AUTO_INCREMENT, firstname VARCHAR(30), lastname VARCHAR(30), telephone VARCHAR(15), email VARCHAR(30), created TIMESTAMP DEFAULT NOW() );
      
      





次に、 pom.xmlの依存関係を更新します。

  <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency>
      
      





サーバーでアプリケーションを実行します: ContactManager> Run As> Run on Server> SpringSource tc Server Developer Edition v2.0







ブラウザでhttp:// localhost:8080 / ContactManagerアドレスを開きます。







注:データベースのエンコード、データベースのテーブル、データベース接続、エディターでのプロジェクトのエンコードを確認してください。ネイティブのキリル文字の代わりに、ブラウザーが割れているように見える場合があります。



Hibernateの動作をデバッグするには、次の行をsrc / main / resources / log4j.xmlファイルに追加できます。

  <!--org.hibernate.SQL logger--> <logger name="org.hibernate"> <level value="info"/> </logger>
      
      





10.セキュリティ



pom.xmlファイルでプロジェクトの依存関係を更新します。 Spring Securityモジュールを追加します。

  <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>${org.springframework-version}</version> </dependency>
      
      







アプリケーション全体で機能するセキュリティフィルターをweb.xmlに追加します。

  <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
      
      







セキュリティ上の理由から、ログインページはWEB-INFフォルダー内に配置しないでください 。そのため、Webアプリケーションのルート(webappフォルダー)に配置します。

webapp / login.jsp



エラーページ403もそこに配置します: webapp / error403.jsp



security.xmlファイルを編集しましょう。

security.xml



security.xmlファイルで行われた設定の説明



アプリケーションには3つのユーザーグループ(ユーザーロール)があります。



アプリケーションへのアクセスを区別します。





ユーザーデータの保存場所



それらが少ない場合は、構成ファイルで直接可能です。 データベースでは可能ですが、LDAPストレージでは可能です。



データベースを使用してパスワードを保存する場合のエントリの例( security.xml )。

  <authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" /> </authentication-provider> </authentication-manager>
      
      







いくつかの要素の説明。

 <remember-me />
      
      



マルチセッションのサポート。 ブラウザを再起動した後、再度ログインする必要はありません。
 <anonymous username="guest" granted-authority="ROLE_ANONYMOUS" />
      
      



匿名ユーザーを定義し、彼にロールを付与して、アプリケーションの通常のユーザーと同じように彼と一緒に作業できるようにします。
 <password-encoder hash="md5" />
      
      



暗号化された形式のパスワードストレージ。

私たちのアプリケーションでは使用されていません。




11.結論



以上です! デザイン、jQueryのささいなこと( 初心者向けの記事 )を固定し、クラフトをお金で販売することは残っています。 しかし、これ、私の親愛なる読者は、まったく異なる話です。



すべての操作を実行した後、次のプロジェクト構造を取得する必要があります。

画像



記事のこれらのエラーと不正確さに感謝します。



使用されるリソース:



1. Spring Recipes:A Problem-Solution Approach、Second Edition、Gary Mak、Ken Sipe、Josh Long、Daniel Rubio。

2. EclipseMavenを使用してSpring 3 MVC Hibernate 3の例を作成します

3. Spring Frameworkリファレンスドキュメント、

4. Keith DonaldによるMastering Spring MVC 3



完成したプロジェクトはこちらから、プロジェクトのデータベースはこちらからダウンロードできます。



All Articles