SSM框架整合-实现CRUD,登录和分页操作

傷城~ 2022-05-15 11:40 391阅读 0赞

一.项目git地址:https://github.com/807028059/Test-User

二.项目结构:spring+springmvc+mybatis+maven+mysql+freemark+jetty

三.项目介绍:主要实现登录 crud以及分页效果

1.登录界面

70

2.主页

70 1

3.添加页面

70 2

4.编辑页面

70 3

四.搭建

1)准备配置文件

jar包依赖 这里推荐一个插件 mavenHelper.jar 可以自动检测jar包的冲突依赖关系

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.zj</groupId>
  5. <artifactId>Test-User</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <project.build.resourceEncoding>UTF-8</project.build.resourceEncoding>
  11. <!-- 定义spring的版本变量在dependency里面直接引用 -->
  12. <spring.version>4.3.2.RELEASE</spring.version>
  13. <slf4j.version>1.7.2</slf4j.version>
  14. </properties>
  15. <dependencies>
  16. <!-- spring web -->
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-web</artifactId>
  20. <version>${spring.version}</version>
  21. </dependency>
  22. <!-- spring mvc -->
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-webmvc</artifactId>
  26. <version>${spring.version}</version>
  27. </dependency>
  28. <!-- web开发要有servlet -->
  29. <dependency>
  30. <groupId>javax.servlet</groupId>
  31. <artifactId>javax.servlet-api</artifactId>
  32. <version>3.0.1</version>
  33. </dependency>
  34. <!-- spring 测试 -->
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-test</artifactId>
  38. <version>${spring.version}</version>
  39. </dependency>
  40. <!-- 单元测试 -->
  41. <!-- <dependency>
  42. <groupId>junit</groupId>
  43. <artifactId>junit</artifactId>
  44. <version>4.12</version>
  45. <scope>test</scope>
  46. </dependency>-->
  47. <dependency>
  48. <groupId>junit</groupId>
  49. <artifactId>junit</artifactId>
  50. <version>4.12</version>
  51. </dependency>
  52. <!-- spring jdbc -->
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-jdbc</artifactId>
  56. <version>${spring.version}</version>
  57. </dependency>
  58. <!-- spring事物 -->
  59. <dependency>
  60. <groupId>org.springframework</groupId>
  61. <artifactId>spring-tx</artifactId>
  62. <version>${spring.version}</version>
  63. </dependency>
  64. <dependency>
  65. <groupId>org.springframework</groupId>
  66. <artifactId>spring-context-support</artifactId>
  67. <version>${spring.version}</version>
  68. </dependency>
  69. <!-- aspectj切面编程的jar -->
  70. <dependency>
  71. <groupId>org.aspectj</groupId>
  72. <artifactId>aspectjweaver</artifactId>
  73. <version>1.8.9</version>
  74. </dependency>
  75. <!-- tomcat 连接池 -->
  76. <dependency>
  77. <groupId>org.apache.tomcat</groupId>
  78. <artifactId>tomcat-jdbc</artifactId>
  79. <version>7.0.42</version>
  80. </dependency>
  81. <!-- mybatis -->
  82. <dependency>
  83. <groupId>org.mybatis</groupId>
  84. <artifactId>mybatis</artifactId>
  85. <version>3.4.1</version>
  86. </dependency>
  87. <!-- 添加mybatis与Spring整合的核心包 -->
  88. <dependency>
  89. <groupId>org.mybatis</groupId>
  90. <artifactId>mybatis-spring</artifactId>
  91. <version>1.3.0</version>
  92. </dependency>
  93. <!-- mysql 驱动包 -->
  94. <dependency>
  95. <groupId>mysql</groupId>
  96. <artifactId>mysql-connector-java</artifactId>
  97. <version>5.1.39</version>
  98. </dependency>
  99. <!-- 日志打印相关的jar -->
  100. <dependency>
  101. <groupId>org.slf4j</groupId>
  102. <artifactId>slf4j-log4j12</artifactId>
  103. <version>${slf4j.version}</version>
  104. </dependency>
  105. <dependency>
  106. <groupId>org.slf4j</groupId>
  107. <artifactId>slf4j-api</artifactId>
  108. <version>${slf4j.version}</version>
  109. </dependency>
  110. <!-- mybatis分页插件 -->
  111. <dependency>
  112. <groupId>com.github.miemiedev</groupId>
  113. <artifactId>mybatis-paginator</artifactId>
  114. <version>1.2.17</version>
  115. <exclusions>
  116. <exclusion>
  117. <artifactId>mybatis</artifactId>
  118. <groupId>org.mybatis</groupId>
  119. </exclusion>
  120. </exclusions>
  121. </dependency>
  122. <!-- Template Language -->
  123. <dependency>
  124. <groupId>org.freemarker</groupId>
  125. <artifactId>freemarker</artifactId>
  126. <version>2.3.21</version>
  127. </dependency>
  128. <!-- Java utility类 -->
  129. <dependency>
  130. <groupId>org.apache.commons</groupId>
  131. <artifactId>commons-lang3</artifactId>
  132. <version>3.3.2</version>
  133. </dependency>
  134. <!-- fastjson配置 -->
  135. <dependency>
  136. <groupId>com.alibaba</groupId>
  137. <artifactId>fastjson</artifactId>
  138. <version>1.2.13</version>
  139. </dependency>
  140. <dependency>
  141. <groupId>com.fasterxml.jackson.core</groupId>
  142. <artifactId>jackson-databind</artifactId>
  143. <version>2.8.1</version>
  144. </dependency>
  145. <dependency>
  146. <groupId>org.codehaus.jackson</groupId>
  147. <artifactId>jackson-mapper-asl</artifactId>
  148. <version>1.9.12</version>
  149. </dependency>
  150. <!--GSON-->
  151. <dependency>
  152. <groupId>com.google.code.gson</groupId>
  153. <artifactId>gson</artifactId>
  154. <version>2.8.0</version>
  155. </dependency>
  156. <!--kaptcha-->
  157. <dependency>
  158. <groupId>com.github.axet</groupId>
  159. <artifactId>kaptcha</artifactId>
  160. <version>0.0.9</version>
  161. </dependency>
  162. <!--spring session-->
  163. <dependency>
  164. <groupId>org.springframework.session</groupId>
  165. <artifactId>spring-session</artifactId>
  166. <version>1.3.1.RELEASE</version>
  167. </dependency>
  168. <dependency>
  169. <groupId>redis.clients</groupId>
  170. <artifactId>jedis</artifactId>
  171. <version>2.9.0</version>
  172. </dependency>
  173. <dependency>
  174. <groupId>org.testng</groupId>
  175. <artifactId>testng</artifactId>
  176. <version>RELEASE</version>
  177. </dependency>
  178. <!-- <dependency>
  179. <groupId>com.alibaba</groupId>
  180. <artifactId>sms-dayu</artifactId>
  181. <version>1.0</version>
  182. </dependency>-->
  183. </dependencies>
  184. <build>
  185. <finalName>Test-User</finalName>
  186. <!-- 资源文件的设置 -->
  187. <plugins>
  188. <!-- compiler plugin -->
  189. <plugin>
  190. <groupId>org.apache.maven.plugins</groupId>
  191. <artifactId>maven-compiler-plugin</artifactId>
  192. <version>2.3.2</version>
  193. <configuration>
  194. <source>1.7</source>
  195. <target>1.7</target>
  196. <encoding>UTF-8</encoding>
  197. <compilerArguments>
  198. <bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
  199. </compilerArguments>
  200. </configuration>
  201. </plugin>
  202. <plugin>
  203. <groupId>org.eclipse.jetty</groupId>
  204. <artifactId>jetty-maven-plugin</artifactId>
  205. <version>9.2.1.v20140609</version>
  206. <configuration>
  207. <!--<webAppSourceDirectory>WebContent</webAppSourceDirectory>-->
  208. <!--<scanIntervalSeconds>3</scanIntervalSeconds>-->
  209. <!--<contextXml>src/main/resources/jetty-contexts.xml</contextXml>-->
  210. <webAppConfig>
  211. <!--<contextPath>/crm</contextPath>-->
  212. <!-- 此处指定默认Jetty Web配置文件
  213. <defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor> -->
  214. </webAppConfig>
  215. </configuration>
  216. </plugin>
  217. </plugins>
  218. </build>
  219. </project>

