写了一个利用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>