在上一次联动中简单使用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部分