Maven 搭建 SSM 项目 (oracle) 设计模式、三层架构的讲解

简单谈一下maven搭建 ssm 项目 (使用数据库oracle,比 mysql 麻烦一点,所以这里谈一下)

并实现注册登录功能。

在创建maven 的web项目时,常常会缺了main/java , main/test 两个文件夹。

解决方法:

① : 在项目上右键选择properties,然后点击java build path,在Librarys下,编辑JRE System Library,选择workspace default jre就可以了。 (推荐使用这种)

② :手动创建 目录。切换视图采用Navigator视图,直接在src/main目录下建立 Java目录。

项目目录结构:

在这普及一下 mvc 设计模式:

MVC 设计模式:单向

mvc 概念:

MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),即为MVC。它是一种软件设计的典范

mvc 详解:

虽然MVC并不是Java当中独有的,但是现在几乎所有的B/S的架构都采用了 MVC 框架模式,但是 MVC 在B/S架构中并没有完全地实现,其实我们根本不需要掌握未实现的部分。 

模型 Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受视图数据的请求,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。

视图 View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。 

控制器 Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请 求转发; 

MVC 模式被广泛用于 Java 的各种框架中,比如 Struts2、Spring MVC 等等都用到了这种思想

顺带讲一下 MVVM 设计模式:双向

Model : 实体模型(biz/bean)

View : 布局文件(XML)

ViewModel : 对外暴露出公共属性,View和Model的绑定器

1.  可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。 在Android中,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化。

2.  低耦合。以前Activity、Fragment中需要把数据填充到View,还要进行一些视图逻辑。现在这些都可在布局中完成,甚至都不需要再Activity、Fragment去findViewById()。这时候Activity、Fragment只需要做好的逻辑处理就可以了。

目录结构的解释:

Java web 经典三层架构:

控制层(表现层):controller层(Handler层):

  采用 MVC 模式。 model(模型) view(视图) Controller(控制)
  M称为模型,也就是实体类。用于数据的封装和数据的传输。 
  V为视图,也就是GUI组件,用于数据的展示。 
  C为控制,也就是事件,用于流程的控制。

  负责具体的业务模块流程的控制,

  • 在此层里面要调用Service层的接口来控制业务流程;
  • 控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。

持久层(数据层):dao层(mapper):

  DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此, 

  • DAO层的设计首先是设计DAO的接口;
  • 然后在Spring的配置文件中定义此接口的实现类;
  • 然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰;
  • DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。

业务层:service层:

  Service层主要负责业务模块的逻辑应用设计。 

  • 首先设计接口,再设计其实现的类
  • 接着再在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。
  • Service层的业务实现,具体要调用到已定义的DAO层的接口,
  • 封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。

实体类:entity:

  每个对象作为一个实体类,一般设置很多的私有属性,并有相应的setter和getter方法。 

  做相关数据表的映射

  对象属性的封装,体现了oo思想

核心包:core:包含模拟的核心类和接口类

工具包:util:包含所用到的一些工具类

重要的配置文件:

对象模型配置文件: pom.xml

Spring的配置文件:applicationContext.xml

spring MVC配置文件: springmvc.xml 

数据库配置文件: jdbc.properties

日志配置文件: log4j.properties

mybatis配置文件: mybatis-config.xml

网络程序配置文件:web.xml

首先配置pom.xml

pom.xml 主要描述了项目的maven坐标,依赖关系,自动引入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.krry</groupId>
  5     <artifactId>maven_SSM</artifactId>
  6     <version>0.0.1-SNAPSHOT</version>
  7     <name>maven_SSM</name>
  8     <url>http://maven.apache.org</url>
  9 
 10     <dependencies>
 11         <!--引入junit  -->
 12         <dependency>
 13           <groupId>junit</groupId>
 14           <artifactId>junit</artifactId>
 15           <version>4.11</version>
 16           <scope>test</scope>
 17         </dependency>
 18         <!--引入servlet  -->
 19         <dependency>
 20             <groupId>javax.servlet</groupId>
 21             <artifactId>servlet-api</artifactId>
 22             <version>3.0-alpha-1</version>
 23             <scope>provided</scope>
 24         </dependency>
 25         <!--引入jstl的包  -->
 26         <dependency>
 27             <groupId>jstl</groupId>
 28             <artifactId>jstl</artifactId>
 29             <version>1.2</version>
 30             <scope>provided</scope>
 31          </dependency>
 32          
 33          <!--引入jsp的编译依赖  -->
 34          <dependency>
 35             <groupId>javax.servlet.jsp</groupId>
 36             <artifactId>jsp-api</artifactId>
 37             <version>2.2</version>
 38             <scope>provided</scope>
 39          </dependency>
 40          
 41          <!--引入log4j  -->
 42          <dependency>
 43             <groupId>log4j</groupId>
 44             <artifactId>log4j</artifactId>
 45             <version>1.2.17</version>
 46           </dependency>
 47          
 48          <!--spring springmvc mybatis  -->
 49          <!-- spring和springmvc相关的构建  jar -->    
 50          <dependency>
 51             <groupId>org.springframework</groupId>
 52             <artifactId>spring-context</artifactId>
 53             <version>4.2.1.RELEASE</version>
 54           </dependency>
 55           
 56           <dependency>
 57             <groupId>org.springframework</groupId>
 58             <artifactId>spring-jdbc</artifactId>
 59             <version>4.2.1.RELEASE</version>
 60           </dependency>
 61                
 62           <!-- springmvc相关 -->
 63          <dependency>
 64             <groupId>org.springframework</groupId>
 65             <artifactId>spring-webmvc</artifactId>
 66             <version>4.2.1.RELEASE</version>
 67           </dependency>
 68           
 69           <!--springmvc需要用到json的转换包 jackson  -->
 70          <dependency>
 71             <groupId>com.fasterxml.jackson.core</groupId>
 72             <artifactId>jackson-core</artifactId>
 73             <version>2.5.4</version>
 74           </dependency>
 75           
 76           <dependency>
 77             <groupId>com.fasterxml.jackson.core</groupId>
 78             <artifactId>jackson-annotations</artifactId>
 79             <version>2.5.4</version>
 80           </dependency>
 81          
 82          <dependency>
 83             <groupId>com.fasterxml.jackson.core</groupId>
 84             <artifactId>jackson-databind</artifactId>
 85             <version>2.5.4</version>
 86           </dependency>
 87           
 88           <!--JSR303 后台校验 hibernate validator -->     
 89          <dependency>
 90             <groupId>org.hibernate</groupId>
 91             <artifactId>hibernate-validator</artifactId>
 92             <version>5.1.1.Final</version>
 93           </dependency>
 94          
 95          <!--上传文件相关的jar包  -->
 96          <dependency>
 97             <groupId>commons-io</groupId>
 98             <artifactId>commons-io</artifactId>
 99             <version>2.4</version>