准备spring-mybatis.xml spring集成对数据库的配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  11. <!-- 自动扫描 -->
  12. <context:component-scan base-package="com.zj" />
  13. <!-- 引入配置文件 -->
  14. <bean id="propertyConfigurer"
  15. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  16. <property name="location" value="classpath:jdbc.properties" />
  17. </bean>
  18. <!-- 配置数据源 -->
  19. <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
  20. <property name="poolProperties">
  21. <bean class="org.apache.tomcat.jdbc.pool.PoolProperties">
  22. <property name="driverClassName" value="${JDBC.driver}"/>
  23. <property name="url" value="${JDBC.url}"/>
  24. <property name="username" value="${JDBC.username}"/>
  25. <property name="password" value="${JDBC.password}"/>
  26. <property name="jmxEnabled" value="true"/>
  27. <property name="testWhileIdle" value="true"/>
  28. <property name="testOnBorrow" value="true"/>
  29. <property name="testOnReturn" value="false"/>
  30. <property name="validationInterval" value="30000"/>
  31. <property name="validationQuery" value="SELECT 1"/>
  32. <property name="timeBetweenEvictionRunsMillis" value="30000"/>
  33. <property name="maxActive" value="200"/>
  34. <property name="initialSize" value="10"/>
  35. <property name="maxWait" value="30000"/>
  36. <property name="minEvictableIdleTimeMillis" value="30000"/>
  37. <property name="minIdle" value="10"/>
  38. <property name="logAbandoned" value="false"/>
  39. <property name="removeAbandoned" value="true"/>
  40. <property name="removeAbandonedTimeout" value="60"/>
  41. <property name="jdbcInterceptors" value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"/>
  42. </bean>
  43. </property>
  44. </bean>
  45. <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
  46. <!-- 配置sqlSessionFactory -->
  47. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  48. <!-- mybatis配置文件的路径 -->
  49. <property name="configLocation" value="classpath:mybatis.xml" />
  50. <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
  51. <property name="dataSource" ref="dataSource" />
  52. <!-- 自动扫描/mapper/下所有以xml结尾的文件-->
  53. <property name="mapperLocations" value="classpath:/mapper/*.xml" />
  54. </bean>
  55. <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
  56. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  57. <property name="basePackage" value="com.zj.dao" />
  58. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  59. </bean>
  60. <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
  61. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  62. <property name="dataSource" ref="dataSource"></property>
  63. </bean>
  64. <!-- 设置事物增强 -->
  65. <tx:advice id="txAdvice" transaction-manager="txManager">
  66. <tx:attributes>
  67. <tx:method name="get*" read-only="true" />
  68. <tx:method name="find*" read-only="true" />
  69. <tx:method name="query*" read-only="true" />
  70. <tx:method name="load*" read-only="true" />
  71. <tx:method name="add*" rollback-for="Exception"/>
  72. <tx:method name="insert*" rollback-for="Exception" />
  73. <tx:method name="update*" rollback-for="Exception" />
  74. <tx:method name="delete*" rollback-for="Exception" />
  75. </tx:attributes>
  76. </tx:advice>
  77. <!-- 配置扫描器 -->
  78. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  79. <!-- 扫描com.shsxt.crm.dao这个包以及它的子包下的所有映射接口类 -->
  80. <property name="basePackage" value="com.zj.dao" />
  81. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  82. </bean>
  83. </beans>

