Spring框架应用之Mybatis简易联动其二

在上一次联动中简单使用Spring的IOC托管Mybatis的对象,完成了对象和“我”之间的解耦,了解了AOP之后又有了新的目标。。。(功能越多,任务也越多)

 

改进需求

  • 这一次不再只是从数据库中拿到数据展示出来而已,目的是改进成一个完整的登陆操作,手写一个完整的架构(Java Server Page 虽然这玩意已经过时了,但没办法暂时只会这一个
  • 在用户执行登陆操作是,后台日志文件同步监听记录用户的动作(只是接收登陆结果)

 项目比较小且简单,所以改进需求就是编写思路,动手...

开始行动

除了AOP那一片中提到的关于AOP的 jar 包,这次再导入一个 log4j.jar 用于操作日志

  • web.xml添加监听,接收Spring及其配置文件application Context.xml
  • <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>
  • log4j 属性文件配置,配置成输出到控制台及日志文件,输出权限控制到 INFO,另外设置输出格式
  • 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=D:/Java/java.log
    log4j.appender.LOGFILE.Append=true
    log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.LOGFILE.layout.ConversionPattern=%m %n
    
  • advice类的编写,给 com.yang.service.Impl.UserServiceImpl 实现类的login() 方法编写前置及后置通知用于记录用户登录动作。
  • package com.yang.advice;
    
    import com.yang.pojo.Users;
    import org.apache.log4j.Logger;
    import org.springframework.aop.AfterReturningAdvice;
    
    import java.lang.reflect.Method;
    
    public class MyAfter implements AfterReturningAdvice {
        @Override
        public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
            Logger logger=Logger.getLogger(MyAfter.class);
            Users users= (Users) objects[0]; //参数中获取对象
            if (o!=null){
                logger.info(users.getUname()+"登陆成功");
            }else{
                logger.info(users.getUname()+"登陆失败");
            }
        }
    }
    
    上面是后置,下面是前置/
    
    
    package com.yang.advice;
    
    import com.yang.pojo.Users;
    import org.apache.log4j.Logger;
    import org.springframework.aop.MethodBeforeAdvice;
    
    import java.lang.reflect.Method;
    import java.util.Date;
    
    
    public class MyBefore implements MethodBeforeAdvice {
        @Override
        public void before(Method method, Object[] objects, Object o) throws Throwable {
            Users users= (Users) objects[0];
            Logger logger=Logger.getLogger(MyBefore.class);
            logger.info(users.getUname()+"在"+new Date().toLocaleString()+"进行登录");
        }
    }
  • applicationContext.xml 加AOP配置 :注意第二行的 proxy-target-class="true" 要设置成 true 意在使用cglib动态代理模式
  • <!--给login()方法配置切面-->
    <aop:aspectj-autoproxy proxy-target-class="true"> </aop:aspectj-autoproxy>
    <bean id="mybefore" class="com.yang.advice.MyBefore"> </bean>
    <bean id="myafter" class="com.yang.advice.MyAfter"> </bean>
    <aop:config>
        <aop:pointcut id="mypoint" expression="execution(* com.yang.service.Impl.UserServiceImpl.login(..))"/>
        <aop:advisor advice-ref="mybefore" pointcut-ref="mypoint"/>
        <aop:advisor advice-ref="myafter" pointcut-ref="mypoint"/>
    </aop:config>
  • 最后编写控制器、登录页与主页:后两个就不记录了,随便写一个表单能用就行
  • package com.yang.servlet;
    
    import com.yang.pojo.Users;
    import com.yang.service.Impl.UserServiceImpl;
    import com.yang.service.UserService;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    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 LoginServlet extends HttpServlet {
        private UserService userService;
        @Override
        public void init() throws ServletException {
            WebApplicationContext wac= WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
            //这里要在applicationContext.xml改用cglib动态代理模式,不然会报出异常
            userService=wac.getBean("userService", UserServiceImpl.class);
    
        }
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            Users users=new Users();
            users.setUname(req.getParameter("uname"));
            users.setUpwd(req.getParameter("upwd"));
            Users user=userService.login(users);
            if(user!=null){
                resp.sendRedirect("main.jsp");
            }else {
                resp.sendRedirect("login.jsp");
            }
        }
    }
    

 

打开服务器浏览器处执行登录,成功跳转至主页,再回头查看日志记录:

AOP插入新功能成功。。。

 

无了无了:

参考资料:尚学堂百战程序员系列Java高级框架Spring部分

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值