100           </dependency>
101           
102           <dependency>
103             <groupId>commons-fileupload</groupId>
104             <artifactId>commons-fileupload</artifactId>
105             <version>1.3.1</version>
106           </dependency>
107           
108           <dependency>
109             <groupId>org.apache.commons</groupId>
110             <artifactId>commons-lang3</artifactId>
111             <version>3.3.2</version>
112           </dependency>
113           
114           <!--跟加密算法相关的codeC  -->
115         <dependency>
116             <groupId>commons-codec</groupId>
117             <artifactId>commons-codec</artifactId>
118             <version>1.9</version>
119         </dependency>
120          
121          <!--orm或者jdbc组件需要用到的jar包 mybatis  -->
122         <!--oracle数据库驱动  -->
123         <dependency>
124             <groupId>com.oracle</groupId>    
125             <artifactId>ojdbc6</artifactId>    
126             <version>12.1.0.2.0</version>
127         </dependency>
128         <!--mysql数据库驱动 (这里不用,用的是上面的oracle驱动) -->
129         <!-- 
130         <dependency>
131             <groupId>mysql</groupId>
132             <artifactId>mysql-connector-java</artifactId>
133             <version>5.0.8</version>
134             <scope>runtime</scope>
135         </dependency>
136         -->
137         
138         <!-- proxool连接池 -->
139         <dependency>
140             <groupId>com.cloudhopper.proxool</groupId>
141             <artifactId>proxool</artifactId>
142             <version>0.9.1</version>
143         </dependency>
144         <dependency>
145             <groupId>com.cloudhopper.proxool</groupId>
146             <artifactId>proxool-cglib</artifactId>
147             <version>0.9.1</version>
148         </dependency>
149 
150 
151          <!--引入mybatis需要的jar包  -->
152          <dependency>
153             <groupId>org.mybatis</groupId>
154             <artifactId>mybatis</artifactId>
155             <version>3.3.1</version>
156         </dependency>
157         
158         <dependency>
159             <groupId>org.mybatis</groupId>
160             <artifactId>mybatis-spring</artifactId>
161             <version>1.2.4</version>
162         </dependency>
163         
164         <!-- 分页管理需要的jar包,这里没用到 -->
165         <dependency>
166             <groupId>com.github.pagehelper</groupId>
167             <artifactId>pagehelper</artifactId>
168             <version>4.2.1</version>
169         </dependency>
170         
171     </dependencies>
172     <build>
173         <plugins>  
174             <plugin>  
175                 <artifactId>maven-compiler-plugin</artifactId>  
176                 <configuration>  
177                     <source>1.7</source>  
178                     <target>1.7</target>  
179                 </configuration>  
180             </plugin>  
181             <plugin>  
182                 <artifactId>maven-war-plugin</artifactId>  
183                 <version>2.4</version>  
184                 <configuration>  
185                     <version>3.0</version>  
186                 </configuration>  
187             </plugin>  
188         </plugins>  
189         <finalName>maven_SSM</finalName>  
190     </build>  
191 </project>

这里说一下maven工程利用pom.xml导入oracle驱动包的问题:

由于Oracle授权问题,Maven不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库。

如果电脑中已经装有Oracle数据库,则在安装路径下有数据库的驱动程序,可以直接用。D:Oracleoraclexeapporacleproduct10.2.0serverjdbclib

也可以直接到Oracle官网上下载Oracle数据库驱动, 使用SQL语句查询数据库驱动的版本: SELECT * FROM v$instance

然后确定版本下载:http://www.oracle.com/technetwork/database/features/jdbc/default-2280470.html 

打开windows的命令行界面,进入驱动包ojdbc6的目录,按住shift键后右键,从此处打开命令窗口,然后运行此命令:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=12.1.0.2.0 -Dpackaging=jar -Dfile=ojdbc6.jar
显示"BUILD SUCCESS" 成功,就会自动导入你的maven本地仓库。

然后就可以在maven项目里添加dependency,各坐标对应上面这个命令的个元素,如下:

1     <dependency>      
2       <groupId>com.oracle</groupId>      
3       <artifactId>ojdbc6</artifactId>      
4       <version>12.1.0.2.0</version>
5     </dependency>  