准备spring-mvc.xml 配置视图 aop

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xmlns:task="http://www.springframework.org/schema/task"
  8. xsi:schemaLocation="
  9. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
  10. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  12. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  13. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd ">
  14. <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
  15. <context:component-scan base-package="com.zj.controller" />
  16. <mvc:annotation-driven />
  17. <!-- 静态资源文件的处理-->
  18. <mvc:default-servlet-handler />
  19. <!-- 启用@Aspect注解 -->
  20. <aop:aspectj-autoproxy />
  21. <!-- 视图配置 -->
  22. <bean id="freemarkerConfig"
  23. class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" >
  24. <property name="templateLoaderPath" value="/WEB-INF/views/" />
  25. <property name="defaultEncoding" value="UTF-8" />
  26. <property name="freemarkerSettings">
  27. <props>
  28. <prop key="number_format">0.##########</prop> <!--解决数字问题-->
  29. <prop key="boolean_format">true,false</prop> <!--解决页面布尔值的输出-->
  30. <prop key="tag_syntax">square_bracket</prop> <!-- auto_detect:自动选择(选择第一种标签语法) angle_bracket(<#if>) square_bracket[#if]-->
  31. <prop key="classic_compatible">true</prop> <!--非空不会报错-->
  32. <prop key="template_update_delay">0</prop> <!--缓存时间-->
  33. <prop key="default_encoding">UTF-8</prop>
  34. <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
  35. <prop key="date_format">yyyy-MM-dd</prop>
  36. <prop key="time_format">HH:mm:ss</prop>
  37. </props>
  38. </property>
  39. <property name="freemarkerVariables">
  40. <map>
  41. <entry key="student_list" value-ref="studentDirective" />
  42. </map>
  43. </property>
  44. </bean>
  45. <!-- 视图解析器 -->
  46. <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  47. <property name="prefix" value="" />
  48. <property name="suffix" value=".ftl" />
  49. <property name="contentType" value="text/html;charset=UTF-8"/>
  50. </bean>
  51. <!-- 文本转化 -->
  52. <mvc:annotation-driven>
  53. <mvc:message-converters>
  54. <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
  55. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
  56. </mvc:message-converters>
  57. </mvc:annotation-driven>
  58. </beans>

准备mybatis.xml 配置实体层和分页插件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. <!-- 通过别名简化对类的使用 -->
  6. <typeAliases>
  7. <!-- 通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的javabean, 并且默认设置一个别名,默认的名字为非限定类名来作为它的别名。 -->
  8. <package name="com.zj.model" />
  9. </typeAliases>
  10. <plugins>
  11. <!-- 分页插件配置 -->
  12. <plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
  13. <property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.MySQLDialect"/>
  14. </plugin>
  15. </plugins>
  16. </configuration>

准备log4j.porperties

  1. <span style="color:#666666;"># Global logging configuration
  2. log4j.rootLogger=INFO,stdout,file
  3. # MyBatis logging configuration...
  4. log4j.logger.com.sdrd.mapper=DEBUG
  5. #log4j.logger.org.mybatis.example.BlogMapper=TRACE
  6. # Console output...
  7. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  8. log4j.appender.stdout.Target=System.out
  9. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] %c{1}:%L - %m%n
  11. ### direct messages to file file.log ###
  12. #log4j.appender.file=org.apache.log4j.FileAppender
  13. log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
  14. log4j.appender.file.DatePattern='.'yyyy-MM-dd'.log'
  15. log4j.appender.file.Threshold = INFO
  16. log4j.appender.file.append=true
  17. log4j.appender.file.File=./logs/info.log
  18. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  19. log4j.appender.file.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %5p %c{1}:%L - %m%n

jdbc.porperties配置文件

  1. JDBC.username=root
  2. JDBC.password=root
  3. JDBC.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
  4. JDBC.driver=com.mysql.jdbc.Driver

这些文件都是放在resource下

70 4

