能力提升
需求:
使用AOP任何一种方法(3种中任选一种)
在用户需要进行登录时-记录谁要登入,把信息记录到log文件中
格式xx在NNNN年YY月DD日几点几分几秒登入。
在用户登录后记录使用是否登录成功
格式xxx登入XXX
切点:
设计成service方法
建立用户数据库
先创建能实现登录功能的程序
一、创建项目
导入Spring所需的Java包
二、配置tomcat web.xml的服务器环境
配置监听器管理SPring容器-----配置Spring监听器类
------Spring监听器类所在的包名复制
管理Spring容器-----把Spring配置文件applicationcontext.xml的contextconfigLocation配置环境
代码;
<?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">
<!--当tomcat加载web.xml时,把spring 配置文件信息存储放在application对象中 -->
<!-- webapplicationcontext 容器, 是ApplicationCntext子接口 -->
<!-- 设置Spring文件配置路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 加载Spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<display-name>Login</display-name>
<welcome-file-list>
<welcome-file>index.html</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>
</web-app>
三、配置applicationcontext.xml的Spring配置文件
创建applicationcontext.xml配置文件
获取数据源
配置四个属性
编写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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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/ssm"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--工厂设计模式 SqlsessionFactory对象 -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.wq.pojo"></property>
</bean>
<!--扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wq.mapper"></property>
<property name="sqlSessionFactory" ref="factory"></property>
</bean>
<!--注入 -->
<bean id="usersService" class="com.wq.service.impl.UsersServiceImpl">
<property name="usersMapper" ref="usersMapper"></property>
</bean>
</beans>
实体类:
package com.wq.pojo;
public class Users {
private int id;
private String usernameString;
private String passwordString;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsernameString() {
return usernameString;
}
public void setUsernameString(String usernameString) {
this.usernameString = usernameString;
}
public String getPasswordString() {
return passwordString;
}
public void setPasswordString(String passwordString) {
this.passwordString = passwordString;
}
}
Mybatis数据接口
package com.wq.mapper;
import com.wq.pojo.Users;
public interface UsersMapper {
Users selByUsers(Users users);
}
文档
<?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="com.wq.mapper.UsersMapper">
<select id="selByUsers" parameterType="users" resultType="users">
select * from users where username=#{usernameString} and password=#{passwordString}
</select>
</mapper>
逻辑层
package com.wq.service.impl;
import com.wq.mapper.UsersMapper;
import com.wq.pojo.Users;
import com.wq.service.UsersSerrvice;
public class UsersServiceImpl implements UsersSerrvice {
private UsersMapper usersmapper;
public UsersMapper getUsersmapper() {
return usersmapper;
}
public void setUsersmapper(UsersMapper usersmapper) {
this.usersmapper = usersmapper;
}
@Override
public Users login(Users users) {
return usersmapper.selByUsers(users);
}
}
package com.wq.service;
import com.wq.pojo.Users;
public interface UsersSerrvice {
Users login(Users users);
}
控制器
package com.wq.servlet;
import java.io.IOException;
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 org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.wq.pojo.Users;
import com.wq.service.UsersSerrvice;
import com.wq.service.impl.UsersServiceImpl;
@WebServlet("/login")
public class LoginServlet extends HttpServlet{
private UsersSerrvice usersSerrvice;
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
usersSerrvice= wac.getBean("usersService",UsersServiceImpl.class);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
Users users=new Users();
users.setUsernameString(req.getParameter("username"));
users.setPasswordString(req.getParameter("password"));
Users login = usersSerrvice.login(users);
if(login!=null){
resp.sendRedirect("main.jsp");
}else {
resp.sendRedirect("login.jsp");
}
}
}
登录页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="login" method="post">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
运行结果,登录成功跳转main.jsp
现在、要对原有的功能进行AOP扩充
对Spring配置Aop
官方配置:
配置Spring
新建前置通知:
同时添加Log4j日志配置文件
后置通知:
继续配置Spring
测试:
报错结果:
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'usersService' must be of type [com.wq.service.impl.UsersServiceImpl], but was actually of type [com.sun.proxy.$Proxy16]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:375)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:962)
at com.wq.servlet.LoginServlet.init(LoginServlet.java:30)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:773)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
一月 11, 2021 8:03:50 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Allocate exception for servlet [com.wq.servlet.LoginServlet]
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'usersService' must be of type [com.wq.service.impl.UsersServiceImpl], but was actually of type [com.sun.proxy.$Proxy16]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:375)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:962)
at com.wq.servlet.LoginServlet.init(LoginServlet.java:30)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:773)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
因为默认情况下是JDK动态代理
代理对象不能转换为实体类
改为cglib 的方式写成AOP