Spring的配置文件:applicationContext.xml

 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" xmlns:aop="http://www.springframework.org/schema/aop"
 4     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
 5     xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans   
 7   http://www.springframework.org/schema/beans/spring-beans.xsd  
 8   http://www.springframework.org/schema/aop   
 9   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
10   http://www.springframework.org/schema/tx   
11   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
12   http://www.springframework.org/schema/context   
13   http://www.springframework.org/schema/context/spring-context-3.0.xsd
14   http://www.springframework.org/schema/util   
15   http://www.springframework.org/schema/util/spring-util-3.0.xsd
16   ">
17     
18     
19     <!-- 配置包扫描 -->
20     <context:component-scan base-package="com.krry"></context:component-scan>
21         
22     <!-- 导入外部资源文件 -->
23     <!-- <context:property-placeholder location="classpath:jdbc.properties" />  -->
24     <bean class="com.krry.core.des.EncryptPropertyPlaceholderConfigurer"
25         p:location="classpath:jdbc.properties" p:fileEncoding="utf-8" />
26         
27     <!-- proxool连接池 -->
28     <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
29         <!-- 驱动的名字,mysql -->
30         <property name="driver" value="${db.driver}"></property>
31         <!--proxool 的 url连接串,这个必须确定用户名和密码 -->
32         <property name="driverUrl" value="${db.url}"></property>
33         <!-- 用户名(proxool没有使用,但是不能没有) -->
34         <property name="user" value="${db.username}"></property>
35         <!-- 密码(proxool没有使用,但是不能没有) -->
36         <property name="password" value="${db.password}"></property>
37         <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 现在设置为4秒) -->
38         <property name="houseKeepingSleepTime" value="3000"></property><!-- 自动检查连接是否断掉开关 -->
39         <property name="testBeforeUse" value="true"></property>
40         <!--  如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略 -->
41         <property name="houseKeepingTestSql" value="SELECT count(1) from dual"></property>
42         <!--  如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟. 现在设置 10 秒--> 
43         <property name="maximumActiveTime" value="10000"></property>
44         <!-- 最少保持的空闲连接数 (现在设置20个) -->
45         <property name="prototypeCount" value="20"></property>
46         <!-- 最大连接数 (现在设置100个) -->
47         <property name="maximumConnectionCount" value="200"></property>
48         <!-- 最小连接数 (现在设置50个) -->
49         <property name="minimumConnectionCount" value="50"></property>
50         <!-- 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息. -->
51         <property name="trace" value="false"></property>
52         <property name="verbose" value="true"></property>
53     </bean>
54     
55     <!-- 注册事务管理器 -->
56     <bean id="txMgr"
57         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
58         <property name="dataSource" ref="dataSource"></property>
59     </bean>
60 
61     <!-- 开启事务注解驱动 -->
62     <tx:annotation-driven transaction-manager="txMgr" />
63     
64     <!-- 配置mybatis的sqlSessionFactory -->
65     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
66         <property name="dataSource" ref="dataSource"></property>
67         <property name="configLocation" value="classpath:mybatis-config.xml"></property>
68     </bean>
69     
70     <!-- 配置可以整体扫描Mapper的一个扫描器 -->
71     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
72         <!--如果有多个报路径,用逗号分开即可  -->
73         <property name="basePackage" value="com.krry.mapper"></property>
74         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
75     </bean>
76     
77 </beans>

spring MVC配置文件:springmvc.xml

  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:p="http://www.springframework.org/schema/p"
  5     xmlns:context="http://www.springframework.org/schema/context"
  6     xmlns:util="http://www.springframework.org/schema/util" 
  7     xmlns:mvc="http://www.springframework.org/schema/mvc"
  8     xsi:schemaLocation="http://www.springframework.org/schema/beans
  9        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 10        http://www.springframework.org/schema/context 
 11        http://www.springframework.org/schema/context/spring-context-3.0.xsd
 12        http://www.springframework.org/schema/util 
 13        http://www.springframework.org/schema/util/spring-util-3.0.xsd 
 14        http://www.springframework.org/schema/mvc 
 15        http://www.springframework.org/schema/mvc/spring-mvc.xsd
 16       ">
 17    
 18          <!-- 开启注解模式驱动 -->    
 19         <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 
 20         <!-- 开启mvc的注解模式 user 还会注册一个ConversionService 子类FormattingConversionServiceFactoryBean-->
 21          <mvc:annotation-driven>
 22             <mvc:message-converters register-defaults="true">
 23                 <bean class="com.krry.core.UTF8StringHttpMessageConverter">
 24                     <property name="supportedMediaTypes">
 25                         <list>  
 26                             <value>text/plain;charset=UTF-8</value>  
 27                             <value>text/html;charset=UTF-8</value>  
 28                         </list>  
 29                     </property>
 30                 </bean> 
 31                 <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
 32                 <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
 33                 <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
 34                     <property name="prefixJson" value="false" />
 35                     <property name="objectMapper">
 36                          <bean class="com.fasterxml.jackson.databind.ObjectMapper">
 37                                <!-- 处理responseBody 里面日期类型 --> 
 38                                <property name="dateFormat">  
 39                                    <bean class="java.text.SimpleDateFormat">  
 40                                        <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />  
 41                                    </bean>  
 42                                </property> 
 43                                <!-- 为null字段时不显示 -->
 44                                <property name="serializationInclusion">
 45                                    <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
 46                                </property> 
 47                            </bean>  
 48                     </property>
 49                      <property name="supportedMediaTypes">  
 50                         <list>  
 51                             <value>application/json;charset=UTF-8</value>  
 52                             <value>application/x-www-form-urlencoded;charset=UTF-8</value>  
 53                         </list>  
 54                     </property>
 55                 </bean>
 56                 </mvc:message-converters> 
 57         </mvc:annotation-driven>
 58         
 59          <!-- 扫包 -->
 60          <context:component-scan base-package="com.krry.controller"></context:component-scan>
 61          
 62          <!--对静态资源文件的访问  必须要设置,因为在springmvc的配置中配置了/匹配所有请求,
 63         此工程所有的请求(.do ,addUser,js/image/css)都会被springmvc解析,
 64         必须对所有的静态资源文件进行过滤放行 -->
 65       <!-- 静态资源过滤  下面二选一-->
 66       <!--<mvc:default-servlet-handler/> -->
 67       <mvc:resources mapping="/resourse/**" location="/resourse/" />
 68       
 69       <!-- 拦截器定义 -->
 70       <mvc:interceptors>    
 71           <mvc:interceptor>
 72              <!-- 个人中心也需要登陆  以admin开头的配置都会进行拦截-->
 73                <mvc:mapping path="/admin/**"></mvc:mapping> 
 74                    <!-- 这个是设置不会进入拦截器的路径 -->
 75                    <mvc:exclude-mapping path="/resourse/**"/>
 76             <!-- 拦截器进入的类,返回false表示不会进入输入的路径 -->
 77             <bean class="com.krry.core.filter.LoginInterceptor" />       
 78           </mvc:interceptor>
 79       </mvc:interceptors>
 80        
 81            <!-- 配置文件解析器 -->
 82         <bean id="multipartResolver"
 83             class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
 84             p:defaultEncoding="utf-8">
 85             <property name="uploadTempDir" value="/temp"></property>
 86             <property name="maxUploadSize">
 87                 <value>209715200</value><!-- 200MB -->
 88             </property>
 89             <property name="maxInMemorySize">
 90                 <value>4096</value><!-- 4KB大小读写 -->
 91             </property>
 92         </bean>
 93            
 94    
 95        <!-- 视图渲染 jsp/freemaker/velocity-->
 96        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 97                <!-- 制定页面存放的路径 -->
 98                <property name="prefix" value="/WEB-INF/pages/"></property>
 99                <!-- 文件的后缀 -->