web.xml配置 web项目的入口 配置扫描以上文件产生联动

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. version="3.0">
  6. <display-name>Archetype Created Web Application</display-name>
  7. <!-- Spring和mybatis的配置文件 -->
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:spring-mybatis.xml</param-value>
  11. </context-param>
  12. <!-- 编码过滤器 -->
  13. <filter>
  14. <filter-name>encodingFilter</filter-name>
  15. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  16. <async-supported>true</async-supported>
  17. <init-param>
  18. <param-name>encoding</param-name>
  19. <param-value>UTF-8</param-value>
  20. </init-param>
  21. </filter>
  22. <filter-mapping>
  23. <filter-name>encodingFilter</filter-name>
  24. <url-pattern>/*</url-pattern>
  25. </filter-mapping>
  26. <!-- Spring监听器 -->
  27. <listener>
  28. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  29. </listener>
  30. <!-- 防止Spring内存溢出监听器 -->
  31. <listener>
  32. <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  33. </listener>
  34. <!-- Spring MVC servlet -->
  35. <servlet>
  36. <servlet-name>SpringMVC</servlet-name>
  37. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  38. <init-param>
  39. <param-name>contextConfigLocation</param-name>
  40. <param-value>classpath:spring-mvc.xml</param-value>
  41. </init-param>
  42. <load-on-startup>1</load-on-startup>
  43. <async-supported>true</async-supported>
  44. </servlet>
  45. <servlet-mapping>
  46. <servlet-name>SpringMVC</servlet-name>
  47. <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
  48. <url-pattern>/</url-pattern>
  49. </servlet-mapping>
  50. <welcome-file-list>
  51. <welcome-file>/index.jsp</welcome-file>
  52. </welcome-file-list>
  53. </web-app>

2)准备实体类

70 5

因为要进行分页操作先定义一个BaseDto

  1. package com.zj.model;
  2. import com.github.miemiedev.mybatis.paginator.domain.Order;
  3. import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
  4. import org.apache.commons.lang3.StringUtils;
  5. public class BaseDto {
  6. private Integer page;
  7. private Integer pageSize;
  8. private String sort;
  9. public String getSort() {
  10. return sort;
  11. }
  12. public void setSort(String sort) {
  13. this.sort = sort;
  14. }
  15. public Integer getPage() {
  16. return page;
  17. }
  18. public void setPage(Integer page) {
  19. this.page = page;
  20. }
  21. public Integer getPageSize() {
  22. return pageSize;
  23. }
  24. public void setPageSize(Integer pageSize) {
  25. this.pageSize = pageSize;
  26. }
  27. public PageBounds buildPageBounds(){
  28. if(this.page == null||this.page<1){
  29. this.page = 1;
  30. }
  31. if(this.pageSize==null||this.pageSize<1){
  32. this.pageSize = 2;
  33. }
  34. PageBounds pageBounds = new PageBounds(this.page,this.pageSize);
  35. if (StringUtils.isNotBlank(this.sort)) {
  36. pageBounds.setOrders(Order.formString(this.sort));
  37. }
  38. return pageBounds;
  39. }
  40. }

接着定义User类和Student类

  1. package com.zj.model;
  2. import java.io.Serializable;
  3. public class User implements Serializable{
  4. private Integer userId;
  5. private String userName;
  6. private String userPassword;
  7. private Integer uid;
  8. public Integer getUid() {
  9. return uid;
  10. }
  11. public void setUid(Integer uid) {
  12. this.uid = uid;
  13. }
  14. public Integer getUserId() {
  15. return userId;
  16. }
  17. public void setUserId(Integer userId) {
  18. this.userId = userId;
  19. }
  20. public String getUserName() {
  21. return userName;
  22. }
  23. public void setUserName(String userName) {
  24. this.userName = userName;
  25. }
  26. public String getUserPassword() {
  27. return userPassword;
  28. }
  29. public void setUserPassword(String userPassword) {
  30. this.userPassword = userPassword;
  31. }
  32. @Override
  33. public String toString() {
  34. return "User{" +
  35. "userId=" + userId +
  36. ", userName='" + userName + '\'' +
  37. ", userPassword='" + userPassword + '\'' +
  38. ", uid=" + uid +
  39. '}';
  40. }
  41. }
  42. package com.zj.model;
  43. public class Student extends BaseDto{
  44. private Integer id;
  45. private String name;
  46. private Integer gender;
  47. private Integer age;
  48. private Integer uid;
  49. public Integer getUid() {
  50. return uid;
  51. }
  52. public void setUid(Integer uid) {
  53. this.uid = uid;
  54. }
  55. public Integer getId() {
  56. return id;
  57. }
  58. public void setId(Integer id) {
  59. this.id = id;
  60. }
  61. public String getName() {
  62. return name;
  63. }
  64. public void setName(String name) {
  65. this.name = name;
  66. }
  67. public Integer getGender() {
  68. return gender;
  69. }
  70. public void setGender(Integer gender) {
  71. this.gender = gender;
  72. }
  73. public Integer getAge() {
  74. return age;
  75. }
  76. public void setAge(Integer age) {
  77. this.age = age;
  78. }
  79. @Override
  80. public String toString() {
  81. return "Student{" +
  82. "id=" + id +
  83. ", name='" + name + '\'' +
  84. ", gender=" + gender +
  85. ", age=" + age +
  86. ", uid=" + uid +
  87. '}';
  88. }
  89. }

建完以后大家是不是发现有个IsLogin的注解类 这个注解是用来进行登录验证的 想想看 进行crud的时候是不是要登录以后才能进行 那我们利用aop和注解实现这么一个功能 在crud的方法上加上这个标签就可以实现这个功能是不是就很简单 开始

定义一个注解的名字

  1. package com.zj.model;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Target({ElementType.METHOD,ElementType.TYPE})
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface IsLogin {
  9. }

然后给这个注解加上功能

70 6

  1. package com.zj.proxy;
  2. import com.zj.exception.LoginException;
  3. import com.zj.model.IsLogin;
  4. import com.zj.model.User;
  5. import javafx.fxml.LoadException;
  6. import org.aspectj.lang.JoinPoint;
  7. import org.aspectj.lang.annotation.Aspect;
  8. import org.aspectj.lang.annotation.Before;
  9. import org.aspectj.lang.annotation.Pointcut;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Component;
  12. import javax.servlet.http.HttpSession;
  13. @Component
  14. @Aspect
  15. public class LoginProxy {
  16. @Autowired
  17. private HttpSession session;
  18. @Pointcut(value = "@annotation(com.zj.model.IsLogin)")
  19. private void pointcut(){
  20. }
  21. @Before(value="pointcut()")
  22. public void beforeMethod(JoinPoint joinPoint){
  23. User user = (User) session.getAttribute("user");
  24. System.out.println("-------进行登录验证-------");
  25. if(user == null){
  26. throw new LoginException("请先登录");
  27. }
  28. }
  29. }

接着来 定义一个结果类 什么操作都要有个结果 对吧 这样前台才好判断是不是执行成功或者失败 对吧

70 7

  1. package com.zj.result;
  2. public class ResultInfo {
  3. String mes;
  4. int code;
  5. public ResultInfo(){
  6. }
  7. public ResultInfo(String mes){
  8. this.mes = mes;
  9. }
  10. public String getMes() {
  11. return mes;
  12. }
  13. public void setMes(String mes) {
  14. this.mes = mes;
  15. }
  16. public int getCode() {
  17. return code;
  18. }
  19. public void setCode(int code) {
  20. this.code = code;
  21. }
  22. }

2)准备工具类和异常类

70 8

  1. package com.zj.exception;
  2. import com.alibaba.fastjson.JSON;
  3. import com.zj.controller.BaseController;
  4. import com.zj.result.ResultInfo;
  5. import org.springframework.ui.Model;
  6. import org.springframework.web.bind.annotation.ControllerAdvice;
  7. import org.springframework.web.bind.annotation.ExceptionHandler;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.io.IOException;
  11. import java.io.PrintWriter;
  12. @ControllerAdvice
  13. public class GlobalExceptionHandler extends BaseController {
  14. @ExceptionHandler(value = LoginException.class)
  15. public String handlerParamException(LoginException loginException, HttpServletRequest request,
  16. HttpServletResponse response,Model model){
  17. model.addAttribute("proPath", request.getContextPath());
  18. String xmlHttpRequest = request.getHeader("X-Requested-With");
  19. return "login";
  20. }
  21. }
  22. package com.zj.exception;
  23. public class LoginException extends RuntimeException {
  24. private int errCode;
  25. public int getErrCode() {
  26. return errCode;
  27. }
  28. public void setErrCode(int errCode) {
  29. this.errCode = errCode;
  30. }
  31. public LoginException(){
  32. }
  33. public LoginException(String mes) {
  34. super(mes);
  35. }
  36. }
  37. package com.zj.exception;
  38. public class ParameterException extends RuntimeException {
  39. public ParameterException(){
  40. }
  41. public ParameterException(String mes){
  42. super(mes);
  43. }
  44. }

70 9

  1. package com.zj.util;
  2. import com.zj.exception.ParameterException;
  3. public class AssertUtil {
  4. public static void isNull(Object value){
  5. if(value == null){
  6. throw new ParameterException("不能空");
  7. }
  8. }
  9. }

3)准备dao,service和controller的编写

再来写用户登陆的Dao层和对学生操作的Dao层

70 10

  1. package com.zj.dao;
  2. import com.zj.model.User;
  3. import org.apache.ibatis.annotations.Select;
  4. import org.springframework.stereotype.Repository;
  5. import java.util.List;
  6. @Repository
  7. public interface UserDao {
  8. @Select("select * from usertable where userName =#{userName} and userPassword =#{userPassword}")
  9. public User login(User user);
  10. /*测试*/
  11. List<User> test();
  12. }
  13. package com.zj.dao;
  14. import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
  15. import com.github.miemiedev.mybatis.paginator.domain.PageList;
  16. import com.zj.model.Student;
  17. import org.apache.ibatis.annotations.Delete;
  18. import org.apache.ibatis.annotations.Param;
  19. import org.apache.ibatis.annotations.Select;
  20. import org.apache.ibatis.annotations.Update;
  21. import org.springframework.stereotype.Repository;
  22. @Repository
  23. public interface StudentDao {
  24. @Select("select a.* from student a,usertable b where a.uid=b.uid and limit #{limit}")
  25. PageList<Student> findListStudent(@Param(value = "limit") Integer limit);
  26. @Select("select * from student ")
  27. PageList<Student> findStudent(PageBounds pageBounds);
  28. @Select("select a.* from student a,usertable b where a.uid=b.uid and a.id=#{id}")
  29. Student findStudentById(@Param(value = "id") Integer id);
  30. @Update({"insert student(name,gender,age,uid) values(#{name},#{gender},#{age},#{uid})"})
  31. void addStudent(Student student);
  32. @Update({"UPDATE student set name=#{name},gender=#{gender},age=#{age} where id = #{id} and uid=#{uid}"})
  33. void updateStudent(Student student);
  34. @Delete("delete from student where id=#{id} and uid=#{uid}")
  35. void deleteStudent(@Param(value = "id") Integer id,@Param(value = "uid") Integer uid);
  36. }

