2018.4.24
仅为个人理解 不足之处欢迎指正~
本文所有内容均在
SpringMVC学习记录(四)——简单SpringMVC登录注册项目
项目基础上修改
初始项目结构:
原Dao层所采用的数据交互方法为基本JDBC:
UserDaoImpl.java:
package dao;
import org.springframework.stereotype.Repository;
import pojo.Login;
import pojo.User;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@Repository("userDao")
public class UserDaoImpl implements UserDao
{
//获得连接
@Override
public Connection getConnection(){
String driver ="com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/mvcdemo2?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user ="root";
String password ="root";
Connection connection =null;
try {
Class.forName(driver);
connection =DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//注册用户
@Override
public void register(User user)
{
try {
Connection con = getConnection();
PreparedStatement preparedStatement = null;
String sql= "insert into user (username,password,phone,email) values(?,?,?,?)";
preparedStatement=con.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setString(3, user.getPhone());
preparedStatement.setString(4, user.getEmail());
preparedStatement.executeUpdate();
}
catch (Exception e) {
//
}
}
//验证用户登录
@Override
public User validateUser(Login login)
{
User user=new User();
String sql="select * from user where username=?";
Connection con=getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
try
{
pstmt=con.prepareStatement(sql);
pstmt.setString(1, login.getUsername());
rs=pstmt.executeQuery();
while(rs.next())
{
user.setUsername(rs.getString(1));
user.setPassword(rs.getString(2));
user.setPhone(rs.getString(3));
user.setEmail(rs.getString(4));
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
return user;
}
}
本次修改目的在于将与数据库交互的方法改为Mybatis
实现将Mybatis整合入这个项目
第一步:编写UserDao.xml
在上一篇文章提到:一个接口对应一个实现
上一篇中的Dao层如下:
而我们知道在Mybatis中 一个实体类对应一个xml
这个xml整合入SpringMVC中仍然起到实现的作用
所以我们可以将UserDaoImpl.java 替换为UserDao.xml
首先明确需要的操作:
- 注册所需的增加用户
- 登录所需的查询用户
首先进行增加用户语句的编写:
然后进行查询用户语句的编写:
完整UserDao.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserDao">
<insert id="addUser" parameterType="pojo.User" >
insert into user values (#{username},#{password},#{phone},#{email})
</insert>
<select id="getUserByusername" parameterType="string" resultType="pojo.User">
select * from user where username=#{username}
</select>
</mapper>
注意:
namespace必须对应这个xml所实现的接口
第二步:修改对应的UserDao.java
完整UserDao.java代码如下:
package dao;
import org.mybatis.spring.annotation.MapperScan;
import pojo.User;
@MapperScan
public interface UserDao
{
User getUserByusername(String username); //根据用户名获取用户
void addUser(User user); //注册用户
}
注意:
1.
中写的两个方法名与xml中的id名对应
返回值与参数列表与 resultType与parameterType对应
2.
需要加上@MapperScan才算完成这个接口的实现
第三步:修改对应的Service层
service.java不变
package service;
import pojo.User;
public interface UserService
{
void addUser(User user);
String login(User user);
}
serviceImpl.java 根据调用的方法做微调:
package service; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import pojo.Login; import pojo.User; import dao.UserDao; @Service public class UserServiceImpl implements UserService { @Resource UserDao userdao; @Override public void addUser(User user) { System.out.println("service:"); System.out.println(user.getUsername()); System.out.println(user.getPassword()); System.out.println(user.getPhone()); System.out.println(user.getEmail()); userdao.addUser(user); } @Override public String login(User user) { String username=user.getUsername(); User trueuser=userdao.getUserByusername(username); if(trueuser.getPassword().equals(user.getPassword())) { return "登录成功"; } else { return "密码错误"; } } }
第四步:三个配置文件
在整合Mybatis之后 我们理所当然的需要Mybatis的配置文件mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="pojo.User" alias="User"/>
</typeAliases>
<mappers>
<mapper resource="dao/UserDao.xml"/>
</mappers>
</configuration>
这个配置文件与我们在Mybatis学习记录中使用的相比减少了很多东西:
主要体现在:
这是因为这部分的配置文件将整合进spring的配置文件中
接下来配置Spring的配置文件springConfig.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:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/tool"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd">
<!--配置数据源-->
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mvcdemo2?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置sessionFactory-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="jdbcDataSource" />
<property name="mapperLocations">
<array>
<value>classpath:Dao/**/*.xml</value>
</array>
</property>
<property name="typeAliasesPackage" value="com.isea533.mybatis.model"/>
<!-- MybatisSpringPageInterceptor分页拦截器 -->
<!--<property name="plugins">-->
<!--<bean class="com.wlxk.Util.MybatisSpringPageInterceptor"/>-->
<!--</property>-->
</bean>
<!--配置dao 自动扫描带有@MapperScan注解的-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao"/>
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
</bean>
<!--全局异常处理-->
<!--service 注解扫描-->
<context:component-scan base-package="service"/>
</beans>
几点需要注意:
1.
数据源的配置由mybatis的配置文件转移至spring的配置文件
2.
同样我们在Mybatis中需要获取对象时使用的sessionFactory:
在Spring中不再需要
取而代之的是这一段配置代码
springMVC的配置文件没有改变:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="controller" />
<!-- 视图页面配置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
其他代码改动与注意点:
(1)
LoginController.java:
package controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import pojo.User;
import service.UserService;
@Controller
public class LoginController
{
@Resource
UserService userService;
@RequestMapping("/Login")
public ModelAndView login
(@RequestParam("username") String userName,
@RequestParam("password") String passWord)
{
ModelAndView mv = new ModelAndView("welcome");
User user=new User(userName,passWord,null,null);
String mes=userService.login(user);
mv.addObject("name",userName);
mv.addObject("message", mes);
return mv;
}
}
(2)
RegiesterController.java
package controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import pojo.User;
import service.UserService;
import service.UserServiceImpl;
@Controller
public class RegisterController
{
@Resource
UserService userService;
@RequestMapping(value="/register")
public ModelAndView showRegister(HttpServletRequest request,HttpServletResponse response)
{
ModelAndView mav=new ModelAndView("register");
mav.addObject("user",new User());
return mav;
}
@RequestMapping(value="/reg",method=RequestMethod.POST)
public ModelAndView addUser(HttpServletRequest request,HttpServletResponse response,
@RequestParam("username") String userName,
@RequestParam("password") String passWord,
@RequestParam("phone") String phone,
@RequestParam("email") String email)
{
User user=new User(userName,passWord,phone,email);
System.out.println("用户信息如下:");
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getPhone());
System.out.println(user.getEmail());
userService.addUser(user);
ModelAndView mv = new ModelAndView("welcome");
String mes="注册成功";
mv.addObject("name", user.getUsername());
mv.addObject("message", mes);
return mv;
}
}
(3)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>TestMaven</display-name>
<welcome-file-list>
<welcome-file>/WEB-INF/views/index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springConfig.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
(4)pom.xml
添加了新的包:mybatis与mybatis-spring
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tzy</groupId>
<artifactId>MVCDemo2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>MVCDemo1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>4.3.0.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
<finalName>TestMaven2</finalName>
</build>
</project>
完整项目结构与测试:
完整项目结构如下:
index.jsp welcome.jsp register.jsp并没有进行任何改动
如有需要请在SpringMVC学习记录(四)——简单SpringMVC登录注册项目中获取
运行结果:
总结:
这次将Mybatis整合进入了之前的登录注册项目
之后打算进行AOP的模拟——增加一个登录日志
在这个项目的整合过程中遇到了一个问题
与
之间的版本关系似乎有点复杂 总之这是一种可以成功的搭配
谢谢~