100                <property name="suffix" value=".jsp"></property>
101        </bean> 
102     
103 </beans>

数据库配置文件: jdbc.properties

1 db.driver=oracle.jdbc.OracleDriver
2 db.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
3 db.username=4m+la23KCA4=
4 db.password=WWijcIyMPaU=

我这里使用了加密算法

日志配置文件: log4j.properties

 1 log4j.rootLogger=DEBUG, CONSOLE, FILE
 2 
 3 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
 4 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
 5 log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %10l - %m%n
 6 
 7 log4j.appender.FILE=org.apache.log4j.RollingFileAppender
 8 log4j.appender.FILE.File=D:/logs/log4j.log
 9 log4j.appender.FILE.MaxFileSize=1MB
10 log4j.appender.FILE.Append = true
11 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
12 log4j.appender.FILE.layout.ConversionPattern=%d{yyyy/MM/dd/HH:mm:ss} %-5p [%t] %10l - %m%n

mybatis配置文件: mybatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8"?>  
 2 <!DOCTYPE configuration   
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">  
 5 
 6 <configuration> 
 7     <settings>  
 8          <!-- 全局映射器启用缓存 -->  
 9         <setting name="cacheEnabled" value="true" />  
10          <!-- 查询时,关闭关联对象即时加载以提高性能 -->  
11         <setting name="lazyLoadingEnabled" value="true" />  
12         <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指              定),不会加载关联表的所有字段,以提高性能 -->  
13         <setting name="aggressiveLazyLoading" value="false" />  
14         <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->  
15         <setting name="multipleResultSetsEnabled" value="true" />  
16         <!-- 允许使用列标签代替列名 -->  
17         <setting name="useColumnLabel" value="true" />  
18         <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->  
19         <setting name="useGeneratedKeys" value="true" />  
20          <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->  
21         <setting name="autoMappingBehavior" value="FULL" />  
22         <!-- 对于批量更新操作缓存SQL以提高性能  -->  
23         <setting name="defaultExecutorType" value="BATCH" />  
24          <!-- 数据库超过25000秒仍未响应则超时 -->  
25         <setting name="defaultStatementTimeout" value="25" />  
26          <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
27     </settings>  
28     
29     <typeAliases>
30         <!--自定义user对象的别名  -->
31         <!-- <typeAlias type="com.krry.mybatis.sysmanage.entity.User" alias="user"/> -->
32         <!-- 批量定义别名 -->
33         <package name="com.krry.entity" />
34     </typeAliases>
35     
36     
37 </configuration>  

网络程序配置文件:web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 3   
 4   <display-name>maven_SSM</display-name>
 5   
 6   <welcome-file-list>
 7     <welcome-file>index</welcome-file>
 8   </welcome-file-list>
 9   