接着来service层

70 11

  1. package com.zj.service;
  2. import com.zj.dao.UserDao;
  3. import com.zj.model.User;
  4. import com.zj.util.RedisUtil;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. @Service
  9. public class UserService{
  10. @Autowired
  11. private UserDao userDao;
  12. private Logger log = Logger.getLogger(UserService.class);
  13. RedisUtil r = new RedisUtil();
  14. public User login(User user,String id) {
  15. log.info("用户登录:"+user);
  16. return userDao.login(user);
  17. }
  18. }
  19. package com.zj.service;
  20. import com.github.miemiedev.mybatis.paginator.domain.PageList;
  21. import com.zj.dao.StudentDao;
  22. import com.zj.model.Student;
  23. import com.zj.result.ResultInfo;
  24. import com.zj.util.AssertUtil;
  25. import org.apache.log4j.Logger;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Service;
  28. import java.util.List;
  29. @Service
  30. public class StudentService {
  31. @Autowired
  32. private StudentDao studentDao;
  33. private static Logger log = Logger.getLogger(StudentService.class);
  34. public ResultInfo addStudent(Integer uid,Student student){
  35. ResultInfo resultInfo = new ResultInfo();
  36. log.info("addStudent入参:"+resultInfo);
  37. if(student!=null){
  38. student.setUid(uid);
  39. studentDao.addStudent(student);
  40. resultInfo.setCode(200);
  41. resultInfo.setMes("添加成功");
  42. return resultInfo;
  43. }
  44. resultInfo.setCode(300);
  45. resultInfo.setMes("添加失败");
  46. return resultInfo;
  47. }
  48. public ResultInfo updateStudent(Student student,Integer uid){
  49. ResultInfo resultInfo = new ResultInfo();
  50. log.info("updateStudent入参:"+student.toString());
  51. if(student!=null){
  52. student.setUid(uid);
  53. studentDao.updateStudent(student);
  54. resultInfo.setCode(200);
  55. resultInfo.setMes("添加成功");
  56. return resultInfo;
  57. }
  58. resultInfo.setCode(300);
  59. resultInfo.setMes("添加失败");
  60. return resultInfo;
  61. }
  62. public void deleteStudent(Integer id,Integer uid){
  63. AssertUtil.isNull(id);
  64. studentDao.deleteStudent(id,uid);
  65. log.info("deleteStudents删除ID:"+id);
  66. }
  67. public Student findStudentById(Integer id,Integer uid){
  68. AssertUtil.isNull(id);
  69. log.info("findStudentById寻找ID:"+id);
  70. return studentDao.findStudentById(id);
  71. }
  72. public PageList<Student> findListStudent(Integer limit){
  73. PageList<Student> students = studentDao.findListStudent(limit);
  74. return students;
  75. }
  76. public PageList<Student> findStudent(Student student){
  77. PageList<Student> students = studentDao.findStudent(student.buildPageBounds());
  78. return students;
  79. }
  80. }

再来controller层

70 12

首先来个BaseController 存储项目路径(tomcat启动的有用)

  1. package com.zj.controller;
  2. import org.springframework.ui.Model;
  3. import org.springframework.web.bind.annotation.ModelAttribute;
  4. import javax.servlet.http.HttpServletRequest;
  5. public class BaseController {
  6. @ModelAttribute
  7. protected void preMethod(HttpServletRequest request, Model model) {
  8. String ctx = request.getContextPath();
  9. System.out.println("ctx------------->"+ctx);
  10. model.addAttribute("proPath",ctx);
  11. }
  12. }

