1.新しいWebプロジェクトを作成し、LIBディレクトリにJARパッケージを追加します
メインジャーパッケージ:Struts2関連パッケージ、MyBatis3.3関連パッケージ、MySQL-Connector-Java-5.1.22-Bin.jar、GSON-2.1.jar
2。web.xmlを構成し、フィルターstrutSprepareandexecutefilterを追加し、すべての *.ACTIONリクエストを処理します。
<?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> ms </display-name> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutspareandecutefilter </filter-class> </filter> <filter-name> <filter-name> <url-pattern>*。アクション</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> </web-app>
このフィルターのDoFilterソースコードを確認し、次のことを実行します。
1. strutsで除外されたURLが設定されているかどうかを判断します(struts.action.excludepattern、正規表現と一致します)。ある場合、現在のパスがルールを満たしている場合、リクエストはフィルターチェーンの次のオブジェクトに転送され、処理のためにStruts2に引き渡されません。
if(exprodedpatterns!= null && prepare.isurlexcluded(request、expluedpatterns)){chain.dofilter(request、response);}2。actionMappingの検索:prepareoperationsのFindActionMappingメソッドを検索します。見つからない場合、リクエストはフィルターチェーンの次のオブジェクトに転送され、処理のためにStruts2に引き渡されません。アクションマッピングが見つかった場合、実行操作の実行方法が呼び出され、アクションの実行を開始します。次の図は、URLに基づいてアクションマッピングを見つける場合です。
3。struts.xmlファイルを構成します。このデモは、主にJSON形式のデータのフロントエンドへの送信を示し、結果タイプをJSON形式に設定し、もちろん他のものに設定することもできます。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype struts public " - // apacheソフトウェア財団// dtd struts構成name = "default" extends = "struts-default、json-default"> <global-results> <result type = "json"> <param name = "root"> json </param> <param name = "contentType"> html </param> </result> </global-results> <actunter "> </</</</</</</< name = "queryalluser" method = "queryalluser"> <sults>
4. mybatis.xmlとusermapper.xmlを構成します。
cacheenabledをtrueに構成し、レベル2キャッシュを有効にします。
DataSource関連情報の構成:タイプはプールされた接続プールフォームです。PoolMaximumactiveConnectionsには、いつでもデフォルト値が10です。
エンティティクラスマッピングマッパーを構成// <マッパーリソース= "MS/MODEL/USERMAPPER.XML"/>
<?xml version = "1.0" encoding = "utf-8"?> <!doctype構成public " - // mybatis.org//dtd sql map config 3.0 // en" "http://mybatis.org/dtd/dtd/mybatis-3-config.dtd name = "cacheenabled" value = "true" /> < /settings> <環境デフォルト= "開発"> <環境id = "development"> <transactionmanager type = "jdbc" /> <datasource type = "pooled"> <プロパティname = "driver" value = "com.mysql.jdbc.driver" value = "jdbc:mysql:// localhost:3306 /demo" /> <property name = "username" value = "root" /> <property name = "password" value = "admin" /> <プロパティ名= "" poolmaximumactiveconnections "value =" 10 " /> <プロパティ名=" pooppeer PoolpingQuery "/> </dataSource> </environment> </environments> <mappers> <mapper resource =" ms/model/usermapper.xml "/> </mappers> </configuration>
usermapper.xmlを構成し、ehcacheおよび関連パラメーターとしてキャッシュを構成するには、エンティティクラスがシリアル化可能なインターフェイスを実装する必要があることを忘れないでください
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd /> ---> <! - ehcacheキャッシュの使用 - > <キャッシュタイプ= "org.mybatis.caches.ehcache.loggingehcache"> <プロパティ名= "TimetoidLeseconds" value = "3600" /> <! - 1時間の間隔のキャッシュ間の間隔は、作成日までの間隔です。 value = "3600"/> <! - キャッシュが作成されてから1時間、有効期限までのキャッシュへの最後のアクセスの日付までの時間 - > <プロパティ名= "value =" 1000 "/> <プロパティ名=" maxentrieslocaldisk "value =" 10000000 "/> - > <ID = "SaveUser" parametertype = "ms.Model.user">ユーザー(account、name、address)値(#{account}、#{name}、#{address})</select> "queryalluser" resulttype = "ms.model.user" </mapper> 5。キーコード
DAOレイヤー:
まず、SQLSessionFactoryを取得してシングルトンパターンに設計するクラスを作成します。
パッケージms.dao.base; import java.io.ioexception; Import org.apache.ibatis.io.ioresces; import org.apache.ibatis.session.ssession.ssession.ibatis.session.session.SqlsessionFactoryBuilder; import org.log4j.log.loggerger; SQLSessionFactory SessionFactory; private mysessionfactory(){} public static synchronized sqlsessionFactory getSqlSessionFactory(){if(sessionFactory == null){try {sessionFactory = new sqlsessionFactoryBuilder()。 sessionFactoryを返します。 } catch(ioexception e){logger.getLogger(mysessionfactory.class).error( "getSqlSessionFactoryエラー。"); e.printstacktrace(); nullを返します。 }} else {return SessionFactory; }}}次はuserdaoで、Opensessionを通じてSQLSessionを取得します。トランザクションコントロールは、SQLSessionのコミットとロールバックを通じて実行できることに注意してください。もちろん、SQL操作が1つしかない場合、トランザクションコントロールはありません(この例は単なるデモです)。
パッケージms.dao; import java.util.arraylist; import java.util.list; Import org.apache.ibatis.session.squlsession; Import Ms.Dao.base.mysessionFactory; Import Ms.Model.User; mySessionFactory.getSqlSessionFactory()。opensession(); try {stringステートメント= "usermapper.saveuser"; session.insert(ステートメント、ユーザー); session.commit(true); } catch(例外e){session.rollback(true); e.printstacktrace();新しい例外をスローします(「メソッドの追加のエラー」); }最後に{session.close(); }} public list <user> queryalluser()throws exception {sqlsession session = mysessionfactory.getsqlsessionfactory()。opensession();リスト<ユーザー>ユーザー= new arrayList <user>(); try {stringステートメント= "usermapper.queryalluser"; users = session.selectlist(statement、1); session.commit(true); } catch(例外e){session.rollback(true); e.printstacktrace();新しい例外をスロー( "queryalluserメソッドのエラー"); }最後に{session.close(); }ユーザーを返します。 }}サービスレイヤー:
モデル:いいえ
アクションレイヤー:
JSON形式のデータに変換し、フロントエンドに返します。
パッケージms.action; import java.io.printwriter; import java.util.list; import javax.servlet.httpservletrequest; import javax.servlet.http.httpservletResponse; Import ms.model.user; import ms.Serervice.userervice.uservice.uservice.uservice.uservice.uservice.userservice.uservice.uservice.userservice. org.apache.struts2.servletactionContext;インポートcom.google.gson.gson; public class useraction {logger logger = ogger.getLogger(useraction.class); private userservice userservice = new userservice(); 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; 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(); }}}フロントエンドコード:
<%@ 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>6。テスト効果:
struts2は正常に実行されます。
セカンダリキャッシュがOKであるかどうかをテストし、すべてのユーザーをクエリします。
最初のクエリ:キャッシュが欠落し、データベースにアクセスします:
2番目と次の複数のクエリ、キャッシュヒット、データベースアクセスなし:
@author風のようなコーダー
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。