Java開発フレームワーク構築:プロファイル


仕事をして善いことをしようとすると,必ず先にその器を利する.Java開発の最も難しい部分は、初期フレームワークの構築であることを知っています.この文書では、多くのJavaプロジェクトの開発を満たすために使用可能なJava開発フレームワークの構築プロセスを記録します.
本プロジェクトはMaven管理Jarパッケージを採用し、主な技術は以下の通りである.
  • MVCフレームワーク:SpringMVC
  • データベース:MySql
  • ORMフレームワーク:Mybatis
  • ログコンポーネント:Log 4 j 2
  • テンプレートエンジン:FreeMarker
  • JSライブラリ:jQuery-1.9
  • 他のテクノロジーは、プロジェクトの変化に伴って削除されます.
    一、pom.xml
    以下pom.xmlで依存するjarパッケージ:
    <dependency>
    	<groupId>junit</groupId>
    	<artifactId>junit</artifactId>
    	<version>4.1</version>
    	<scope>test</scope>
    </dependency>
    
    <!-- servlet   -->
    <dependency>
    	<groupId>javax.servlet</groupId>
    	<artifactId>javax.servlet-api</artifactId>
    	<version>3.1.0</version>
    </dependency>
    
    <dependency>
    	<groupId>javaee</groupId>
    	<artifactId>javaee-api</artifactId>
    	<version>5</version>
    	<scope>provided</scope>
    </dependency>
    
    <!-- spring jar  -->
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-web</artifactId>
    	<version>4.0.5.RELEASE</version>
    </dependency>
    
    <!-- spring-context-support      : java.lang.ClassNotFoundException:org.springframework.ui.freemarker.FreeMarkerConfigurationFactory -->
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context-support</artifactId>
    	<version>4.0.5.RELEASE</version>
    </dependency>
    
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-jdbc</artifactId>
    	<version>4.0.5.RELEASE</version>
    </dependency>
    
    <!-- springmvc jar  -->
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-webmvc</artifactId>
    	<version>4.0.5.RELEASE</version>
    </dependency>
    
    <!-- freemarker   -->
    <dependency>
    	<groupId>org.freemarker</groupId>
    	<artifactId>freemarker</artifactId>
    	<version>2.3.21</version>
    </dependency>
    
    <!--       -->
    <dependency>
    	<groupId>commons-dbcp</groupId>
    	<artifactId>commons-dbcp</artifactId>
    	<version>1.4</version>
    </dependency>
    
    <!-- Mybatis   -->
    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis</artifactId>
    	<version>3.3.0</version>
    </dependency>
    
    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis-spring</artifactId>
    	<version>1.2.3</version>
    </dependency>
    
    <!-- JSON -->
    <dependency>
    	<groupId>com.alibaba</groupId>
    	<artifactId>fastjson</artifactId>
    	<version>1.2.0</version>
    </dependency>
    
    <!--     -->
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-lang3</artifactId>
    	<version>3.3.2</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-lang3</artifactId>
    	<version>3.3.2</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-lang3</artifactId>
    	<version>3.3.2</version>
    </dependency>
    
    <!--    -->
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-core</artifactId>
    	<version>2.1</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-core</artifactId>
    	<version>2.1</version>
    	<classifier>sources</classifier>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-api</artifactId>
    	<version>2.1</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-api</artifactId>
    	<version>2.1</version>
    	<classifier>sources</classifier>
    </dependency>

    二、webを配置する.xml
    最も簡単なWebプロジェクトであれば、Web.xmlは必須ではないが、サービスを提供できるwebプロジェクトとして、web.xmlは非常に重要な役割を果たしています.Webでxmlでは、主にリソースファイルの場所、Springリスナー、文字符号化フィルタ、SpringMVCブロックのすべてのリクエストのservlet構成を構成します.また、web.xmlはまた、プロジェクトのウェルカムページ、プロジェクトに異常が発生した場合のジャンプページ、セッションの期限切れなどを構成することもできます.
    以下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/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"
    	version="2.5">
    	<display-name>        </display-name>
      	<!-- 
    		1:        ,     WEB-INF,      applicationContext.xml
    		
    		Q.	web.xml classpath: classpath*:       ?
    		A. 	classpath:     class        ;   
    			classpath*:    class  ,   jar   (class  )    .
    		
    		Q.	            ,     ?
    		A.  src   ,   web.xml     :  
    			<context-param>  
    				<param-name>contextConfigLocation</param-name>  
    				<param-value>classpath:applicationContext.xml</param-value>  
    			< /context-param>
    			
    			WEB-INF   ,   web.xml     :  
    			<context-param>  
    				<param-name>contextConfigLocation</param-name>  
    				<param-value>WEB-INF/applicationContext*.xml</param-value>  
    			< /context-param>
    		
    		Q.	          ?
    		A.	<context-param>   
    				<param-name>contextConfigLocation</param-name>   
    				<param-value>   
    					classpath*:conf/applicationContext_core*.xml,   
    					classpath*:conf/applicationContext_bean*.xml,   
    					classpath*:conf/applicationContext_jdbc*.xml,   
    					classpath*:conf/applicationContext_log*.xml   
    				</param-value>   
    			</context-param>
    	-->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    	        classpath*:*config/*.xml
    	    </param-value>
    	</context-param>
    	
    	<!-- 
    		2:        
    		
    		ContextLoaderListener     ,         applicationContext.xml(    ,   ,  )     
    	 -->
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    	<!-- 
    		3:       ,        
    		
    		        ,                。   SpringMVC ,   ajax  ,         。
    		          ,   tomcat server.xml    <Connector URIEncoding="UTF-8" ...>,         。
    		  ,        url       ,   get  ,      url  ,         。 post   ,
    		          ,                 ,         。
    		
    		   firefox   ,post            :content-type = application/x-www-form-urlencoded; charset=UTF-8
    		  firefox SpringMVC       ,      ;
    		    chrome   ,               :content-type = application/x-www-form-urlencoded ,
    		 SpringMVC       ISO-8859-1    ,      
    		
    		    :
    		a.	       :@RequestMapping(value = "saveUserByJson", produces = { "text/json;charset=UTF-8" })
    		b.	    ,     ,        ,spring    CharacterEncodingFilter
    	-->
    	<filter>
    		<filter-name>forceEncoding</filter-name>
    		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    		<init-param>
    			<param-name>forceEncoding</param-name>
    			<param-value>true</param-value>
    		</init-param>
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>utf-8</param-value>
    		</init-param>
    	</filter>
    
    	<filter-mapping>
    		<filter-name>forceEncoding</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- 
    		4:        
    		
    		DispatcherServlet          ,          ,      :
    		a、      ,       multipart   MultipartResolver        ;
    		b、  HandlerMapping,         (    HandlerExecutionChain,        、  HandlerInterceptor   );
    		c、  HandlerAdapter          (HandlerExecutionChain     );
    		d、  ViewResolver              ;
    		e、     ;
    		f、        ;
    		g、              HandlerExceptionResolver   。
    		
    		    ,  SpringMVC ,            servlet     。
    		
    		DispatcherServlet    WebApplicationContext      ,        [servlet-name]-servlet.xml,
    		     servlet-name spring,            spring-servlet.xml,      ,       WEB-INF   。
    		
    		                     ,    。
    	-->
    	<servlet>
    		<servlet-name>spring</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
                <param-value>classpath*:*config/spring-servlet.xml</param-value>
    		</init-param>
    	</servlet>
    
    	<!-- 
    		5:        
    		
    		url-pattern   /,      ,         (js,css )    。   *.html,           
    	-->
    	<servlet-mapping>
    		<servlet-name>spring</servlet-name>
    		<url-pattern>*.html</url-pattern>
    	</servlet-mapping>
    
    	<!-- 
    		6:       
    		     ,         ,            ,         
    	 -->
    	<welcome-file-list>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    	</welcome-file-list>
    	
    	<!-- 
    		7:    
    		
    		error-page                    ,            。             ,
    		      ,           404    ;            ,             ,    
    		          。            , error-page                       。
    		
    		error-code     http      ,         ; exception-type             ,    
    		     。
    	 -->
    <!-- 	<error-page>   -->
    <!-- 		<error-code>404</error-code>   -->
    <!-- 		<location>/WEB-INF/common/404.html</location>   -->
    <!-- 	</error-page> -->
    	
    <!-- 	<error-page>   -->
    <!-- 		<error-code>500</error-code>   -->
    <!-- 		<location>/WEB-INF/common/500.html</location>   -->
    <!-- 	</error-page> -->
    	
    <!-- 	<error-page> -->
    <!-- 		<exception-type>java.lang.NullPointerException</exception-type>   -->
    <!-- 		<location>/WEB-INF/common/nullpointer.html</location>   -->
    <!-- 	 </error-page> -->
    	  
    	<!-- 
    		8:  session    
    		
    		 session  session-timeout      ,  session    。
    		session-timeout      ,       session    3        
    	-->
    	<session-config>
    		<session-timeout>180</session-timeout>
    	</session-config>
    	
    </web-app>

    三、アプリケーションContext.xmlとspring-servlet.xml
    デフォルトでは、WEB-INFディレクトリの下でSpringにアプリケーションContextという名前を追加する必要があります.xmlのプロファイルは、SpringMVCにspring-servletという名前のプロファイルも追加します.xmlのプロファイル.しかし、私たちはwebにいるからです.xmlにcontextConfigLocationのグローバルパラメータが設定されている場合、Springはこのパラメータで指定したディレクトリに条件に合致するファイルをプロファイルとして検索します.
    applicationContext.xmlはSpringのグローバルプロファイルです.このファイルでは、AOP、データベース接続、汎用Beanなどを構成します.そしてspring-servlet.xmlでは、コントローラ、ブロッキングなど、MVCに関連するコンテンツが構成されることが多い.実際にアプリケーションContext.xmlに対応する容器はspring-servletである.xmlは容器の親容器に対応する、MVCに必要なBeanがspring-servletにない場合.xmlで検索すると、前のレベルのコンテナ、すなわちアプリケーションContext.xml対応のコンテナで検索します.
    以下はアプリケーションContext.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:mybatis="http://mybatis.org/schema/mybatis-spring"
    	   xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        
        <!--     -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    	    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    	    <property name="url" value="jdbc:mysql://localhost:3306/tangsystemdb?useUnicode=true&amp;characterEncoding=UTF-8" />
    	    <property name="username" value="root"/>
    	    <property name="password" value=""/>
    	    <!--        、  、   -->
    	    <property name="initialSize"><value>1</value></property>
    	    <property name="maxActive"><value>5</value></property>
    	    <property name="minIdle"><value>1</value></property>
    	    <!--               -->
    	    <property name="maxWait"><value>60000</value></property>
    	    <!--              ,           ,      -->
    	    <property name="timeBetweenEvictionRunsMillis"><value>60000</value></property>
    	    <!--                 ,      -->
    	    <property name="minEvictableIdleTimeMillis"><value>300000</value></property>
    	    <!--
    	    <property name="validationQuery"><value>SELECT 'x'</value></property>
    	    <property name="testWhileIdle"><value>true</value></property>
    	    <property name="testOnBorrow"><value>false</value></property>
    	    <property name="testOnReturn"><value>false</value></property>
    	    <property name="poolPreparedStatements"><value>true</value></property>
    	    <property name="maxOpenPreparedStatements"><value>20</value></property>
    	     -->
     	</bean>
     	
     	<!-- mybatis   -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="mapperLocations">
                <list>
                    <value>classpath:mapper/*.xml</value>
                </list>
            </property>
        </bean> 
        
        <!--        ,     tang/system/mapper   ,   mapper   SqlMapper     ,     bean     -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="tang.system.mapper"/>
        </bean>
    </beans>

    JDBCのURL構成に注意してください.プロジェクトにデータベース補間エラーがある場合は、データベース接続の文字符号化を構成していない可能性があります.同時にこのURLの&記号は&に移行する必要があります.
    またmybatisの構成については、マッパーディレクトリ下のすべてのxmlファイルにマッパープロファイルが設定されています.
    spring-servlet.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:p="http://www.springframework.org/schema/p"
    	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:util="http://www.springframework.org/schema/util"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
                http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    	<!-- 1、  @Controller      SpringMVC ,     Controller  ,      <mvc:annotation-driven 
    		/>,   http://blog.csdn.net/tang19880721/article/details/40475763 <mvc:annotation-driven/>      DefaultAnnotationHandlerMapping AnnotationMethodHandlerAdapter  bean, 
    		    messageconverter,    spring MVC @Controllers        。           , @NumberFormatannotation  ,@DateTimeFormat  ,@Valid  ,  XML   (JAXB),  JSON   (Jackson)。 
    		 spring mvc 3.1    ,   bean      : DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping 
    		AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter AnnotationMethodHandlerExceptionResolver 
    		-> ExceptionHandlerExceptionResolver -->
    	<mvc:annotation-driven />
    
    	<!-- 2、    bean              ,spring     base-package       java ,      @Component、@Controller、 
    		@Service          bean。                 ,   Bean                  -->
    	<context:component-scan base-package="tang.system.*" />
    
    	<context:annotation-config />
    	<!-- <mvc:resources mapping="/styles/**" location="/WEB-INF/resource/styles/"/> -->
    
    	<!-- Freemarker   -->
    	<bean id="freemarkerConfig"
    		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    		<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
    		<property name="freemarkerSettings">
    			<props>
    				<prop key="template_update_delay">0</prop>
    				<prop key="default_encoding">UTF-8</prop>
    				<prop key="number_format">0.00</prop>
    				<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
    				<prop key="classic_compatible">true</prop>
    				<prop key="template_exception_handler">ignore</prop>
    			</props>
    		</property>
    	</bean>
    
    	<!--   freemarker      -->
    	<bean id="viewResolver"
    		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    		<property name="cache" value="true" />
    		<property name="suffix" value=".ftl" />
    		<property name="contentType" value="text/html;charset=UTF-8"></property>
    		<property name="requestContextAttribute" value="request" />
    		<property name="exposeSpringMacroHelpers" value="true" />
    		<property name="exposeRequestAttributes" value="true" />
    		<property name="exposeSessionAttributes" value="true" />
    	</bean>
    
    	<mvc:interceptors>
    		<!--      ,         basePath   -->
    		<bean class="tang.system.interceptor.BasePathInterceptor" />
    	</mvc:interceptors>
    </beans>

    ここで説明するのは、FreeMarkerの構成では、templateLoaderPathが/WEB-INF/ftlに設定されているため、Controllerで返されたページテンプレートがこのディレクトリにデフォルトで検索されることを意味します.またsubffixが設定ため.ftlでは、Controllerで返されるページテンプレートに接尾辞を明記する必要はありません.要するに、ftlファイルをWEB-INF/ftlディレクトリの下に配置し、ftlと接尾辞を付ける必要があります.Controllerで/admin/indexを返すと、戻るページテンプレートがWEB-INF/ftl/admin/indexであることを示す.ftl. 
    上記の構成には、テンプレートでこのパスを使用してリソースにアクセスするためにプロジェクトのパスをrequestに保存する簡単なブロック、BasePathInterceptorが追加されています.
    四、Log 4 j 2.xml
    Log 4 j 2の使用は比較的簡単で、まずlog 4 j-apiを導入する.JArとlog 4 j-core.JAr、classpathの下にlog 4 j 2を加える.xmlプロファイルは、残りはプロジェクトでLogger出力ログを使用します.
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="error">
    	<appenders>
    		<Console name="Console" target="SYSTEM_OUT">
    			<ThresholdFilter level="trace" onMatch="ACCEPT"
    				onMismatch="DENY" />
    			<PatternLayout
    				pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
    		</Console>
    		<File name="log" fileName="logs/opt.log" append="false">
    			<PatternLayout
    				pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
    		</File>
    		<RollingFile name="RollingFile" fileName="logs/opt.log"
    			filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
    			<PatternLayout
    				pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
    			<SizeBasedTriggeringPolicy size="500 MB" />
    		</RollingFile>
    	</appenders>
    	<loggers>
    		<root level="trace">
    			<appender-ref ref="RollingFile" />
    			<appender-ref ref="Console" />
    		</root>
    	</loggers>
    </configuration>

    以上はJavaWebエンジニアリングの基本構成であり、SpringMVC、Mybatis、Log 4 j 2などのフレームワークを統合した上で、異なるビジネスコードを追加するだけで簡単なプロジェクトを完成することができます.後続の過程で、必要に応じて、私たちはこのフレームワークを徐々に改善し、このフレームワークを使用してプロジェクトを完成し、その機能を豊かにします.