10   <!-- 加载Spring IOC容器 -->
11   <context-param>
12     <param-name>contextConfigLocation</param-name>
13     <param-value>classpath:applicationContext.xml</param-value>
14   </context-param>
15   
16   <!-- spring上下文监听器 -->
17   <listener>
18     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
19   </listener>
20   
21   <!-- Introspector缓存清除监听器 -->
22   <listener>
23     <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
24   </listener>
25   
26   <filter>
27     <filter-name>encoding</filter-name>
28     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
29     <init-param>
30       <param-name>encoding</param-name>
31       <param-value>UTF-8</param-value>
32     </init-param>
33   </filter>
34   
35   <filter-mapping>
36     <filter-name>encoding</filter-name>
37     <url-pattern>/*</url-pattern>
38   </filter-mapping>
39   
40   <!-- 配置DispatcherServlet -->
41   <servlet>
42     <servlet-name>maven_SSM</servlet-name>
43     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
44     <!-- 配置springMVC的配置文件 -->
45     <!-- 如果不配置下面选项,系统默认加载classpath下面名为[servlet-name]-servlet.xml的文件 springmvc01-servlet.xml -->
46     <init-param>
47       <param-name>contextConfigLocation</param-name>
48       <param-value>classpath:springmvc.xml</param-value>
49     </init-param>
50   </servlet>
51   
52   <servlet-mapping>  
53       <servlet-name>maven_SSM</servlet-name>  
54       <url-pattern>/index</url-pattern>  
55   </servlet-mapping>
56   
57   <!-- 可以配*.do, *.action(了解) / (重点): 所有的请求都会被spring mvc解析,但必须对静态资源文件进行过滤放行,建议大家使用这种方式 
58         /* : 不建议大家使用  -->
59   <servlet-mapping>
60     <servlet-name>maven_SSM</servlet-name>
61     <url-pattern>/</url-pattern>
62   </servlet-mapping>
63  
64 </web-app>

到这里,基本配置全部完成,jar包也自动依赖。就进行测试和编写后续 java 的代码。

仔细分享一下 src/main/java 的目录结构:

 

controller层:

首页:KrryController.java

 1 package com.krry.controller.index;
 2 
 3 import java.sql.Timestamp;
 4 import java.util.Date;
 5 import java.util.HashMap;
 6 import java.util.List;
 7 
 8 import javax.servlet.http.HttpServletRequest;
 9 
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.stereotype.Controller;
12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.bind.annotation.RequestMethod;
14 import org.springframework.web.bind.annotation.ResponseBody;
15 import org.springframework.web.servlet.ModelAndView;
16 
17 import com.krry.entity.User;
18 import com.krry.mapper.UserMapper;
19 import com.krry.util.TmStringUtils;
20 
21 /**
22  * KrryController
23  * controller层,作为请求转发
24  * @author asusaad
25  *
26  */
27 @Controller  //表示是多例模式,每个用户返回的web层是不一样的
28 public class KrryController {
29     
30     @RequestMapping("/index")
31     public String index(){
32 //        ModelAndView modelAndView = new ModelAndView();
33 //        modelAndView.setViewName("index/login"); //跳到此页面
34 //        return modelAndView;
35         return "index/index";
36     }
37     
38 }

