Chaining View Resolver vs UrlBasedViewResolver with tils
以下のようにセットすると
spring mvcではControllerのmethodのreturn値がjsp名になる
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="jstlViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean>
tilesを利用する場合は
UrlBasedViewResolverを使う
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" id="tilesViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> </bean> <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" id="tilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/layouts/layouts.xml</value> <value>/WEB-INF/views/**/views.xml</value> </list> </property> </bean> views.xmlは以下のように <definition extends="default" name="index"> <put-attribute name="body" value="/WEB-INF/views/index.jspx"/> </definition>
この場合はviews.xmlのnameがmappingされる
しかし tilesを利用するといちいちviews.xmlのnameに定義することが手間なので
以下のような設定で省略できる
<definition name="*/*" extends="default"> <put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" /> </definition>
org.springframework.jdbc.support
springは各種のRuntimeExceptionを提供している。
非標準SQLをマッピングする為に、spring.jdbcではそのSQLエラーコードをxmlに定義している。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <!-- - Default SQL error codes for well-known databases. - Can be overridden by definitions in a "sql-error-codes.xml" file - in the root of the class path. - - If the Database Product Name contains characters that are invalid - to use in the id attribute (like a space) then we need to add a property - named "databaseProductName"/"databaseProductNames" that holds this value. - If this property is present, then it will be used instead of the id for - looking up the error codes based on the current database. --> <beans> <bean id="DB2" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="databaseProductName"> <value>DB2*</value> </property> <property name="badSqlGrammarCodes"> <value>-007,-029,-097,-104,-109,-115,-128,-199,-204,-206,-301,-408,-441,-491</value> </property> <property name="duplicateKeyCodes"> <value>-803</value> </property> <property name="dataIntegrityViolationCodes"> <value>-407,-530,-531,-532,-543,-544,-545,-603,-667</value> </property> <property name="dataAccessResourceFailureCodes"> <value>-904,-971</value> </property> <property name="transientDataAccessResourceCodes"> <value>-1035,-1218,-30080,-30081</value> </property> <property name="deadlockLoserCodes"> <value>-911,-913</value> </property> </bean> <bean id="Derby" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="databaseProductName"> <value>Apache Derby</value> </property> <property name="useSqlStateForTranslation"> <value>true</value> </property> <property name="badSqlGrammarCodes"> <value>42802,42821,42X01,42X02,42X03,42X04,42X05,42X06,42X07,42X08</value> </property> <property name="duplicateKeyCodes"> <value>23505</value> </property> <property name="dataIntegrityViolationCodes"> <value>22001,22005,23502,23503,23513,X0Y32</value> </property> <property name="dataAccessResourceFailureCodes"> <value>04501,08004,42Y07</value> </property> <property name="cannotAcquireLockCodes"> <value>40XL1</value> </property> <property name="deadlockLoserCodes"> <value>40001</value> </property> </bean> <bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="badSqlGrammarCodes"> <value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value> </property> <property name="duplicateKeyCodes"> <value>23001</value> </property> <property name="dataIntegrityViolationCodes"> <value>22003,22012,22025,23000</value> </property> <property name="dataAccessResourceFailureCodes"> <value>90046,90100,90117,90121,90126</value> </property> <property name="cannotAcquireLockCodes"> <value>50200</value> </property> </bean> <bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="databaseProductName"> <value>HSQL Database Engine</value> </property> <property name="badSqlGrammarCodes"> <value>-22,-28</value> </property> <property name="duplicateKeyCodes"> <value>-104</value> </property> <property name="dataIntegrityViolationCodes"> <value>-9</value> </property> <property name="dataAccessResourceFailureCodes"> <value>-80</value> </property> </bean> <bean id="Informix" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="databaseProductName"> <value>Informix Dynamic Server</value> </property> <property name="badSqlGrammarCodes"> <value>-201,-217,-696</value> </property> <property name="duplicateKeyCodes"> <value>-239,-268,-6017</value> </property> <property name="dataIntegrityViolationCodes"> <value>-692,-11030</value> </property> </bean> <bean id="MS-SQL" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="databaseProductName"> <value>Microsoft SQL Server</value> </property> <property name="badSqlGrammarCodes"> <value>156,170,207,208</value> </property> <property name="permissionDeniedCodes"> <value>229</value> </property> <property name="duplicateKeyCodes"> <value>2601,2627</value> </property> <property name="dataIntegrityViolationCodes"> <value>544,8114,8115</value> </property> <property name="dataAccessResourceFailureCodes"> <value>4060</value> </property> <property name="cannotAcquireLockCodes"> <value>1222</value> </property> <property name="deadlockLoserCodes"> <value>1205</value> </property> </bean> <bean id="MySQL" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="badSqlGrammarCodes"> <value>1054,1064,1146</value> </property> <property name="duplicateKeyCodes"> <value>1062</value> </property> <property name="dataIntegrityViolationCodes"> <value>630,839,840,893,1169,1215,1216,1217,1451,1452,1557</value> </property> <property name="dataAccessResourceFailureCodes"> <value>1</value> </property> <property name="cannotAcquireLockCodes"> <value>1205</value> </property> <property name="deadlockLoserCodes"> <value>1213</value> </property> </bean> <bean id="Oracle" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="badSqlGrammarCodes"> <value>900,903,904,917,936,942,17006</value> </property> <property name="invalidResultSetAccessCodes"> <value>17003</value> </property> <property name="duplicateKeyCodes"> <value>1</value> </property> <property name="dataIntegrityViolationCodes"> <value>1400,1722,2291,2292</value> </property> <property name="dataAccessResourceFailureCodes"> <value>17002,17447</value> </property> <property name="cannotAcquireLockCodes"> <value>54</value> </property> <property name="cannotSerializeTransactionCodes"> <value>8177</value> </property> <property name="deadlockLoserCodes"> <value>60</value> </property> </bean> <bean id="PostgreSQL" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="useSqlStateForTranslation"> <value>true</value> </property> <property name="badSqlGrammarCodes"> <value>03000,42000,42601,42602,42622,42804,42P01</value> </property> <property name="duplicateKeyCodes"> <value>23505</value> </property> <property name="dataIntegrityViolationCodes"> <value>23000,23502,23503,23514</value> </property> <property name="dataAccessResourceFailureCodes"> <value>53000,53100,53200,53300</value> </property> <property name="cannotAcquireLockCodes"> <value>55P03</value> </property> <property name="cannotSerializeTransactionCodes"> <value>40001</value> </property> <property name="deadlockLoserCodes"> <value>40P01</value> </property> </bean> <bean id="Sybase" class="org.springframework.jdbc.support.SQLErrorCodes"> <property name="databaseProductNames"> <list> <value>Sybase SQL Server</value> <value>SQL Server</value> <value>Adaptive Server Enterprise</value> <value>ASE</value> <!-- name as returned by jTDS driver --> <value>sql server</value> <!-- name as returned by jTDS driver --> </list> </property> <property name="badSqlGrammarCodes"> <value>101,102,103,104,105,106,107,108,109,110,111,112,113,116,120,121,123,207,208,213,257,512</value> </property> <property name="duplicateKeyCodes"> <value>2601</value> </property> <property name="dataIntegrityViolationCodes"> <value>233,423,511,515,530,547,2615,2714</value> </property> <property name="transientDataAccessResourceCodes"> <value>921,1105</value> </property> <property name="deadlockLoserCodes"> <value>1205</value> </property> </bean> </beans>
例外転換(exception transition)
例外転換:意味は確かな例外に転換して投げる
catch(SQLException e) { if (e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) throw DuplicateUserIdException(); else throw e; }
checked exception & unchecked exception
JavaのExceptionには二つの種類がある
unchecked exception
- RuntimeExceptionを承継したexceptionクラス
checked exception
- checked exception以外のexceptionクラス
◯例外を回避するときは必ず意図がはっきりしなか行けない。
toby's spring3
韓国の有名な開発者が書いた世界初めてのspring3本を読んでいる。
タイトルはspring3だが、本当はdesign patternとjava basicを予め考える機会を上げる本だよな。
ページは全部1400に至る。技術本とはいえ、なかなかの分量だが、久しぶりに面白く読んでいる
statelessな部分はmulti threadで使用してもいい
refactoringをする際に注意することは
refactoringの対象がstatelessかstatefulなのかを判断して、refactoringを行うこと。