百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

AOP实战演练(实战演练1-5)

toyiye 2024-06-30 09:50 13 浏览 0 评论

能力提升

需求:

使用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


最终结果


相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码