登录控制层:LoginController.java

  1 package com.krry.controller.login;
  2 
  3 import java.text.SimpleDateFormat;
  4 import java.util.Date;
  5 import java.util.UUID;
  6 
  7 import javax.servlet.http.HttpServletRequest;
  8 
  9 import org.springframework.beans.factory.annotation.Autowired;
 10 import org.springframework.stereotype.Controller;
 11 import org.springframework.web.bind.annotation.RequestMapping;
 12 import org.springframework.web.bind.annotation.RequestMethod;
 13 
 14 import com.krry.entity.User;
 15 import com.krry.service.IUserService;
 16 import com.krry.util.TmStringUtils;
 17 
 18 /**
 19  * Controller层,作为请求转发
 20  * 页面所有路径的访问方法:控制层的命名空间+@RequestMapping的value
 21  * 如这里的/login/index.krry(后缀在xml文件配置)
 22  * */
 23 @Controller  //表示是多例模式,每个用户返回的web层是不一样的
 24 @RequestMapping("/login")
 25 public class LoginController {
 26 
 27     @Autowired
 28     private IUserService userService;
 29     
 30     /**
 31      * 若在下面的@RequestMapping前面加上@ResponseBody,
 32      * 若方法是String类型则直接返回的是字符串,不会跳转到该字符串的路径jsp文件
 33      * 
 34      * 所以要想跳转到某一jsp页面,不能加上@ResponseBody
 35      * 这个@ResponseBody适合ajax返回的数据
 36      * 
 37      */
 38     
 39     /**
 40      * 在控制层不加@ResponseBody的情况下,return值默认是转发到某路径,不会显示转发路径,显示的是未转发前的路径
 41      * 若要重定向,加上redirect:这里默认是当前命名空间的转发,要跳转到另一个control层,需要返回上一级../
 42      * 
 43         这里使用重定向,返回命名空间的上一级,重定向到命名空间为Krry下的index 
 44         return "redirect:../index";
 45         
 46         注意:
 47         转发不会显示转发路径,显示的是未转发前的路径
 48      *  重定向显示的是跳转之后的路径
 49      */
 50     
 51     /**
 52      * 进入登录界面
 53      * @return
 54      */
 55     @RequestMapping("/index")
 56     public String index(){
 57 //        ModelAndView modelAndView = new ModelAndView();
 58 //        modelAndView.setViewName("index/login"); //跳到此页面
 59 //        return modelAndView;
 60         return "index/login";   //默认是转发,不会显示转发路径
 61     }
 62     
 63     /**
 64      * 点击登录
 65      * com.krry.controller.login 
 66      * 方法名:login
 67      * @author krry 
 68      * @param request
 69      * @return String
 70      * @exception 
 71      * @since  1.0.0
 72      */
 73     @RequestMapping(method=RequestMethod.POST,value="/logined")
 74     public String login(HttpServletRequest request){
 75         //获取用户和密码
 76         String username = request.getParameter("username");
 77         String password = request.getParameter("password");
 78         
 79         //如果邮箱和密码为null,那么就返回已null标识
 80         if(TmStringUtils.isEmpty(username) )return "index/allError";
 81         if(TmStringUtils.isEmpty(password))return "index/allError";
 82         
 83         //密码进行加密处理
 84         password = TmStringUtils.md5Base64(password);
 85         
 86         //根据邮箱或昵称查询,用户是否存在
 87         User user = userService.getLogin(username);
 88         
 89         //如果存在
 90         if(user!=null){
 91             
 92             User userpas = userService.getpass(username, password);
 93             if(userpas!=null){
 94                 //如果密码正确
 95                 //将用户信息放入到会话中...
 96                 request.getSession().setAttribute("user", user);
 97                 
 98                 //这里使用重定向,返回命名空间的上一级,重定向到命名空间为Krry下的index.krry
 99                 return "redirect:../index";
100             }else{
101                 //如果密码错误
102                 System.out.println("密码错误");
103                 return "index/error";
104             }
105         }else{
106             //如果不存在,代码邮箱和密码输入有误
107             System.out.println("用户不存在");
108             return "index/error";
109         }
110     }
111     
112     /**
113      * 退出登录控制层
114      * com.krry.controller.login 
115      * 方法名:logout
116      * @author krry 
117      * @param request
118      * @return String
119      * @exception 
120      * @since  1.0.0
121      */
122     @RequestMapping(method=RequestMethod.GET,value="/logout")
123     public String logout(HttpServletRequest request){
124         request.getSession().invalidate(); //清空session值
125         return "index/index";
126     }
127     
128     /**
129      * 打开注册界面层
130      * @return
131      */
132     @RequestMapping("/rege")
133     public String rege(){
134 //        ModelAndView modelAndView = new ModelAndView();
135 //        modelAndView.setViewName("index/login"); //跳到此页面
136 //        return modelAndView;
137         return "index/resgi";
138     }
139     
140     /**
141      * 注册控制层
142      * com.krry.controller.login 
143      * 方法名:resig
144      * @author krry 
145      * @param request
146      * @return String
147      * @exception 
148      * @since  1.0.0
149      */
150     @RequestMapping(method=RequestMethod.POST,value="/resig")
151     public String resig(HttpServletRequest request){
152         //获取用户和密码
153         String name = request.getParameter("username");
154         String email = request.getParameter("email");
155         String password = request.getParameter("password");
156 
157         //如果邮箱和密码为null,那么就返回已null标识
158         if(TmStringUtils.isEmpty(name) )return "index/allError";
159         if(TmStringUtils.isEmpty(email))return "index/allError";
160         if(TmStringUtils.isEmail(password))return "index/allError";
161         
162         //密码进行加密处理
163         password = TmStringUtils.md5Base64(password);
164         //根据昵称查询,用户是否存在
165         User user1 = userService.getothernameres(name);
166         //根据账号查询,用户是否存在
167         User user2 = userService.getemailres(email);
168         
169         //若存在
170         if(user1 != null){ //昵称重复
171             return "index/allError";
172         }
173         if(user2 != null){ //email重复
174             return "index/allError";
175         }
176 
177         //格式化时间类型
178         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
179         String nowTime = sdf.format(new Date());
180         
181         String id = UUID.randomUUID().toString();
182         //执行到这里,说明可以注册
183         User newUser = new User(id, name, password, email, nowTime);
184         //调用注册方法
185         userService.saveUser(newUser);
186         
187         //将信息设置session作用域
188         request.getSession().setAttribute("user", newUser);
189 
190         /**
191          * 这里使用重定向,返回命名空间的上一级,重定向到index
192          */
193         return "redirect:../index";
194     }
195     
196 }

实体entity层:

User.java

 1 package com.krry.entity;
 2 
 3 import java.sql.Date;
 4 import java.sql.Timestamp;
 5 
 6 
 7 /**
 8  * 
 9  * User
10  * @author krry
11  * @version 1.0.0
12  *
13  */
14 public class User {
15 
16      // 主键,自动递增
17      private String id;
18      // 用户名
19      private String username;
20      //      密码
21      private String password;
22      //email
23      private String email;
24      //自动生成创建时间
25      private String createTime;
26 
27      public User(String id,String username,String password,String email,String createTime) {
28         this.id = id;
29         this.username = username;
30         this.email = email;
31         this.password = password;
32         this.createTime = createTime;
33     }
34      
35     public String getCreateTime() {
36         return createTime;
37     }
38 
39     public void setCreateTime(String createTime) {
40         this.createTime = createTime;
41     }
42      
43      public String getEmail() {
44         return email;
45      }
46 
47      public void setEmail(String email) {
48         this.email = email;
49      }
50      
51      public String getId() {
52          return id;
53      }
54     
55      public void setId(String id) {
56          this.id = id;
57      }
58     
59      public String getUsername() {
60          return username;
61      }
62     
63      public void setUsername(String username) {
64          this.username = username;
65      }
66     
67      public String getPassword() {
68          return password;
69      }
70     
71      public void setPassword(String password) {
72          this.password = password;
73      }
74     @Override
75     public String toString() {
76         return "User [id=" + id + ", username=" + username + ", password="
77                 + password + ", email=" + email + ", createTime=" + createTime
78                 + "]";
79     }
80 
81     
82 
83 
84 }

持久化层mapper:

接口层