接着用户和学生的controller层

  1. package com.zj.controller;
  2. import com.zj.model.User;
  3. import com.zj.result.ResultInfo;
  4. import com.zj.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.ResponseBody;
  9. import javax.annotation.Resource;
  10. import javax.imageio.ImageIO;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14. import java.awt.*;
  15. import java.awt.image.BufferedImage;
  16. import java.io.IOException;
  17. import java.util.Random;
  18. @Controller
  19. @RequestMapping("user")
  20. public class UserController extends BaseController{
  21. @Autowired
  22. private UserService userService;
  23. /*
  24. * 登录操作
  25. * */
  26. @RequestMapping("login")
  27. @ResponseBody
  28. public ResultInfo login(User user, HttpServletRequest request, HttpSession session){
  29. ResultInfo resultInfo = new ResultInfo();
  30. String id = request.getSession().getId();
  31. User acc= userService.login(user,id);
  32. System.out.println("sessioid---------------->"+id);
  33. if(acc!=null){
  34. //存session
  35. session.setAttribute("user", acc);
  36. resultInfo.setCode(200);
  37. resultInfo.setMes("登陆成功");
  38. return resultInfo;
  39. }
  40. resultInfo.setCode(300);
  41. resultInfo.setMes("登录失败");
  42. return resultInfo;
  43. }
  44. /*
  45. * 跳转主页
  46. * */
  47. @RequestMapping("index")
  48. public String index(HttpServletRequest request, HttpSession session){
  49. User user = (User)session.getAttribute("user");
  50. if(user!=null){
  51. return "redirect:/student/main";
  52. }
  53. return "login";
  54. }
  55. /*
  56. * 登出操作
  57. * */
  58. @RequestMapping("out")
  59. public String out(HttpSession session){
  60. session.removeAttribute("user");
  61. return "login";
  62. }
  63. /*
  64. * 生成验证码
  65. * */
  66. @RequestMapping("yzm")
  67. public void sendYzm(HttpServletRequest request, HttpServletResponse response) throws IOException {
  68. // 图片高度
  69. final int IMG_HEIGHT = 100;
  70. // 图片宽度
  71. final int IMG_WIDTH = 25;
  72. // 验证码长度
  73. final int CODE_LEN = 4;
  74. // 用于绘制图片,设置图片的长宽和图片类型(RGB)
  75. BufferedImage bi = new BufferedImage(IMG_HEIGHT, IMG_WIDTH, BufferedImage.TYPE_INT_RGB);
  76. // 获取绘图工具
  77. Graphics graphics = bi.getGraphics();
  78. graphics.setColor(new Color(100, 230, 200)); // 使用RGB设置背景颜色
  79. graphics.fillRect(0, 0, 100, 30); // 填充矩形区域
  80. // 验证码中所使用到的字符
  81. char[] codeChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456".toCharArray();
  82. String captcha = ""; // 存放生成的验证码
  83. Random random = new Random();
  84. for(int i = 0; i < CODE_LEN; i++) { // 循环将每个验证码字符绘制到图片上
  85. int index = random.nextInt(codeChar.length);
  86. // 随机生成验证码颜色
  87. graphics.setColor(new Color(random.nextInt(150), random.nextInt(200), random.nextInt(255)));
  88. // 将一个字符绘制到图片上,并制定位置(设置x,y坐标)
  89. graphics.drawString(codeChar[index] + "", (i * 20) + 15, 20);
  90. captcha += codeChar[index];
  91. }
  92. // 将生成的验证码code放入sessoin中
  93. request.getSession().setAttribute("code", captcha);
  94. // 通过ImageIO将图片输出
  95. ImageIO.write(bi, "JPG", response.getOutputStream());
  96. }
  97. /*
  98. * 验证码校验
  99. * */
  100. @RequestMapping("check")
  101. @ResponseBody
  102. public ResultInfo checkYzm(HttpServletRequest request, HttpServletResponse response){
  103. ResultInfo resultInfo = new ResultInfo();
  104. // 获取存放在session中的验证码
  105. String code = (String) request.getSession().getAttribute("code");
  106. // 获取页面提交的验证码
  107. String inputCode = request.getParameter("code");
  108. if(code.toLowerCase().equals(inputCode.toLowerCase())) { // 验证码不区分大小写
  109. // 验证成功,跳转到成功页面
  110. resultInfo.setCode(200);
  111. } else { // 验证失败
  112. resultInfo.setCode(300);
  113. resultInfo.setMes("验证码错误");
  114. }
  115. return resultInfo;
  116. }
  117. }
  118. package com.zj.controller;
  119. import com.github.miemiedev.mybatis.paginator.domain.PageList;
  120. import com.zj.model.IsLogin;
  121. import com.zj.model.Student;
  122. import com.zj.model.User;
  123. import com.zj.result.ResultInfo;
  124. import com.zj.service.StudentService;
  125. import org.springframework.beans.factory.annotation.Autowired;
  126. import org.springframework.stereotype.Controller;
  127. import org.springframework.ui.Model;
  128. import org.springframework.web.bind.annotation.PathVariable;
  129. import org.springframework.web.bind.annotation.RequestMapping;
  130. import org.springframework.web.bind.annotation.ResponseBody;
  131. import javax.servlet.http.HttpServletRequest;
  132. import javax.servlet.http.HttpSession;
  133. @Controller
  134. @RequestMapping("student")
  135. public class StudentController extends BaseController{
  136. @Autowired
  137. private StudentService studentService;
  138. /*
  139. * 添加操作
  140. * */
  141. @RequestMapping("add")
  142. @ResponseBody
  143. @IsLogin
  144. public ResultInfo addStudent(HttpServletRequest request,Student student){
  145. HttpSession session = request.getSession();
  146. User user = (User)session.getAttribute("user");
  147. int uid = user.getUid();
  148. return studentService.addStudent(uid,student);
  149. }
  150. /*
  151. * 跳转添加视图
  152. * */
  153. @RequestMapping("addView")
  154. @IsLogin
  155. public String addView(){
  156. return "addView";
  157. }
  158. /*
  159. * 跳转主页
  160. * */
  161. @RequestMapping("main")
  162. @IsLogin
  163. public String findListStudent(Student student, Model model){
  164. PageList<Student> students = studentService.findStudent(student);
  165. model.addAttribute("students",students);
  166. model.addAttribute("pagenator",students.getPaginator());
  167. model.addAttribute("student",student);
  168. return "main";
  169. }
  170. /*
  171. * 删除操作
  172. * */
  173. @RequestMapping("delete/{id}")
  174. @IsLogin
  175. public String deleteStudent(@PathVariable Integer id,@PathVariable Integer uid){
  176. studentService.deleteStudent(id,uid);
  177. return "redirect:/student/main";
  178. }
  179. /*
  180. * 跳转编辑页面
  181. * */
  182. @RequestMapping("updateView/{id}")
  183. @IsLogin
  184. public String updateView(@PathVariable Integer id,Model model,HttpSession session){
  185. User user = (User) session.getAttribute("user");
  186. Student student = studentService.findStudentById(id,user.getUid());
  187. model.addAttribute("student",student);
  188. return "update";
  189. }
  190. /*
  191. * 编辑操作
  192. * */
  193. @RequestMapping("update")
  194. @ResponseBody
  195. public ResultInfo updateStudent(Student student, HttpServletRequest request, HttpSession session){
  196. User user = (User) session.getAttribute("user");
  197. /*if(user == null){
  198. ResultInfo resultInfo = new ResultInfo();
  199. resultInfo.setCode(300);
  200. resultInfo.setMes("请先登录");
  201. return resultInfo;
  202. }*/
  203. return studentService.updateStudent(student,user.getUid());
  204. }
  205. }

其实我这不规范 对逻辑的处理都应该放在service层的 懒得改了… 有兴趣的同学自行修改

因为前台使用的freemark所以 页面的展示数据我通过TemplateDirectiveModel实现

