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目录。

 

项目目录结构:

Maven 搭建 SSM 项目 (oracle) 设计模式、三层架构的讲解_第1张图片

 

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

MVC 设计模式:单向

Maven 搭建 SSM 项目 (oracle) 设计模式、三层架构的讲解_第2张图片

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 设计模式:双向

Maven 搭建 SSM 项目 (oracle) 设计模式、三层架构的讲解_第3张图片

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.0modelVersion>
  4     <groupId>com.krrygroupId>
  5     <artifactId>maven_SSMartifactId>
  6     <version>0.0.1-SNAPSHOTversion>
  7     <name>maven_SSMname>
  8     <url>http://maven.apache.orgurl>
  9 
 10     <dependencies>
 11         
 12         <dependency>
 13           <groupId>junitgroupId>
 14           <artifactId>junitartifactId>
 15           <version>4.11version>
 16           <scope>testscope>
 17         dependency>
 18         
 19         <dependency>
 20             <groupId>javax.servletgroupId>
 21             <artifactId>servlet-apiartifactId>
 22             <version>3.0-alpha-1version>
 23             <scope>providedscope>
 24         dependency>
 25         
 26         <dependency>
 27             <groupId>jstlgroupId>
 28             <artifactId>jstlartifactId>
 29             <version>1.2version>
 30             <scope>providedscope>
 31          dependency>
 32          
 33          
 34          <dependency>
 35             <groupId>javax.servlet.jspgroupId>
 36             <artifactId>jsp-apiartifactId>
 37             <version>2.2version>
 38             <scope>providedscope>
 39          dependency>
 40          
 41          
 42          <dependency>
 43             <groupId>log4jgroupId>
 44             <artifactId>log4jartifactId>
 45             <version>1.2.17version>
 46           dependency>
 47          
 48          
 49              
 50          <dependency>
 51             <groupId>org.springframeworkgroupId>
 52             <artifactId>spring-contextartifactId>
 53             <version>4.2.1.RELEASEversion>
 54           dependency>
 55           
 56           <dependency>
 57             <groupId>org.springframeworkgroupId>
 58             <artifactId>spring-jdbcartifactId>
 59             <version>4.2.1.RELEASEversion>
 60           dependency>
 61                
 62           
 63          <dependency>
 64             <groupId>org.springframeworkgroupId>
 65             <artifactId>spring-webmvcartifactId>
 66             <version>4.2.1.RELEASEversion>
 67           dependency>
 68           
 69           
 70          <dependency>
 71             <groupId>com.fasterxml.jackson.coregroupId>
 72             <artifactId>jackson-coreartifactId>
 73             <version>2.5.4version>
 74           dependency>
 75           
 76           <dependency>
 77             <groupId>com.fasterxml.jackson.coregroupId>
 78             <artifactId>jackson-annotationsartifactId>
 79             <version>2.5.4version>
 80           dependency>
 81          
 82          <dependency>
 83             <groupId>com.fasterxml.jackson.coregroupId>
 84             <artifactId>jackson-databindartifactId>
 85             <version>2.5.4version>
 86           dependency>
 87           
 88                
 89          <dependency>
 90             <groupId>org.hibernategroupId>
 91             <artifactId>hibernate-validatorartifactId>
 92             <version>5.1.1.Finalversion>
 93           dependency>
 94          
 95          
 96          <dependency>
 97             <groupId>commons-iogroupId>
 98             <artifactId>commons-ioartifactId>
 99             <version>2.4version>
100           dependency>
101           
102           <dependency>
103             <groupId>commons-fileuploadgroupId>
104             <artifactId>commons-fileuploadartifactId>
105             <version>1.3.1version>
106           dependency>
107           
108           <dependency>
109             <groupId>org.apache.commonsgroupId>
110             <artifactId>commons-lang3artifactId>
111             <version>3.3.2version>
112           dependency>
113           
114           
115         <dependency>
116             <groupId>commons-codecgroupId>
117             <artifactId>commons-codecartifactId>
118             <version>1.9version>
119         dependency>
120          
121          
122         
123         <dependency>
124             <groupId>com.oraclegroupId>    
125             <artifactId>ojdbc6artifactId>    
126             <version>12.1.0.2.0version>
127         dependency>
128         
129         
137         
138         
139         <dependency>
140             <groupId>com.cloudhopper.proxoolgroupId>
141             <artifactId>proxoolartifactId>
142             <version>0.9.1version>
143         dependency>
144         <dependency>
145             <groupId>com.cloudhopper.proxoolgroupId>
146             <artifactId>proxool-cglibartifactId>
147             <version>0.9.1version>
148         dependency>
149 
150 
151          
152          <dependency>
153             <groupId>org.mybatisgroupId>
154             <artifactId>mybatisartifactId>
155             <version>3.3.1version>
156         dependency>
157         
158         <dependency>
159             <groupId>org.mybatisgroupId>
160             <artifactId>mybatis-springartifactId>
161             <version>1.2.4version>
162         dependency>
163         
164         
165         <dependency>
166             <groupId>com.github.pagehelpergroupId>
167             <artifactId>pagehelperartifactId>
168             <version>4.2.1version>
169         dependency>
170         
171     dependencies>
172     <build>
173         <plugins>  
174             <plugin>  
175                 <artifactId>maven-compiler-pluginartifactId>  
176                 <configuration>  
177                     <source>1.7source>  
178                     <target>1.7target>  
179                 configuration>  
180             plugin>  
181             <plugin>  
182                 <artifactId>maven-war-pluginartifactId>  
183                 <version>2.4version>  
184                 <configuration>  
185                     <version>3.0version>  
186                 configuration>  
187             plugin>  
188         plugins>  
189         <finalName>maven_SSMfinalName>  
190     build>  
191 project>

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

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

