阿里云學生機到期了,不知道為什么不讓我以學生價格續費。。。加上假期比較忙,結果服務器數據銷毀了。。。以前的博客都沒了,以后就轉戰簡書了。
?JavaEE學習以來已經有數月了,每次寫代碼都感覺自己在創造的過程中,難以停下。匆忙的學習和實踐中,一直沒有記錄自己,想來十分慚愧。初進JaveWeb開發,有一種東西很多不知道怎么學的感受。
我舍友在搞python,告訴我Python Web框架無非是 Flask 或者 Django,他選用的 Django 封裝的非常全面,后臺自己生成,數據庫和實體自己生成,只用寫一些業務邏輯。聽起來很不錯,可以專注于業務邏輯。我是一個控制欲比較強的人但是又比較懶的人,Python語法太簡潔了,C/C++太麻煩了,我從遇到Java開始就覺得這個語言比較適合我(當然我覺得以后深入理解C/C++是必不可少的)。然后..... 好了 不吹比了 進入正題~~~
我是使用maven搭建項目的,相信已經沒有朋友手動導入jar包了吧,我比較喜歡嘗試新鮮事物,基本導入的包都是最新的,eclipse
也是neon 2
版本了,踩到了不少版本的坑,包括很多博客里的配置方法已經不支持,許多方法已經不建議使用,一道黑黑的線蓋在java方法上,感覺自己腦門上都是黑線。這次我是使用Spring Springmvc 4.3.7 Mybatis3.4.2 還有Mybatis-generator1.3.2(根據數據庫自動生成dao接口,實體,mapperxml文件)都是目前的最新版本,具體使用方法下面會說到。
首先當然是maven pom文件了
<properties>
<!-- spring版本號 -->
<spring.version>4.3.7.RELEASE</spring.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.24</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<!-- junit版本號 -->
<junit.version>4.12</junit.version>
<!-- mybatis版本號 -->
<mybatis.version>3.4.2</mybatis.version>
</properties>
<dependencies>
<!-- 添加Spring依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<!--單元測試依賴 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- log end -->
<!--spring單元測試依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!--mybatis依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 數據庫 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<!-- db end -->
<!-- Servlet 依賴 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.7</version>
</dependency>
<!-- cc 加解密 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
</dependencies>
<build>
<finalName>InfoSystem</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- mybatis-generator根據數據庫生成對應實體和Mapping -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/config/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
我使用log4j來輸入日志,log4j配置文件在下面貼出,許多問題和執行過程是只有日志文件才會輸出的,所以使用日志是很關鍵的。不知道是eclipse的問題還是環境的問題,我新建的maven項目,會不定期自動回退到javase1.5版本,servlet會自動回退到2.3,最明顯的表現是你的項目上面有一個紅色的小叉叉,但是里面的文件卻又沒有報錯。
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
在最后build中加入這個包就可以解決這個問題,mybatis-generator我是直接在eclipse maven中配置的,不用去控制臺了。右擊pom.xml找到Run然后在Goals框中輸入
mybatis-generator:generate
然后運行,看看對應目錄有沒有生成相應的文件。切記,如果再點一次運行,會重寫那個文件,會追加內容,不會報錯。但是當運行項目的時候,spring-mybatis會報注入錯誤,因為已經存在對應的某個mappingxml文件中的id,意思就是mybaits的sql文件中,有兩個相同的id,即重寫了一遍,不要問我為什么知道,我多執行了一遍,因為它本身生成的xml文件內容就很多,所以重寫了一遍的時候我竟然沒發現是xml文件出問題了。。。接下來列出web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>InfoSystem</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 編碼過濾器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>/doc/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<error-page>
<error-code>403</error-code>
<location>/403.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.html</location>
</error-page>
<!-- needed for ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mybatis.xml</param-value>
</context-param>
<!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Restful -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- SESSION Time min -->
<session-config>
<session-timeout>5</session-timeout>
</session-config>
</web-app>
我在網上同樣看了許多博客,有的把編碼過濾器配在了后面但是卻能起到作用,而我講編碼過濾器卸載后面卻不行,難道是請求轉發后就不過這個過濾器了?我覺得大概率是RestFul
風格攔截所有請求的時候產生的問題,但是也還是應該過編碼過濾器呀,百思不得其解,希望知道的朋友可以留言告訴我。因為我是用的是spring-mybatis
包整合,比較簡便一些。
<!-- needed for ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mybatis.xml</param-value>
</context-param>
<!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
這些代碼必須存在,<context-param>
指定spring-mybatis文件的所在,下面這一行很明顯是一個監聽器
initWebApplicationContext(event.getServletContext());
看了一下源碼,是初始化一個Web容器,這句話絕對不能少,否則在Spring注入的時候會報注入失敗錯誤,說到這里,聊聊當時我一個Spring注入錯誤的問題,當時我的項目沒有報錯,而且Spring配置文件也沒問題,檢查了無數遍,最后發現因為當時優化eclipse性能時,關閉了自動編譯,導致Spring竟然無法注入,必須手動build project,然后就老老實實的打開了自動編譯。下面的前端分發器大家應該已經很了解了,就不過多贅述了。然后我們看看spring-mybaits的配置
<context:component-scan base-package="com.mhyang">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- import -->
<context:property-placeholder location="classpath:config/db.properties"/>
<!-- DataSource c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="initialPoolSize" value="${initPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
</bean>
<!-- Spring-Mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:com/mhyang/mapping/*.xml"></property>
</bean>
<!-- Dao Implments -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mhyang.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- transactionManager -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第一行是不掃描@Controller標簽,在我看來可以節省一些性能,而且網上有的同學spring springmvc文件同時掃描,貌似還發生了一些錯誤。c3p0數據源,事務管理,我也不過多贅述了。
比較重要的是
<!-- Spring-Mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:com/mhyang/mapping/*.xml"></property>
</bean>
<!-- Dao Implments -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mhyang.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
sqlSessionFactory
中,首先引用了c3p0的數據源,然后要填寫xml所在的包,自動掃描其中的包,這樣就避免了單獨使用mybatis時候,在配置文件中添加<mapper>
Dao Implments
的作用是掃描Dao包接口的位置,也就是上面自動生成的那個,和xml文件對應起來。然后看看springmvc的配置
<mvc:annotation-driven>
</mvc:annotation-driven>
<context:annotation-config>
</context:annotation-config>
<!-- For static resources -->
<mvc:default-servlet-handler />
<context:component-scan base-package="com.mhyang.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".html"></property>
</bean>
這里的mvc:annotation-driven
很關鍵,我們看以前版本的配置文件,如果要響應xml,json,還有日期格式化,單元測試都需要注冊DefaultAnnotationHandlerMapping
AnnotationMethodHandlerAdapter
兩個bean,現在直接使用簡化版的就可以幫我們直接注冊,而且以前的配置方式好像也取消了,我當時使用的時候xml直接報錯了。下面的context:annotation-config
呢,是幫助我們注冊了四個bean。AutowiredAnnotationBeanPostProcesso
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
識別相應的autowired
等注解,所以在你不配置的時候不報錯,但使用的時候報錯,這種錯誤很難排查。和Spring-mybatis相反,至掃描Controller注解,最后貼一下log4j的配置文件,默認放在classpath下
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
配置的很簡單,但是基本的執行過程,mybatis的sql語句,錯誤都是可以看見的。如果不配置的話,會報兩句警告,不影響程序正常運行。
然后就可以愉快的使用了,細心的朋友可以發現配置文件里我還使用了redis
非關系型數據庫和連接池commons-pool2
作緩存和使用token方式驗證用戶,后面我會詳細講講。第一次在簡書寫,如果有什么不好的地方希望大家理解,也希望大家多多支持,共同進步。