70 13

  1. package com.zj.directive;
  2. import com.alibaba.fastjson.JSON;
  3. import freemarker.core.Environment;
  4. import freemarker.ext.beans.BeansWrapper;
  5. import freemarker.ext.beans.BeansWrapperBuilder;
  6. import freemarker.template.*;
  7. import java.io.IOException;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. public abstract class BaseDirective implements TemplateDirectiveModel{
  11. //获取参数值
  12. public <T> T getParameter(String paramName,Map params,Class<?> clazz)
  13. throws TemplateException{
  14. BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build();
  15. //获取参数
  16. TemplateModel templateModel = (TemplateModel) params.get(paramName);
  17. T value = (T) beansWrapper.unwrap(templateModel, clazz);
  18. return value;
  19. }
  20. //输出
  21. public void setVariable(Environment env, TemplateDirectiveBody body,String key,Object value)
  22. throws TemplateException,IOException{
  23. BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build();
  24. TemplateModel templateModel = beansWrapper.wrap(value);
  25. env.setVariable(key, templateModel);
  26. // 输出
  27. if (body != null) {
  28. body.render(env.getOut());
  29. } else {
  30. env.getOut().write(JSON.toJSONString(value));
  31. }
  32. }
  33. }
  34. package com.zj.directive;
  35. import com.alibaba.fastjson.JSON;
  36. import com.zj.model.Student;
  37. import com.zj.model.User;
  38. import com.zj.service.StudentService;
  39. import com.zj.service.UserService;
  40. import freemarker.core.Environment;
  41. import freemarker.ext.beans.BeansWrapper;
  42. import freemarker.ext.beans.BeansWrapperBuilder;
  43. import freemarker.template.*;
  44. import org.springframework.beans.factory.annotation.Autowired;
  45. import org.springframework.stereotype.Component;
  46. import java.io.IOException;
  47. import java.util.List;
  48. import java.util.Map;
  49. @Component
  50. public class StudentDirective extends BaseDirective{
  51. @Autowired
  52. private StudentService studentService;
  53. @Override
  54. public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
  55. Integer limit = getParameter("limit", params, Integer.class);
  56. List<Student> students = studentService.findListStudent(limit);
  57. setVariable(env,body,"students",students);
  58. }
  59. }

4)全部完成后 进行前台页面的编写

70 14

登录页

  1. <html>
  2. <head>
  3. <title>Login page</title>
  4. <script src="${proPath}/statics/js/jquery-1.11.3.js"></script>
  5. <script src="${proPath}/statics/js/jquery.js"></script>
  6. <script type="text/javascript">
  7. function flushCode() {
  8. // 每次刷新的时候获取当前时间,防止浏览器缓存刷新失败
  9. var time = new Date();
  10. document.getElementById("scode").src = "${proPath}/user/yzm?time=" + time;
  11. }
  12. function check() {
  13. var userName = $("#name").val();
  14. var password = $("#password").val();
  15. if(userName == ""){
  16. alert("用户名不能为空");
  17. return;
  18. }
  19. if(password == ""){
  20. alert("密码不能为空");
  21. return;
  22. }
  23. $.ajax({
  24. url:'${proPath}/user/check',
  25. data:{
  26. code:$("#yzm").val()
  27. },
  28. type:'post',
  29. dataType:'json',
  30. success:function (data) {
  31. if(data.code==200){
  32. $.ajax({
  33. url:'${proPath}/user/login',
  34. data:{
  35. userName:userName,
  36. userPassword:password
  37. },
  38. type:'post',
  39. dataType:'json',
  40. success:function (data) {
  41. if(data.code == 200){
  42. window.location.href="${proPath}/student/main";
  43. }else{
  44. alert(data.mes);
  45. }
  46. }
  47. })
  48. }else{
  49. alert(data.mes);
  50. }
  51. }
  52. })
  53. }
  54. </script>
  55. </head>
  56. <body>
  57. <div id="loginDiv">
  58. <div style="position:absolute;width:500px;height:200px;top:200px;left:550px">
  59. <table border="">
  60. <tr>
  61. <td>
  62. <label for="name">账号:</label>
  63. </td>
  64. <td>
  65. <input type="text" id="name" name="userName" />
  66. </td>
  67. </tr>
  68. <tr>
  69. <td>
  70. <label for="password">密码:</label>
  71. </td>
  72. <td>
  73. <input type="text" id="password" name="userPassword" />
  74. </td>
  75. </tr>
  76. <tr>
  77. <td>
  78. <label for="yzm">验证码:</label>
  79. </td>
  80. <td>
  81. <input type="text" id="yzm" name="userYzm" />
  82. <img alt="验证码" id="scode" src="${proPath}/user/yzm" >
  83. <a href="#" onclick="javascript:flushCode();">看不清?</a>
  84. </td>
  85. </tr>
  86. <tr>
  87. <td colspan="2" align="center">
  88. <button type="button" onclick="check()">登录</button>
  89. </td>
  90. </tr>
  91. </table>
  92. </div>
  93. <div style="color:red">${requestScope.msg}</div>
  94. </div>
  95. </body>
  96. </html>