如果电脑中已经装有Oracle数据库,则在安装路径下有数据库的驱动程序,可以直接用。D:\Oracle\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib

也可以直接到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.oraclegroupId>      
3       <artifactId>ojdbc6artifactId>      
4       <version>12.1.0.2.0version>
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     
24     <bean class="com.krry.core.des.EncryptPropertyPlaceholderConfigurer"
25         p:location="classpath:jdbc.properties" p:fileEncoding="utf-8" />
26         
27     
28     <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
29         
30         <property name="driver" value="${db.driver}">property>
31         
32         <property name="driverUrl" value="${db.url}">property>
33         
34         <property name="user" value="${db.username}">property>
35         
36         <property name="password" value="${db.password}">property>
37         
38         <property name="houseKeepingSleepTime" value="3000">property>
39         <property name="testBeforeUse" value="true">property>
40         
41         <property name="houseKeepingTestSql" value="SELECT count(1) from dual">property>
42          
43         <property name="maximumActiveTime" value="10000">property>
44         
45         <property name="prototypeCount" value="20">property>
46         
47         <property name="maximumConnectionCount" value="200">property>
48         
49         <property name="minimumConnectionCount" value="50">property>
50         
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     
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     
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         
 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-8value>  
 27                             <value>text/html;charset=UTF-8value>  
 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                                 
 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                                
 44                                <property name="serializationInclusion">
 45                                    <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULLvalue>
 46                                property> 
 47                            bean>  
 48                     property>
 49                      <property name="supportedMediaTypes">  
 50                         <list>  
 51                             <value>application/json;charset=UTF-8value>  
 52                             <value>application/x-www-form-urlencoded;charset=UTF-8value>  
 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          
 65       
 66       
 67       <mvc:resources mapping="/resourse/**" location="/resourse/" />
 68       
 69       
 70       <mvc:interceptors>    
 71           <mvc:interceptor>
 72              
 73                <mvc:mapping path="/admin/**">mvc:mapping> 
 74                    
 75                    <mvc:exclude-mapping path="/resourse/**"/>
 76             
 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>209715200value>
 88             property>
 89             <property name="maxInMemorySize">
 90                 <value>4096value>
 91             property>
 92         bean>
 93            
 94    
 95        
 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           
13         <setting name="aggressiveLazyLoading" value="false" />  
14           
15         <setting name="multipleResultSetsEnabled" value="true" />  
16           
17         <setting name="useColumnLabel" value="true" />  
18           
19         <setting name="useGeneratedKeys" value="true" />  
20            
21         <setting name="autoMappingBehavior" value="FULL" />  
22           
23         <setting name="defaultExecutorType" value="BATCH" />  
24            
25         <setting name="defaultStatementTimeout" value="25" />  
26          <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
27     settings>  
28     
29     <typeAliases>
30         
31         
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_SSMdisplay-name>
 5   
 6   <welcome-file-list>
 7     <welcome-file>indexwelcome-file>
 8   welcome-file-list>
 9   
10   
11   <context-param>
12     <param-name>contextConfigLocationparam-name>
13     <param-value>classpath:applicationContext.xmlparam-value>
14   context-param>
15   
16   
17   <listener>
18     <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
19   listener>
20   
21   
22   <listener>
23     <listener-class>org.springframework.web.util.IntrospectorCleanupListenerlistener-class>
24   listener>
25   
26   <filter>
27     <filter-name>encodingfilter-name>
28     <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
29     <init-param>
30       <param-name>encodingparam-name>
31       <param-value>UTF-8param-value>
32     init-param>
33   filter>
34   
35   <filter-mapping>
36     <filter-name>encodingfilter-name>
37     <url-pattern>/*url-pattern>
38   filter-mapping>
39   
40   
41   <servlet>
42     <servlet-name>maven_SSMservlet-name>
43     <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
44     
45     
46     <init-param>
47       <param-name>contextConfigLocationparam-name>
48       <param-value>classpath:springmvc.xmlparam-value>
49     init-param>
50   servlet>
51   
52   <servlet-mapping>  
53       <servlet-name>maven_SSMservlet-name>  
54       <url-pattern>/indexurl-pattern>  
55   servlet-mapping>
56   
57   
59   <servlet-mapping>
60     <servlet-name>maven_SSMservlet-name>
61     <url-pattern>/url-pattern>
62   servlet-mapping>
63  
64 web-app>

 

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

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

Maven 搭建 SSM 项目 (oracle) 设计模式、三层架构的讲解_第4张图片

 

 

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
25      * @exception 
26      * @since  1.0.0
27      */
28     public List 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     
 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 码:<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 箱:<input type="text" name="email"/><br>
17 码:<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

你可能感兴趣的:(设计模式,测试,数据库)