jfinal的Enhancer.enhance增强后方法被调用了两次

发布于 2021-12-01 13:57:47 字数 2925 浏览 616 评论 2

@JFinal  波总,你好,我们直入正题,问题如题,代码如下:

controller层代码如下:

public class ClassesController {

	public void list(){
		List<Record> list = ClassesService.service.list();
		setAttr("list", list);
	}
}

service层代码如下:

public class ClassesService {

	public static final ClassesService service = Enhancer.enhance(ClassesService.class);
	
	public List<Record> list(){
		
		String sql = "select * from classes";
		
		return Db.find(sql);
	}

    public void update(){
        ...
    }


}

Interceptor代码如下:

public class MyInterceptor implements Interceptor {
	private String setAttr(Invocation ai) {

		Controller controller = ai.getController();		//访问的action
		
		//将actionkey 存入request中
		String key = controller.getAttr("request_action_key");
		
        // forward 会有action key存在,以第一次的action key为准
		if(StringUtils.isEmpty(key)) key = ai.getActionKey();			
		
		controller.setAttr("request_action_key",key);
		
		//将当前时间存入到request中
		controller.setAttr("currentDay", DateUtils2.date2String(new Date()));
		
		//将昨天的日期存入到request中
		controller.setAttr("yestoday", DateUtils2.getYestoday());
		
		//将明天的日期存入到request中
		controller.setAttr("tomorrow", DateUtils2.getTomorrow());

		return key;
	}

	@Override
	public void intercept(Invocation  ai) {
		 
		String key = setAttr(ai);
			
		Controller controller = ai.getController();		//访问的action
			 
        // 检查session中shiro失效,则跳转到登录页
		HttpSession session = ai.getController().getSession();
		if(!StringUtils.contains(key, "login") && session.getAttribute(DefaultSubjectContext.AUTHENTICATED_SESSION_KEY) == null){
			controller.redirect("/login");
		}else{
			ai.invoke();
		}
			
		
	}

 

我在一次调试时将断点打在controller层list方法里面,发现执行了两次,控制台输出也是显示执行了两次,控制台输出如下:

--------------------------------------------------------------------------------
Sql: select * from classes

JFinal action report -------- 2017-04-07 22:04:11 ------------------------------
Controller  : com.ahoi.controller.ClassesController.(ClassesController.java:1)
Method      : list
Interceptor : com.ahoi.interceptor.MyInterceptor.(MyInterceptor.java:1)
Parameter   : active-pager[url]=/syllabus/classes/list  
--------------------------------------------------------------------------------
Sql: select * from classes

JFinal action report -------- 2017-04-07 21:58:48 ------------------------------
Controller  : com.ahoi.controller.ClassesController.(ClassesController.java:1)
Method      : list
Interceptor : com.ahoi.interceptor.MyInterceptor.(MyInterceptor.java:1)

 

 为什么会执行两次呢?请波总指教

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

终遇你 2021-12-05 17:46:09

我后来又发现了问题原因,那就是在页面直接按F5刷新发现断点处只被执行了一次,而在页面点击a标签链接时断点处被执行了两次,没找到解决办法

浅沫记忆 2021-12-02 06:31:19

 控制台的输出,第一次有参,第二次无参,可能是被 tomcat 做了重定向:http://www.oschina.net/question/941098_93842

    如果不是这个原因,终极解决办法是设置断点,然后查看调用栈,看一下调用发起者是谁,还要看在浏览器中按一下 F12 打开浏览器自带的开发者工具,观察是不是浏览器发起了多次请求

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文