主页

  1. <html xmlns="http://www.w3.org/1999/html">
  2. <head>
  3. <title>Main</title>
  4. <script src="${proPath}/statics/js/jquery.js" type=text/javascript></script>
  5. <script type="text/javascript">
  6. $(function () {
  7. $.pageSkip = function(pageNumber) {
  8. $("#pageNumber").val(pageNumber);
  9. $("#student").submit();
  10. return false;
  11. }
  12. })
  13. </script>
  14. </head>
  15. <body>
  16. <div style="position:absolute;width:500px;height:200px;top:200px;left:550px">
  17. <form id="student" action="${proPath}/student/main" method="post">
  18. <input type="hidden" id="pageNumber" name="page" value="${student.page}" />
  19. <input type="hidden" id="pageSize" name="pageSize" value="${student.pageSize}" />
  20. <table border="">
  21. <tr>
  22. <td>编号</td>
  23. <td>姓名</td>
  24. <td>级别</td>
  25. <td>年龄</td>
  26. <td>操作</td>
  27. </tr>
  28. [#if students?has_content]
  29. [#list students as student]
  30. <tr>
  31. <td>${student.id}</td>
  32. <td>${student.name}</td>
  33. <td>${student.gender}</td>
  34. <td>${student.age}</td>
  35. <td>
  36. [#--<a href="${proPath}/student/buyView/${student.id}">购买</a>|--]
  37. <a href="${proPath}/student/updateView/${student.id}">编辑</a>|
  38. <a href="${proPath}/student/delete/${student.id}">删除</a>
  39. </td>
  40. </tr>
  41. [/#list]
  42. [#else]
  43. <tr align="center">
  44. <td colspan="5">无数据...</td>
  45. </tr>
  46. [/#if]
  47. <tr align="center">
  48. <td colspan="5">
  49. [#if pagenator.totalPages>1]
  50. [#if pagenator.isFirstPage()]
  51. [#else]
  52. <a href="javascript: $.pageSkip(1);" class="">首页</a>
  53. [/#if]
  54. [#if pagenator.hasPrePage]
  55. <a href="javascript: $.pageSkip(${pagenator.prePage});" class="previousPage">上一页</a>
  56. [#else]
  57. <span class="previousPage"> </span>
  58. [/#if]
  59. [#list pagenator.slider(3) as slider ]
  60. [#if slider==pagenator.page ]
  61. <span class="currentPage">${slider}</span>
  62. [#else]
  63. <a href="javascript: $.pageSkip(${slider});">${slider}</a>
  64. [/#if]
  65. [/#list]
  66. [#if pagenator.hasNextPage]
  67. <a href="javascript: $.pageSkip(${pagenator.nextPage});" class="nextPage">下一页</a>
  68. [#else]
  69. <span class="nextPage"> </span>
  70. [/#if]
  71. [#if pagenator.isLastPage()]
  72. <span class="lastPage" > </span>
  73. [#else]
  74. <a href="javascript: $.pageSkip(${pagenator.totalPages});" class="lastPage">末页</a>
  75. [/#if]
  76. [/#if]
  77. </td>
  78. </tr>
  79. <tr align="center" >
  80. <td colspan="5">
  81. <a href="${proPath}/student/addView">添加</a>
  82. <a href="${proPath}/user/out">退出</a>
  83. </td>
  84. </tr>
  85. </table>
  86. </form
  87. </div>
  88. </body>
  89. </html>

添加页

  1. <html>
  2. <head>
  3. <title>Main</title>
  4. <script src="${proPath}/statics/js/jquery.js" type=text/javascript></script>
  5. <script type="text/javascript">
  6. $(function(){
  7. $("#back").click(function () {
  8. window.location.href="main";
  9. })
  10. $("#add").click(function () {
  11. var name = $("#name").val();
  12. var gender = $("#gender").val();
  13. var age = $("#age").val();
  14. if(name!=""&&gender!=""&&age!=""){
  15. $.ajax({
  16. type:'post',
  17. url:'${proPath}/student/add',
  18. data:$('#form').serialize(),
  19. dataType:'json',
  20. success:function (data) {
  21. console.log('...');
  22. if(data.code==200){
  23. console.log(data.mes);
  24. window.location.href="main";
  25. }else{
  26. console.log(data.mes);
  27. }
  28. }
  29. })
  30. }else{
  31. alert("请填写完整...");
  32. }
  33. })
  34. })
  35. </script>
  36. </head>
  37. <body>
  38. <div style="position:absolute;width:500px;height:200px;top:200px;left:550px">
  39. <form id="form" method="post" >
  40. <table border="">
  41. <tr>
  42. <td>姓名</td>
  43. <td><input id="name" type="text" name="name"/></td>
  44. </tr>
  45. <tr>
  46. <td>级别</td>
  47. <td><input id="gender" type="text" name="gender"/></td>
  48. </tr>
  49. <tr>
  50. <td>年龄</td>
  51. <td><input id="age" type="text" name="age"/></td>
  52. </tr>
  53. <tr align="center">
  54. <td colspan="4">
  55. <button type="button" id="add">添加</button>
  56. <button type="button" id="back">返回</button>
  57. </td>
  58. </tr>
  59. </table>
  60. </form>
  61. </div>
  62. </body>
  63. </html>

编辑页

  1. <html>
  2. <head>
  3. <title>Main</title>
  4. <script src="${proPath}/statics/js/jquery.js" type=text/javascript></script>
  5. <script type="text/javascript">
  6. $(function(){
  7. $("#back").click(function () {
  8. window.location.href="${proPath}/student/main";
  9. })
  10. $("#update").click(function () {
  11. var name = $("#name").val();
  12. var gender = $("#gender").val();
  13. var age = $("#age").val();
  14. if(name!=""&&gender!=""&&age!=""){
  15. $.ajax({
  16. type:'post',
  17. url:'${proPath}/student/update',
  18. data:$('#form').serialize(),
  19. dataType:'json',
  20. success:function (data) {
  21. console.log('...');
  22. if(data.code==200){
  23. console.log(data.mes);
  24. window.location.href="${proPath}/student/main";
  25. }else{
  26. window.location.href="${proPath}/user/index";
  27. }
  28. }
  29. })
  30. }else{
  31. alert("请填写完整...");
  32. }
  33. })
  34. })
  35. </script>
  36. </head>
  37. <body>
  38. <div style="position:absolute;width:500px;height:200px;top:200px;left:550px">
  39. <form id="form" method="post" >
  40. <input type="hidden" id="id" name="id" value="${student.id}" />
  41. <table border="">
  42. <tr>
  43. <td>姓名</td>
  44. <td><input id="name" type="text" name="name" value="${student.name}"/></td>
  45. </tr>
  46. <tr>
  47. <td>级别</td>
  48. <td><input id="gender" type="text" name="gender" value="${student.gender}"/></td>
  49. </tr>
  50. <tr>
  51. <td>年龄</td>
  52. <td><input id="age" type="text" name="age" value="${student.age}"/></td>
  53. </tr>
  54. <tr align="center">
  55. <td colspan="4">
  56. <button type="button" id="update">修改</button>
  57. <button type="button" id="back">返回</button>
  58. </td>
  59. </tr>
  60. </table>
  61. </form>
  62. </div>
  63. </body>
  64. </html>

五.数据库的表新建

用的mysql 两张表

CREATE TABLE `usertable` (
`userId` int(11) DEFAULT NULL,
`userName` varchar(255) DEFAULT NULL,
`userPassword` varchar(255) DEFAULT NULL,
`uid` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`gender` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`uid` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

六.完成

以上搭建完成后 最后配置jetty运行

70 15

七.结语

写的比较粗糙 大致介绍了ssm框架的基本操作 关于ssm结合xml进行sql编写的配置请看

https://blog.csdn.net/weixin_41634885/article/details/82022187

有问题留言

发表评论

表情:
评论列表 (有 0 条评论,391人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SSM实现查询

    前言 > 分页基本上是我们项目中所必须的功能,当数据量过大时,可能会导致各种各样的问题发生,例如:服务器资源被耗尽,因数据传输量过大而使处理超时,等等。最终都会导致查询无