SpringMvc最复杂的登录
效果比较单调,没有加样式,图片在下面:
输入数据库存的数据,点击登录,效果如下:
当账号,或密码输入的不是数据库的信息,则会有一个失败页面
项目实现过程如下:
1.新建一个maven工程,在pom配置里面加入一些依赖,代码如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ssti</groupId>
<artifactId>springmvc-login</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
</dependencies>
</project>
等依赖下载完之后,创建一个spring配置文件
2.名字为spring-mvc.xml,这个是容器加载时加载这个配置文件;
代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
</beans>
3.然后我们在webapp的WEB-INF目录下找到web.xml的文件,添加一段代码,代码如下:
</welcome-file-list>
<!-- spring的前段控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 启动时第一个加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这段代码的意思是启动工程的时候第一个加载spring-mvc.xml这个配置文件,请求映射的地址都是带.do的
4.接着编写前端页面在src-main-webapp的目录下建立三个前端页面
分别是login.html,success.html,failed.html
页面的话就简单一点,不加太多的样式了
login.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="userCheck.do" method="post">
用户:<input type="text" name="username"><br>
<p></p>
密码:<input type="password" name="password"><br>
<p></p>
<input type="submit" value="登录">
</form>
</\body>
</html>
success.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>成功了!!!</h1>
</body>
</html>
failed.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>失败了!!!</h1>
</body
</html>
编写完前端代码之后,我们来写后端代码,先建立如下的包:com.ssti下的controller,dao,entity,serivice,截图如下:
controller是负责和前端交互的
dao负责处理数据的(这里是连接数据库)
entity负责管理实体类的(这里是创建用户类)
service负责业务逻辑的类
5.要做一个用户登录的功能,我们先建立一个数据库,往里面放几条数据
这里用的是navicat for mysql
6.建立了数据之后,需要有一个对应的实体类,entity包下建立一个user的java类,里面的成员变量和数据库的字段要相对应,代码如下:
package com.ssti.entity;
public class User {
//实体类
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
7.我们还需要有一个类来处理连接数据库的功能;
我们在dao里建立一个LoginDao的接口,他需要实现一个UserCheck的方法,代码如下:
package com.ssti.dao;
import java.sql.SQLException;
import com.ssti.entity.User;
public interface LoginDao {
public boolean userCheck(User user) throws SQLException;
}
在dao里建立一个接口实现类的包,名字为impl,在impl下,建立一个LoginDaoImpl的实现类实现我们定义的LoginDao接口
截图如下:
我们通过在sprng-mvc.xml加上一个配置连接池的一个bean,使用一个配置文件来写数据库连接信息,用spring 的读取配置文件内容,实现依赖注入,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 用sping读取properties文件的内容 -->
<util:properties id="ldy_db" location="classpath:db/db.properties" />
<!-- 配置连接池 -->
<bean id="ldy_ds" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="#{ldy_db.driverClassName}" />
<property name="url" value="#{ldy_db.url}" />
<property name="username" value="#{ldy_db.username}" />
<property name="password" value="#{ldy_db.password}" />
</bean>
</beans>
上面的代码中的bean中,使用了依赖注入,将读取配置文件的信息注入到这个bean里面
我们在resources的目录下,新建一个名字叫db的文件夹,里面有一个db.properties的配置文件,内容如下:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssti
username=root
password=
这四行代码是根据你自己的数据库来的,第一行不用改,第二行只需要改3306/后面的ssti,这个是你连接的是哪一个数据库,下面两个是mysql的用户名和密码。
完成注入之后
我们在LoginDaoImpl这个类里面加上一个构造函数,主要是看一下有没有被容器加载到,
再加上一个userCheck的方法,实现数据库的连接,代码如下:
package com.ssti.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.stereotype.Repository;
import com.ssti.dao.LoginDao;
import com.ssti.entity.User;
@Repository
//和Component,Controller,Service的作用差不多,标注是容器的组件,就能用容器的方法
public class LoginDaoImpl implements LoginDao {
@Resource(name = "ldy_ds")
//使用依赖注入,将我们在spring配置文件中配置的bean,注入到这个私有变量ds中。
private DataSource ds;
//
public LoginDaoImpl() {
System.out.println("LoginDaoImpl....");
}
public boolean userCheck(User user) throws SQLException {
String sql = "select * from user where username='" + user.getUsername() + "'" + "and password='"
+ user.getPassword() + "'";
//定义一个sql查询语句
System.out.println(sql);
//打印sql语句,以便于项目出错时来看看错误是不是语句错误
Connection conn = ds.getConnection();
//在连接池在得到连接返回给conn
PreparedStatement pstmt = conn.prepareStatement(sql);
//conn预编译执行sql语句将结果给PreparedStatement,
ResultSet rs = pstmt.executeQuery();
//pstmt执行数据库查询,将查询到的结果返回一个结果集
if (rs.next()) {
//结果集中有下一条,也就是说账号密码正确,那么返回true
return true;
} else {//否则返回false
return false;
}
}
}
8.写完之后还需要Service和后端进行交互
需要在service包下建立一个接口,接口名字为LoginService,创建一个包名为impl,接口实现类
代码如下:
package com.ssti.service;
import java.sql.SQLException;
import com.ssti.entity.User;
public interface LoginService {
public boolean loginCheck(User user) throws SQLException;
}
在impl下建立一个LoginServiceImpl的实现类
package com.ssti.service.impl;
import java.sql.SQLException;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.ssti.dao.LoginDao;
import com.ssti.entity.User;
import com.ssti.service.LoginService;
@Service
public class LoginServiceImpl implements LoginService{
@Resource(name="loginDaoImpl")
private LoginDao logindao;
public LoginServiceImpl(){
System.out.println("LoginServiceImpl....");
}
public boolean loginCheck(User user) throws SQLException {
if(logindao.userCheck(user)){
return true;
}else{
return false;
}
}
}
关于LoginServiceImpl实现类的解析,将loginDao的实现类注入给LoginDao这个接口,有一个LoginCheck的方法,如果logindao的userCheck方法为真的话返回true,否则返回false;
9.接着在我们的controller类下面创建一个LoginController的类代码如下:
package com.ssti.controller;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import javax.sql.DataSource;
//import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//import com.ssti.dao.DB;
import com.ssti.entity.User;
import com.ssti.service.LoginService;
@Controller
public class LoginController {
@Resource(name="loginServiceImpl")
private LoginService loginservice;
public LoginController() throws SQLException {
// System.out.println(ds.getConnection());
System.out.println("LoginController......");
}
@RequestMapping("/tologin.do")
public String toLogin(){
return "login";
}
@RequestMapping("/userCheck.do")
public String userCheck(User user) throws SQLException{
if(loginservice.loginCheck(user)==true){
return "success";
}else{
return "failed";
}
}
}
类里面需要有一个方法tologin,usercheck,当前端提交的时候,RequestMapping检测请求的地址,执行相应的方法,这里需要在Spring-mvc.xml上面加一个视图解析器,代码如下:
<bean id="viewResoler"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".html"></property>
</bean>
InternalResourceViewResolver的作用是将逻辑视图名解析为一个路径,它有几个属性,上面代码用了两个,一个是predix,一个是suffix,分别是前缀和后缀的意思,返回的结果加上,前缀有带斜杠,或者后缀是html,比如上面controller返回的是success,将视图解析程一个路径,加上后缀html,就能返回success.html,也就是我们前面做的登录成功之后的界面。
在容器中加载所有的组件需要一个组件扫描仪,在Spring-mvc.xml下添加代码:
<context:component-scan base-package="com.ssti"></context:component-scan>
要让项目运行之后就是登录界面,那么需要在web.xml改一个东西,代码如下:
<welcome-file-list>
<welcome-file>tologin.do</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
工程的截图如下:
hello和index的页面不用管的
spring-mvc.xml的代码全部如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 用sping读取properties文件的内容 -->
<util:properties id="ldy_db" location="classpath:db/db.properties" />
<!-- 配置连接池 -->
<bean id="ldy_ds" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="#{ldy_db.driverClassName}" />
<property name="url" value="#{ldy_db.url}" />
<property name="username" value="#{ldy_db.username}" />
<property name="password" value="#{ldy_db.password}" />
</bean>
<context:component-scan base-package="com.ssti"></context:component-scan>
<!-- 视图解析器 -->
<bean id="viewResoler"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".html"></property>
</bean>
</beans>
LoginController代码如下:
package com.ssti.controller;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import javax.sql.DataSource;
//import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//import com.ssti.dao.DB;
import com.ssti.entity.User;
import com.ssti.service.LoginService;
@Controller
public class LoginController {
@Resource(name="loginServiceImpl")
private LoginService loginservice;
public LoginController() throws SQLException {
// System.out.println(ds.getConnection());
System.out.println("LoginController......");
}
@RequestMapping("/tologin.do")
public String toLogin(){
return "login";
}
@RequestMapping("/userCheck.do")
public String userCheck(User user) throws SQLException{
if(loginservice.loginCheck(user)==true){
return "success";
}else{
return "failed";
}
}
}
项目启动到结束的解析
首先运行工程springmvc-login
项目启动首先加载web.xml,在web.xml里面加载了Spring-mvc.xml,Spring-mvc通过扫描仪将所有在com.ssti包下的类全扫描了,添加到容器里面,所以在console能看到的结果是
不过要在类里面添加注解,才能加载到。
跳转到tologin.do,也就是loginController类下边的tologin方法,返回到login.html页面.
login.html页面提交到userCheck.do里,也就是loginController类下边的userCheck的方法,将实体类传递给这个方法,如果LoginService中的LoginCheck(User)是真的,也就是LoginCheck方法里的loginservice.loginCheck,也就是loginCheck的logindao的userCheck(),也就是这个类里面的集合有数据的话,就返回成功页面。否则就返回失败页面.
完成这个功能很容易出现的问题,总结有以下几点
1.spring-mvc.xml里面的问题,建立的包一定要在一个父包里面,比如我建立的com.ssti,不然扫描不到这个组件,初始化不到。
2.连接数据库的问题,pom文件需要导入相关依赖,需要在Spring-mvc.xml配置连接池的属性,数据库一定要和自己定义的数据库对应。
3.依赖注入的时候,名字要对应,最好的话复制,避免出错
今天关于SpringMvc的登陆分享就到这了