UserMapper.java

 1 package com.krry.mapper;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.annotations.Param;
 6 
 7 import com.krry.entity.User;
 8 
 9 /**
10  * 
11  * Mapper:操作数据库
12  * IUserMapper
13  * @author krry
14  * @version 1.0.0
15  *
16  */
17 public interface UserMapper {
18 
19     /**
20      * 
21      * com.krry.mapper 
22      * 方法名:findUsers
23      * @author krry 
24      * @return List<User>
25      * @exception 
26      * @since  1.0.0
27      */
28     public List<User> findUsers();
29     
30     /**
31      * 根据用户查询用户是否存在
32      * com.krry.mapper 
33      * 方法名:getLogin
34      * @author krry 
35      * @param email
36      * @param password
37      * @return User
38      * @exception 
39      * @since  1.0.0
40      */
41     /*这里用@Param("name")String name适用于单个参数的传递,在web层调用此方法的时候,就可以传递web层从前台获取的参数,
42           在sql的xml中WHERE email = #{name} or username = #{name}使用此参数,多个参数传递一般使用实体类对象传递    */
43     public User getLogin(@Param("name")String name);
44     
45     /**
46      * 用户名存在时,查询密码是否正确
47      * com.krry.mapper 
48      * 方法名:getpass
49      * @author krry 
50      * @param email
51      * @param password
52      * @return User
53      * @exception 
54      * @since  1.0.0
55      */
56     public User getpass(@Param("name")String name,@Param("password")String password);
57     
58     /**
59      * 注册时根据输入的昵称查找用户
60      * com.krry.mapper 
61      * 方法名:getothername
62      * @author krry 
63      * @param name
64      * @return User
65      * @exception 
66      * @since  1.0.0
67      */
68     public User getothernameres(@Param("name")String name);
69     
70     /**
71      * 注册时根据输入的账号查找用户
72      * com.krry.mapper 
73      * 方法名:getemailres
74      * @author krry 
75      * @param password
76      * @return User
77      * @exception 
78      * @since  1.0.0
79      */
80     public User getemailres(@Param("email")String email);
81     
82     /**
83      * 注册方法
84      * com.krry.mapper 
85      * 方法名:csaveUser
86      * @author krry 
87      * @param user void
88      * @exception 
89      * @since  1.0.0
90      */
91     public void saveUser(User user);
92     
93     
94 }

映射层

UserMapper.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 
 5 <mapper namespace="com.krry.mapper.UserMapper" >
 6     <!-- 所有的增删查改都在这里定义sql语句 -->
 7     
 8     <!-- 查询所有的用户信息 -->
 9     <select id="findUsers" resultType="User">
