寫了一個利用SSM+idea+meavn+mysql的簡單的學生管理系統,明天要開始寫一個crm了,先把這個貼上來.
項目結構
配置文件
jdbc.properties
#JDBC Global Setting
#jdbc.driver=com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybase?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=root
##DataSource Global Setting
#\u914D\u7F6E\u521D\u59CB\u5316\u5927\u5C0F\u3001\u6700\u5C0F\u3001\u6700\u5927
ds.initialSize=1
ds.minIdle=1
ds.maxActive=20
#\u914D\u7F6E\u83B7\u53D6\u8FDE\u63A5\u7B49\u5F85\u8D85\u65F6\u7684\u65F6\u95F4
ds.maxWait=60000
#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
ds.timeBetweenEvictionRunsMillis=60000
#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
ds.minEvictableIdleTimeMillis=300000
log4j.properties
#\uFFFD\uFFFD\uFFFD\u00F8\uFFFDLogger \uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0278\uFFFDAppender
#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u053B\uFFFD\uFFFD\uFFFD\u02B1\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u03AADEBUG\u0123\u02BD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u03F5\u0373\uFFFD\uFFFD\uFFFD\uFFFD\u03F8\uFFFD\uFFFD\u05BE\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u02B1\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u03AAINFO\u0123\u02BD\uFFFD\uFFFD
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=ERROR,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender \uFFFD\uFFFD\uFFFD
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File \uFFFD\uFFFD\uFFFD \u04BB\uFFFD\uFFFD\u04BB\uFFFD\uFFFD\uFFFD\u013C\uFFFD,\uFFFD\uFFFD\uFFFD\u00B7\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0536\uFFFD\uFFFD\uFFFD,\u04BB\uFFFD\uFFFD\uFFFD\u06B8\uFFFD\u00B7\uFFFD\uFFFD\uFFFD\uFFFD
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置mybatis的緩存,延遲加載等等一系列屬性 -->
<settings>
<!-- 該配置影響的所有映射器中配置的緩存的全局開關。默認true -->
<setting name="cacheEnabled" value="true"/>
<!-- 延遲加載的全局開關。當開啓時,所有關聯對象都會延遲加載。 特定關聯關係中可通過設置fetchType屬性來覆蓋該項的開關狀態。默認false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 是否允許單一語句返回多結果集(需要兼容驅動)。 默認true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 使用列標籤代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。默認true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置爲 true 則這個設置強制使用自動生成主鍵,儘管一些驅動不能兼容但仍可正常工作(比如 Derby)。
默認false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。
FULL 會自動映射任意複雜的結果集(無論是否嵌套)。
默認 PARTIAL -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。默認SIMPLE -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 設置超時時間,它決定驅動等待數據庫響應的秒數。Not Set (null) -->
<setting name="defaultStatementTimeout" value="25"/>
<!-- 爲驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。 -->
<setting name="defaultFetchSize" value="100"/>
<!-- 允許在嵌套語句中使用分頁(RowBounds)。 If allow, set the false. -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。
默認值爲 SESSION,這種情況下會緩存一個會話中執行的所有查詢。
若設置值爲 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。
-->
<setting name="localCacheScope" value="SESSION"/>
<!-- 當沒有爲參數提供特定的 JDBC 類型時,爲空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定哪個對象的方法觸發一次延遲加載。 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
<!--在spring.xml文件中配置-->
<!--批量別名定義,掃描整個包下的類,別名爲類名(大小寫不敏感)-->
<!--<typeAliases>-->
<!--<package name="com.ykt.gdxl.entity"/>-->
<!--</typeAliases>-->
<!--註冊映射文件-->
<!--<mappers>-->
<!--<mapper resource="com/ykt/gdxl/dao/mapper/UserDaoMapper.xml"/>-->
<!--</mappers>-->
</configuration>
spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 自動掃描SpringMVC包 ,將帶有註解的類 納入spring容器管理
<context:component-scan base-package="com.pt.gdxl.*"/> -->
<!-- 包掃描,除controller以外 -->
<context:component-scan base-package="com.*" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 引入jdbc配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
</list>
</property>
</bean>
<!-- dataSource 配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本屬性 url、user、password -->
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${ds.initialSize}"/>
<property name="minIdle" value="${ds.minIdle}"/>
<property name="maxActive" value="${ds.maxActive}"/>
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="${ds.maxWait}"/>
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${ds.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${ds.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="false"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<!-- 配置監控統計攔截的filters -->
<property name="filters" value="stat"/>
</bean>
<!-- 配置mybatisSqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--數據源-->
<property name="dataSource" ref="dataSource"/>
<!--mybatis 動態sql編寫mapper文件路徑-->
<property name="mapperLocations" value="classpath*:com/jxzd/dao/mapper/*Mapper.xml"/>
<!-- 批量定義別名-->
<property name="typeAliasesPackage" value="com.jxzd.entity"/>
</bean>
<!-- 配置SqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- 配置mybatis mapper接口,掃描所有dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jxzd.dao"/>
<property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
</bean>
<!-- 事務管理 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 對insert,update,delete 開頭的方法進行事務管理,只要有異常就回滾 -->
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>
<!-- select,count開頭的方法,開啓只讀,提高數據庫訪問性能 -->
<tx:method name="select*" read-only="true"/>
<tx:method name="count*" read-only="true"/>
<!-- 對其他方法 使用默認的事務管理 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置使Spring採用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 對dataSource 數據源進行事務管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 使用annotation註解方式配置事務,啓用對事務註解的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- SpringMVC上傳文件時,需要配置MultipartResolver處理器 -->
<!--<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">-->
<!--<property name="defaultEncoding" value="UTF-8"/>-->
<!--<!– 指定所上傳文件的總大小不能超過200KB。注意maxUploadSize屬性的限制不是針對單個文件,而是所有文件的容量之和 –>-->
<!--<property name="maxUploadSize" value="10240"/>-->
<!--<!–<property name="maxUploadSizePerFile" value="1024000"/>–>-->
<!--<!–<property name="maxInMemorySize" value="1024000"/>–>-->
<!--<!–<property name="maxUploadSize" value="#{1024*1024*1024*1024}"/>–>-->
<!--<!–resolveLazily屬性啓用是爲了推遲文件解析,以便在UploadController 中捕獲文件大小異常–>-->
<!--<property name="resolveLazily" value="true"/>-->
<!--</bean>-->
</beans>
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--啓用spring的一些annotation -->
<context:annotation-config/>
<mvc:annotation-driven/>
<!--全局json返回時間格式-->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">-->
<!--<property name="messageConverters">-->
<!--<list>-->
<!--<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>-->
<!--<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">-->
<!--<property name="objectMapper">-->
<!--<bean class="com.fasterxml.jackson.databind.ObjectMapper">-->
<!--<property name="dateFormat">-->
<!--<bean class="java.text.SimpleDateFormat">-->
<!--<!– 設置全局返回JSON到前端時日期格式化 –>-->
<!--<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm"/>-->
<!--</bean>-->
<!--</property>-->
<!--</bean>-->
<!--</property>-->
<!--</bean>-->
<!--</list>-->
<!--</property>-->
<!--</bean>-->
<!-- 自動掃描該包,使SpringMVC認爲包下用了@controller註解的類是控制器 -->
<context:component-scan base-package="com.jxzd.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--<bean class="com.ykt.gdxl.controller.UserController"/>-->
<!--掃描service
<context:component-scan base-package="com.pt.gdxl.mvc.impl"/>-->
<!--HandlerMapping 無需配置,SpringMVC可以默認啓動-->
<!-- 攔截器 -->
<!--<mvc:interceptors>-->
<!--<!– 多個攔截器,順序執行 –>-->
<!--<mvc:interceptor>-->
<!--<mvc:mapping path="/**"/><!– 如果不配置或/**,將攔截所有的Controller,/*表示攔截第一層 –>-->
<!--<bean class="com.pt.gdxl.interceptor.LoginInterceptor"></bean>-->
<!--</mvc:interceptor>-->
<!--</mvc:interceptors>-->
<!--靜態資源映射-->
<!--本項目把靜態資源放在了WEB-INF的子目錄下,資源映射如下-->
<!--<mvc:resources mapping="/css/**" location="/assets/css/"/>-->
<!--<mvc:resources mapping="/js/**" location="/assets/js/"/>-->
<!--<mvc:resources mapping="/image/**" location="/assets/image/"/>-->
<!-- 配置註解驅動 可以將request參數與綁定到controller參數上 -->
<!--<mvc:annotation-driven/>-->
<!--<mvc:interceptors>-->
<!--<mvc:interceptor>-->
<!--<mvc:mapping path="/**"/>-->
<!--<bean class="com.pt.gdxl.interceptor.FileUploadInterceptor">-->
<!--<!– 500M –>-->
<!--<property name="maxSize" value="#{500*1024*1024}"/>-->
<!--</bean>-->
<!--</mvc:interceptor>-->
<!--</mvc:interceptors>-->
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前後綴(如果最後一個還是表示文件夾,則最後的斜槓不要漏了) 使用JSP-->
<!-- 默認的視圖解析器在上邊的解析錯誤時使用 (默認使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!--設置JSP文件的目錄位置-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--<property name="prefix" value="/WEB-INF/views/"/>-->
<property name="suffix" value=".jsp"/>
</bean>
<!-- SpringMVC文件上傳需要配置的節點-->
<!--<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">-->
<!--<property name="maxUploadSize" value="#{1024*1024*1024}"/>-->
<!--<property name="defaultEncoding" value="UTF-8"/>-->
<!--<property name="resolveLazily" value="true"/>-->
<!--</bean>-->
<!-- 支持返回json,用來處理json格式轉換,避免IE執行ajax時,返回json出現下載文件 -->
<!--<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">-->
<!--<property name="messageConverters">-->
<!--<list>-->
<!--<ref bean="mappingJacksonHttpMessageConverter"/>-->
<!--</list>-->
<!--</property>-->
<!--</bean>-->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--首頁-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!--<servlet>-->
<!--<servlet-name>Login_action</servlet-name>-->
<!--<servlet-class>com.ykt.gdxl.service.Login_action</servlet-class>-->
<!--</servlet>-->
<!--<servlet-mapping>-->
<!--<servlet-name>Login_action</servlet-name>-->
<!--<url-pattern>/login-action</url-pattern>-->
<!--</servlet-mapping>-->
<!--自定義jsp中使用的java方法-->
<!--<jsp-config>-->
<!--<taglib>-->
<!--<taglib-uri>/my-functions</taglib-uri>-->
<!--<taglib-location>/WEB-INF/tld/my-functions.tld</taglib-location>-->
<!--</taglib>-->
<!--</jsp-config>-->
<!--會話超時配置,單位分鐘-->
<session-config>
<session-timeout>360</session-timeout>
</session-config>
<!--Spring框架給我們提供過濾器CharacterEncodingFilter 這個過濾器就是針對於。
其中encoding用來設置編碼格式,forceEncoding用來設置是否理會 request.getCharacterEncoding()方每次瀏覽器請求進行過濾的,
然後再其之上添加了父類沒有的功能即處理字符編碼法,設置爲true則強制覆蓋之前的編碼格式。-->
<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>
<!-- 項目中使用Spring時,spring.xml配置文件中並沒有BeanFactory,要想在業務層中的class文件中直接引用Spring容器管理的bean可通過以下方式-->
<!--1、在web.xml配置監聽器ContextLoaderListener。ContextLoaderListener的作用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。
因爲它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啓動容器時,就會默認執行它實現的方法。
在ContextLoaderListener中關聯了ContextLoader這個類,所以整個加載配置過程由ContextLoader來完成。-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--監聽服務器啓動-->
<!--<listener>-->
<!--<listener-class>com.pt.gdxl.listener.ContextLoaderOverListener</listener-class>-->
<!--</listener>-->
<!--2、部署applicationContext的xml文件。如果在web.xml中不寫任何參數配置信息,默認的路徑是"/WEB-INF/applicationContext.xml,
在WEB-INF目錄下創建的xml文件的名稱必須是applicationContext.xml。
如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個context參數:
在<param-value> </param-value>裏指定相應的xml文件名,如果有多個xml文件,可以寫在一起並以“,”號分隔,也可以這樣applicationContext-*.xml採用通配符,
匹配的文件都會一同被載入。 在ContextLoaderListener中關聯了ContextLoader這個類,所以整個加載配置過程由ContextLoader來完成。-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!--如果你的DispatcherServlet攔截"/",爲了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態文件的訪問也就被攔截了。-->
<!--方案一:激活Tomcat的defaultServlet來處理靜態文件-->
<!--要寫在DispatcherServlet的前面,讓defaultServlet先攔截請求,這樣請求就不會進入Spring了-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.map</url-pattern>
</servlet-mapping>
<!--layui中的文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ttf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.woff</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.woff2</url-pattern>
</servlet-mapping>
<!--使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一個Servlet,,所以可以配置多個DispatcherServlet-->
<!--DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,
依據某某規則分發到目標Controller(我們寫的Action)來處理。-->
<!--配置SpringMVC DispatcherServlet-->
<servlet>
<!--在DispatcherServlet的初始化過程中,框架會在web應用的 WEB-INF文件夾下尋找名爲[servlet-name]-servlet.xml 的配置文件,生成文件中定義的bean。-->
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--指明瞭配置文件的文件名,不使用默認配置文件名,而使用spring-mvc.xml配置文件。-->
<param-name>contextConfigLocation</param-name>
<!--其中<param-value>**.xml</param-value> 這裏可以使用多種寫法-->
<!--1、不寫,使用默認值:/WEB-INF/<servlet-name>-servlet.xml-->
<!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>-->
<!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>-->
<!--4、多個值用逗號分隔-->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--是啓動順序,讓這個Servlet隨Servlet容器一起啓動。-->
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<!--這個Servlet的名字是dispatcher,可以有多個DispatcherServlet,是通過名字來區分的。
每一個DispatcherServlet有自己的WebApplicationContext上下文對象。同時保存的ServletContext中和Request對象中.-->
<!--ApplicationContext是Spring的核心,Context我們通常解釋爲上下文環境,我想用“容器”來表述它更容易理解一些,
ApplicationContext則是“應用的容器”了,Spring把Bean放在這個容器中,在需要的時候,用getBean方法取出-->
<servlet-name>springMVC</servlet-name>
<!--Servlet攔截匹配規則可以自已定義,當映射爲@RequestMapping("/user/add")時,爲例,攔截哪種URL合適?-->
<!--1、攔截*.do、*.htm, 例如:/user/add.do,這是最傳統的方式,最簡單也最實用。不會導致靜態文件(jpg,js,css)被攔截。-->
<!--2、攔截/,例如:/user/add,可以實現現在很流行的REST風格。很多互聯網類型的應用很喜歡這種風格的URL。
弊端:會導致靜態文件(jpg,js,css)被攔截後不能正常顯示。 -->
<url-pattern>/</url-pattern><!--會攔截URL中帶“/”的請求。-->
</servlet-mapping>
</web-app>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ykt</groupId>
<artifactId>jxzd</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>gdxl Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- 添加Ueditor依賴-->
<dependency>
<groupId>com.baidu</groupId>
<artifactId>ueditor</artifactId>
<version>1.1.2</version>
</dependency>
<!--上傳-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<!--ftp 上傳-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- 使用MappingJackson2HttpMessageConverter,加入最新的FastJackson依賴 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0.pr3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0.pr3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0.pr3</version>
</dependency>
<!-- junit測試包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--mysql驅動包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
<!--6.0.6版本不兼容jdk1.7-->
</dependency>
<!--spring相關包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!--aspectj-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency>
<!-- 支持jsp-->
<dependency>
<groupId>javax.servlet</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.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- JDBC連接池-->
<!--<dependency>-->
<!--<groupId>com.mchange</groupId>-->
<!--<artifactId>c3p0</artifactId>-->
<!--<version>0.9.5.2</version>-->
<!--</dependency>-->
<!-- DruidDataSource,本工程的dataSource配置使用的Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!--mybatis spring整合-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
<build>
<finalName>jxzd</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
java文件
user.java
package com.jxzd.entity;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 實體類
* 學生表
*/
public class User {
// id
private Integer uid;
private Integer pid;
private Integer cid;
// 用戶名
private String username;
// 密碼
private String password;
// 性別
private String sex;
// 生日
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
// 地址
private String address;
public User(Integer uid, Integer pid, Integer cid, String username, String password, String sex, Date birthday, String address) {
this.uid = uid;
this.pid = pid;
this.cid = cid;
this.username = username;
this.password = password;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
public User() {
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", pid=" + pid +
", cid=" + cid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
userdao.xml
package com.jxzd.dao;
import com.jxzd.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserDao {
//查找所有學生
List<User> selectUserByAll();
//根據學號查詢學生
User selectUserById(int uid);
//更新學生
void updateUser(User user);
//增加學生
void addUser(@Param("username") String username,
@Param("password") String password);
//刪除學生
boolean deleteUser(Integer uid);
//登錄
User findUserByNameAndPwd(@Param("username")String username, @Param("password")String password);
}
userMapper.xml
<?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" >
<!-- namespace,指定要實現的接口 全限定名 附件表 -->
<mapper namespace="com.jxzd.dao.UserDao">
<!--查詢所有學生-->
<select id="selectUserByAll" resultType="User">
SELECT uid,username,password,sex,birthday,address
FROM
`user`
</select>
<!--根據學號查詢學生-->
<select id="selectUserById" resultType="User" parameterType="Integer">
select * from user where uid= #{uid}
</select>
<!--增加用戶名和密碼進行註冊 -->
<insert id="addUser" parameterType="User">
insert into user (username,password) values (#{username},#{password})
</insert>
<!--刪除學生-->
<delete id="deleteUser" parameterType="Integer">
delete from user where uid=#{uid}
</delete>
<!--查找用戶名與密碼以登錄-->
<select id="findUserByNameAndPwd" parameterType="map" resultType="User">
select * from user where username=#{username} and password=#{password}
</select>
<!--更新-->
<update id="updateUser" parameterType="User">
update user set username=#{username},password=#{password},sex=#{sex},birthday=#{birthday},address=#{address} where uid=#{uid}
</update>
</mapper>
userservice
package com.jxzd.service;
/*
業務邏輯接口
*/
import com.jxzd.entity.User;
import java.util.List;
public interface UserService {
//所有學生
List<User> allUser();
//查詢學生
User findUser(int uid);
//更新學生
void updateUser(User user);
//註冊
void regist(String username,String password);
//刪除學生
boolean deleteUser(Integer uid);
//登錄
User login(String username, String password);
}
userserviceimpl
package com.jxzd.service.impl;
import com.jxzd.dao.UserDao;
import com.jxzd.entity.User;
import com.jxzd.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/*
業務邏輯實現類
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> allUser() {
return userDao.selectUserByAll();
}
@Override
public User findUser(int uid) {
return userDao.selectUserById(uid);
}
@Override
public void updateUser(User user) {
userDao.updateUser(user);
}
@Override
public void regist(String username, String password) {
userDao.addUser(username, password);
}
@Override
public boolean deleteUser(Integer uid) {
return userDao.deleteUser(uid);
}
@Override
public User login(String username, String password) {
return userDao.findUserByNameAndPwd(username, password);
}
}
usercontroller
package com.jxzd.controller;
import com.jxzd.entity.User;
import com.jxzd.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
//展示所有學生
@RequestMapping("/allUser")
public String findAll(Model model) {
List<User> userList = userService.allUser();
model.addAttribute("list", userList);
return "allUser";
}
//刪除
@RequestMapping("/deleteUser")
public String deleteUser(int uid) {
userService.deleteUser(uid);
return "redirect:allUser";
}
//登錄
@RequestMapping("/login")
public String login(String username, String password) {
//用戶名密碼都必須符合邏輯
//用戶名3-12位 密碼6-12位
if (username.matches("[a-zA-Z0-9]{3,12}")
&& password.matches("[a-zA-Z0-9]{4,12}")) {
//用戶名密碼都正確才能登錄
if (userService.login(username, password) != null) {
User user = userService.login(username, password);
System.out.println(user);
return "redirect:allUser";
} else {
return "error";
}
} else {
return "error";
}
}
//註冊
@RequestMapping("/register")
public String register(String username, String password) {
//判斷註冊時用戶名不能與已有的一樣
List<User> userList = userService.allUser();
for (User user : userList) {
if (user.getUsername().equals(username)) {
return "error";
}
}
//用戶名密碼都必須符合邏輯
//用戶名3-12位 密碼6-12位
if (username.matches("[a-zA-Z0-9]{3,12}")
&& password.matches("[a-zA-Z0-9]{4,12}")) {
//註冊時用戶名與密碼不能爲空
if (username != "" || password != "") {
userService.regist(username, password);
return "success";
} else {
return "error";
}
} else {
return "error";
}
}
//to註冊
@RequestMapping("/toRegister")
public String toRegister() {
return "register";
}
//編輯學生
@RequestMapping("/editUser")
public String updateUser(User user) {
System.out.println(user);
userService.updateUser(user);
return "redirect:allUser";
}
//to編輯學生
@RequestMapping("/toEditUser")
public String toEditUser(int uid, Model model) {
System.out.println("1111" + uid);
User user = userService.findUser(uid);
System.out.println(user);
model.addAttribute("user", user);
return "editUser";
}
}
jsp頁面
login
<%--
Created by IntelliJ IDEA.
User: Everglow
Date: 2019/3/22
Time: 14:05
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄</title>
</head>
<body>
<%--<h2>你還沒有登錄,請先登錄!</h2>--%>
<form action="${pageContext.request.contextPath}/user/login" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input name="username" type="text"></td>
<td></td>
</tr>
<tr>
<td> 密碼:</td>
<td><input name="password" type="password"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登錄"></td>
<td></td>
</tr>
</table>
</form>
<a href="${pageContext.request.contextPath }/user/toRegister">
<button>註冊</button>
</a>
</body>
</html>
alluser
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%--
Created by IntelliJ IDEA.
User: Everglow
Date: 2019/3/22
Time: 14:49
--%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>學生信息管理</title>
</head>
<body>
<h2>學生信息管理</h2>
<table>
<tr>
<th>學號</th>
<th>姓名</th>
<th>密碼</th>
<th>性別</th>
<th>生日</th>
<th>地址</th>
</tr>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.uid}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td>${user.sex}</td>
<%--使日期顯示爲yyyy-mm-dd形式--%>
<td><fmt:formatDate value='${user.birthday}' pattern='yyyy-MM-dd' />
</td>
<td>${user.address}</td>
<td>
<a href="${path}/user/toEditUser?uid=${user.uid}">
<button>編輯</button>
</a>
</td>
<td>
<a href="${path}/user/deleteUser?uid=${user.uid}">
<button>刪除</button>
</a>
</td>
</tr>
</c:forEach>
</table>
<br>
<a href="${pageContext.request.contextPath }/user/toRegister">
<button>增加新用戶</button>
</a>
</body>
</html>
edituser
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<head>
<title>用戶信息修改</title>
</head>
<body>
<h2>修改[${user.uid}]的信息</h2>
<form method="post" action="${pageContext.request.contextPath}/user/editUser">
<table>
<tr>
<td></td>
<td><input type="hidden" name="uid" value="${user.uid }"/></td>
<td></td>
</tr>
<tr>
<td> 用戶名:</td>
<td><input name="username" type="text" value="${user.username}"></td>
<td></td>
</tr>
<tr>
<td> 密碼:</td>
<td><input name="password" type="password" value="${user.password}"></td>
<td></td>
</tr>
<tr>
<td> 性別:</td>
<td><input name="sex" type="text" value="${user.sex}"></td>
<td></td>
</tr>
<tr>
<td> 生日:</td>
<td><input name="birthday" type="date"
value='<fmt:formatDate value='${user.birthday}' pattern='yyyy-MM-dd' />'>
</td>
<td></td>
</tr>
<tr>
<td> 地址:</td>
<td><input name="address" type="text" value="${user.address}"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="修改"></td>
<td></td>
</tr>
</table>
</form>
</body>
error
<%--
Created by IntelliJ IDEA.
User: Everglow
Date: 2019/3/28
Time: 9:37
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
<h2>錯誤</h2>
<a href="/login.jsp">返回登錄</a>
<a href="/user/toRegister">返回註冊</a>
</body>
</html>
register
<%--
Created by IntelliJ IDEA.
User: Everglow
Date: 2019/3/23
Time: 11:18
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>註冊</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/user/register" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input name="username" type="text"></td>
<td></td>
</tr>
<tr>
<td>密碼:</td>
<td><input name="password" type="password"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="註冊"></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
success
<%--
Created by IntelliJ IDEA.
User: Everglow
Date: 2019/3/23
Time: 9:43
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>註冊成功</title>
</head>
<body>
<h1>註冊成功!</h1>
<%--記得加註冊者名字展示--%>
<br>
<a href="/user/allUser">返回</a>
</body>
</html>