简单谈一下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模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),即为MVC。它是一种软件设计的典范
虽然MVC并不是Java当中独有的,但是现在几乎所有的B/S的架构都采用了 MVC 框架模式,但是 MVC 在B/S架构中并没有完全地实现,其实我们根本不需要掌握未实现的部分。
模型 Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受视图数据的请求,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。
视图 View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。
控制器 Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请 求转发;
MVC 模式被广泛用于 Java 的各种框架中,比如 Struts2、Spring MVC 等等都用到了这种思想
Model : 实体模型(biz/bean)
View : 布局文件(XML)
ViewModel : 对外暴露出公共属性,View和Model的绑定器
1. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。 在Android中,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化。
2. 低耦合。以前Activity、Fragment中需要把数据填充到View,还要进行一些视图逻辑。现在这些都可在布局中完成,甚至都不需要再Activity、Fragment去findViewById()。这时候Activity、Fragment只需要做好的逻辑处理就可以了。
采用 MVC 模式。 model(模型) view(视图) Controller(控制) M称为模型,也就是实体类。用于数据的封装和数据的传输。 V为视图,也就是GUI组件,用于数据的展示。 C为控制,也就是事件,用于流程的控制。
负责具体的业务模块流程的控制,
DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,
Service层主要负责业务模块的逻辑应用设计。
每个对象作为一个实体类,一般设置很多的私有属性,并有相应的setter和getter方法。
做相关数据表的映射
对象属性的封装,体现了oo思想
对象模型配置文件: pom.xml
Spring的配置文件:applicationContext.xml
spring MVC配置文件: springmvc.xml
数据库配置文件: jdbc.properties
日志配置文件: log4j.properties
mybatis配置文件: mybatis-config.xml
网络程序配置文件:web.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>
由于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.oracle</groupId>
3 <artifactId>ojdbc6</artifactId>
4 <version>12.1.0.2.0</version>
5 </dependency>
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>
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>
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\=
我这里使用了加密算法
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
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>
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 的代码。
首页: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 }
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 }
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>
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 }
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 }
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