• 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

  • 相关阅读:
    [转]Delphi中进行延时的4种方法
    [转]delphi 删除动态数组的指定元素
    vue-transition-fade
    移动端list布局,左边固定,右边自适应
    移动端弹窗
    多行文字超出省略显示
    jsonp
    barba 页面渲染
    barba.js 优化页面跳转用户体验
    页面返回无刷新
  • 原文地址:https://www.cnblogs.com/ainyi/p/8547106.html
Copyright © 2020-2023  润新知