1、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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
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-4.0.xsd">
<!--配置数据库连接信息-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--创建工厂类方法-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--扫描实体类对象,为实体类对象起一个别名-->
<property name="typeAliasesPackage" value="Model"></property>
</bean>
<!--配置扫描映射文件接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="Mapper"></property>
<property name="sqlSessionFactory" ref="factory"></property>
</bean>
<!--配置使用cglib动态代理,使用功能接口userService接收代理对象UserImpl对象-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<!--创建实现类对象并注入dao层接口映射-->
<bean id="userImpl" class="Service.Impl.UserImplService">
<property name="userLogin" ref="IUserLogin"></property>
</bean>
<!--创建通知对象-->
<bean id="before" class="Advisor.beforeAdvisor"></bean>
<bean id="after" class="Advisor.after"></bean>
<aop:config>
<aop:pointcut id="user" expression="execution(* Service.Impl.UserImplService.findUserInfoByUser(..))"></aop:pointcut>
<aop:advisor advice-ref="before" pointcut-ref="user"></aop:advisor>
<aop:advisor advice-ref="after" pointcut-ref="user"></aop:advisor>
</aop:config>
</beans>
此处新使用了一个配置,即在创建SqlSessionFactory工厂类对象时,使用类中参数typeAliasesPackage()扫描封装实体类的包,给包下的封装实体类起了一个别名(类名的首字母小写)。
2、持久层映射文件
2.1、接口映射文件
IUserLogin.java:
package Mapper;
import Model.User;
public interface IUserLogin {
/**
* 查询用户信息
*/
User queryUserInfoByUser(User user);
}
2.2、SQL映射文件
<?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="Mapper.IUserLogin">
<!--type="user" : User封装实体类别名-->
<resultMap id="resultUser" type="user">
<id property="id" column="id"></id>
<result property="userName" column="username"></result>
<result property="passWord" column="password"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<result property="address" column="address"></result>
</resultMap>
<select id="queryUserInfoByUser" parameterType="user" resultMap="resultUser">
select * from user where #{userName} = username and password = #{passWord}
</select>
</mapper>
3、封装实体类:
User.java
package Model;
import java.util.Date;
public class User {
private int id;
private String userName;
private String passWord;
private Date birthday;
private char sex;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", birthday=" + birthday +
", sex=" + sex +
", address='" + address + '\'' +
'}';
}
}
4、Service层:
功能接口:
UserService.java:
package Service;
import Model.User;
public interface UserService {
User findUserInfoByUser(User user);
}
实现类:
package Service.Impl;
import Mapper.IUserLogin;
import Model.User;
import Service.UserService;
public class UserImplService implements UserService {
private IUserLogin userLogin;
public IUserLogin getUserLogin() {
return userLogin;
}
public void setUserLogin(IUserLogin userLogin) {
this.userLogin = userLogin;
}
@Override
public User findUserInfoByUser(User user) {
return userLogin.queryUserInfoByUser(user);
}
}
5、web.xml配置读取ApplicationConext.xml配置文件的监听
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:ApplicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
此处需要注意的需要使用Spring-web包中的监听类,在标签中配置schema相关信息,头信息<?xml version="1.0" encoding="UTF-8"?>不能缺失;上下文配置中,值一定是contextConfigLocation。
6、Servlet类代码:
一定要记得继承HttpServlet ,重写service方法、init()方法,init()初始化方法中获取Spring配置文件信息;service方法可以接收Post、get请求,获取、处理请求数据,和服务端相应数据。
在Servlet类前 使用@WebServlet("/…"),指定访问路径,注解的使用需要保障tomcat版本在7以上,web在3.0以上。
package Servlet;
import Model.User;
import Service.Impl.UserImplService;
import Service.UserService;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class UserLoginServlet extends HttpServlet {
private UserService userService;
/**
* 重写初始化方法
* @throws ServletException
*/
@Override
public void init() {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
userService = wac.getBean("userImpl",UserImplService.class);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = new User();
req.setCharacterEncoding("UTF-8");
user.setUserName(req.getParameter("username"));
user.setPassWord(req.getParameter("password"));
User u = userService.findUserInfoByUser(user);
if(u != null){
resp.sendRedirect("main.jsp");
}else{
resp.sendRedirect("index.jsp");
}
}
}
7、配置通知–使用log4j登记用户登录信息
切点方法使用Service层的实现类中的登录信息查询方法,上述ApplicationContext.xml配置文件中有切点和通知方法的配置及对象创建;
此处只介绍log4j配置文件及通知方法的编写。
7.1、log4j配置文件:
log4j.rootCategory=INFO, CONSOLE ,LOGFILE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=E:/Idea/Spring.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%m %n
7.2、前置通知配置:
package Advisor;
import Model.User;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
import java.util.Date;
public class beforeAdvisor implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
//Log4JLogger log = new Log4JLogger(String.valueOf(beforeAdvisor.class));
User user = (User) objects[0];
// log.info(user.getUserName()+"登录系统");
Logger log = Logger.getLogger(beforeAdvisor.class);
log.info("用户 "+user.getUserName()+" 在"+new Date() +"时登录系统!!!");
}
}
7.3、后置通知配置:
package Advisor;
import Model.User;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
import java.util.Date;
public class after implements AfterReturningAdvice {
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
User user = (User) o;
Logger log = Logger.getLogger(after.class);
log.info("用户 "+user.getUserName()+" 在"+new Date() +"成功登录系统!!!");
}
}
8、登录页面(index.jsp)及登录成功跳转页面(main.jsp)
index.jsp
<%@page language="java" contentType="text/html; UFT-8" pageEncoding="UTF-8" %>
<html>
<body>
<h2>用户登录页面</h2>
<hr>
<form action="login" method="post">
<table border="1" align="center">
<tr align="center">
<td align="center" style="font-size: 20px;">登录名:</td>
<td align="center" style="text-align: center"><input type="text" name="username" style="text-align: center;width: 180px;"/></td>
</tr>
<tr align="center">
<td align="center" style="font-size: 20px;">密码:</td>
<td align="center"><input type="text" align="center" name="password" style="text-align: center;width: 180px;"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="登录" align="center" style="font-size: 25px;"/>
<input type="reset" value="取消" align="center" style="font-size: 25px;"/>
</td>
</tr>
</table>
</form>
</body>
</html>
main.jsp:
<%--
Created by IntelliJ IDEA.
User: xingfuhu
Date: 2020/4/23
Time: 21:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>登陆成功!!!</h3>
</body>
</html>
9、开发所需包及IDEA手动导包处理注意事项
包:
导包步骤:
8.1、File – Project Structrue – Artifacts
Output Layout – Web-INF – lib --Add Copy of – Libray Files