10         SELECT id,username,password FROM krry_user_test
11     </select>
12     
13     <!-- 登录时根据输入的昵称或账号查找用户 -->
14     <select id="getLogin" resultType="User" >
15         SELECT
16             id,
17             username,
18             password,
19             email,
20             create_time as createTime
21         FROM
22             krry_user_test
23         WHERE
24             email = #{name} or username = #{name}
25     </select>
26     
27     <!-- 若已存在用户信息,再查询密码是否正确 -->
28     <select id="getpass" resultType="User" >
29         SELECT
30             id,
31             username,
32             password,
33             email,
34             create_time as createTime
35         FROM
36             krry_user_test
37         WHERE
38             (email = #{name} or username = #{name}) AND password = #{password}
39     </select>
40     
41     <!-- 注册时根据输入的昵称查找用户 -->
42     <select id="getothernameres" resultType="User" >
43         SELECT
44             id,
45             username,
46             password,
47             email,
48             create_time as createTime
49         FROM
50             krry_user_test
51         WHERE
52             username = #{name}
53     </select>
54     
55     <!-- 注册时根据输入的账号查找用户 -->
56     <select id="getemailres" resultType="User" >
57         SELECT
58             id,
59             username,
60             password,
61             email,
62             create_time as createTime
63         FROM
64             krry_user_test
65         WHERE
66             email = #{email}
67     </select>
68     
69     <!-- 注册用户信息 -->
70     <insert id="saveUser" parameterType="User">
71         INSERT INTO krry_user_test(
72             id,
73             username,
74             email,
75             password,
76             create_time
77         )VALUES(
78             #{id},
79             #{username},
80             #{email},
81             #{password},
82             #{createTime}
83         )
84     </insert>
85     
86     
87 </mapper>

业务逻辑层service:

接口层:

IUserService.java

 1 package com.krry.service;
 2 
 3 import java.util.List;
 4 
 5 import javax.servlet.http.HttpServletRequest;
 6 
 7 import org.apache.ibatis.annotations.Param;
 8 
 9 import com.krry.entity.User;
10 
11 /**
12  * service层:处理业务逻辑(impl里面实现)
13  * @author asusaad
14  *
15  */
16 public interface IUserService {
17     
18     /**
19      * 根据用户名查询用户是否存在
20      * com.krry.service 
21      * 方法名:getLogin
22      * @author krry 
23      * @param email
24      * @param password
25      * @return User
26      * @exception 
27      * @since  1.0.0
28      */
29     /*这里用@Param("name")String name适用于单个参数的传递,在web层调用此方法的时候,就可以传递web层从前台获取的参数,
30           在sql的xml中WHERE email = #{name} or username = #{name}使用此参数,多个参数传递一般使用实体类对象传递    */
31     public User getLogin(@Param("name")String name);
32     
33     /**
34      * 用户名存在时,查询密码是否正确
35      * com.krry.service 
36      * 方法名:getpass
37      * @author krry 
38      * @param email
39      * @param password
40      * @return User
41      * @exception 
42      * @since  1.0.0
43      */
44     public User getpass(@Param("name")String name,@Param("password")String password);
45     
46     /**
47      * 注册时根据输入的昵称查找用户
48      * com.krry.service 
49      * 方法名:getothername
50      * @author krry 
51      * @param name
52      * @return User
53      * @exception 
54      * @since  1.0.0
55      */
56     public User getothernameres(@Param("name")String name);
57     
58     /**
59      * 注册时根据输入的账号查找用户
60      * com.krry.service 
61      * 方法名:getemailres
62      * @author krry 
63      * @param password
64      * @return User
65      * @exception 
66      * @since  1.0.0
67      */
68     public User getemailres(@Param("email")String email);
69     
70     /**
71      * 注册方法
72      * com.krry.service 
73      * 方法名:csaveUser
74      * @author krry 
75      * @param user void
76      * @exception 
77      * @since  1.0.0
78      */
79     public void saveUser(User user);
80     
81 }

impl

UserService.java

 1 package com.krry.service.impl;
 2 
 3 import java.util.List;
 4 
 5 import javax.servlet.http.HttpServletRequest;
 6 
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.stereotype.Service;
 9 
10 import com.krry.entity.User;
11 import com.krry.mapper.UserMapper;
12 import com.krry.service.IUserService;
13 
14 /**
15  * 实现service层接口
16  * @author asusaad
17  *
18  */
19 @Service
20 public class UserService implements IUserService{
21 
22     @Autowired
23     private UserMapper userMapper;
24     
25     /**
26      * 根据用户名查询用户是否存在
27      */
28     public User getLogin(String name) {
29         User user = userMapper.getLogin(name);
30         return user;
31     }
32 
33     public User getpass(String name, String password) {
34         User userpas = userMapper.getpass(name, password);
35         return userpas;
36     }
37 
38     public User getothernameres(String name) {
39         User user = userMapper.getothernameres(name);
40         return user;
41     }
42 
43     public User getemailres(String email) {
44         //根据账号查询,用户是否存在
45         User user = userMapper.getemailres(email);
46         return user;
47     }
48 
49     public void saveUser(User user) {
50         userMapper.saveUser(user);
51         
52     }
53 
54 }

view 视图:

common.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 int port = request.getServerPort();
 5 String basePath = null; 
 6 if(port==80){
 7     basePath = request.getScheme()+"://"+request.getServerName()+path;
 8 }else{
 9     basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
10 }
11 pageContext.setAttribute("basePath", basePath);
12 %>

index.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@include file="../common/common.jsp" %>
 3 
 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 5 <html>
 6   <head>
 7     <title>首页</title>
 8   </head>
 9   
10   <body>
11         <p class="title">用户名:<span class="username">${user.username}</span>已登录</p><br>
12         <a href="${basePath}/login/logout" id="login">退出登录</a>
13         
14         <script type="text/javascript" src="${basePath}/resourse/js/jquery-1.11.2.min.js"></script>
15         <script type="text/javascript">
16             var basePath = "${basePath}";
17             if(isEmpty($(".username").text())){
18                 $(".title").text("未登录");
19                 $("#login").attr("href",basePath+"/login/index");
20                 $("#login").text("点击登陆");
21             }
22             /**
23              * 判断非空
24              * 
25              * @param val
26              * @returns {Boolean}
27              */
28             function isEmpty(val) {
29                 val = $.trim(val);
30                 if (val == null)
31                     return true;
32                 if (val == undefined || val == 'undefined')
33                     return true;
34                 if (val == "")
35                     return true;
36                 if (val.length == 0)
37                     return true;
38                 if (!/[^(^s*)|(s*$)]/.test(val))
39                     return true;
40                 return false;
41             }
42 
43         </script>
44   </body>
45 </html>

login.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@include file="../common/common.jsp" %>
 3 
 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 5 <html>
 6   <head>
 7     
 8     <title>登录界面</title>
 9   </head>
10   <body>
11       <form action="${basePath}/login/logined" method="post">
12           用户名:<input type="text" name="username"/><br>
13&nbsp;码:<input type="password" name="password"/>
14           <input type="submit"><br><br>
15           <a href="${basePath}/login/rege">点我注册</a>
16       </form>
17   </body>
18 </html>

resgi.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@include file="../common/common.jsp" %>
 3 
 4 <!DOCTYPE HTML>
 5 <html>
 6   <head>
 7     <base href="<%=basePath%>">
 8     
 9     <title>注册界面</title>
10 
11   </head>
12   
13   <body>
14     <form action="${basePath}/login/resig" method="post">
15           用户名:<input type="text" name="username"/><br>
16&nbsp;箱:<input type="text" name="email"/><br>
17&nbsp;码:<input type="password" name="password"/><br>
18           <input type="submit">
19       </form>
20   </body>
21 </html>

allError.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@include file="../common/common.jsp" %>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     
 7     <title>错误</title>
 8 
 9   </head>
10   
11   <body>
12         发生错误<br><br>
13         <a href="${basePath}">返回首页</a>
14   </body>
15 </html>

error.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@include file="../common/common.jsp" %>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     
 7     <title>错误</title>
 8 
 9   </head>
10   
11   <body>
12         用户名或密码错误<br><br>
13         <a href="${basePath}/login/index">返回登录</a>
14   </body>
15 </html>

到这里,maven 构建的 ssm 工程实现注册登录完成。

核心包 core 和工具包 util 包这里就不展示了,代码太长。

该博客作为自己的总结,也是一种分享

相关链接:

GitHub:https://github.com/Krryxa

音乐博客:https://www.ainyi.com

原文地址:https://www.cnblogs.com/ainyi/p/8547106.html