JFinal 如何设置全局500与404错误跳转

lcccc 发布于 2012/06/30 10:31
阅读 7K+
收藏 5

JFinal 如何设置全局500与404错误跳转

又如何设置 单个controller的500与404错误跳转

加载中
0
JFinal
JFinal

全局404、500跳转在YourJFinalConfig extends JFinalConfig类中的configConstant(Constants me) 方法中配置即可:

me.setError404View("/common/error_404.html");me.setError500View("/common/error_500.html");

 单个controller的500与404错误跳转可以在YourContrller中调用renderError404(...)与renderError500(...)来实现,在Controller中调用renderError404与renderError500时可以指定view也可以不指定,不指定时使用JFinalConfig中配置的view  :)

JFinal
JFinal
回复 @Mr.CT : 不客气,谢谢你的支持
Mr.CT
Mr.CT
回复 @JFinal : 喜欢拿来就用,没想过扩展。谢谢啊!
JFinal
JFinal
回复 @Mr.CT : 做个Error403Render,然后用拦截器或者Handler统一进行调用: render(new Error403Render(...))相当于也是全局
Mr.CT
Mr.CT
回复 @JFinal : 可以全局定义不?
JFinal
JFinal
回复 @Mr.CT : 403以及其它状态调用这个 YourRender.render(String, int)全包了
下一页
0
l
lcccc

单个controller 中不能自动捕获异常吗? 就像struts2 中可以针对每个package设置

global-exception-mappings


0
l
lcccc
getParaToInt(0) 这个方法就很容抛异常 action中每个方法都 try catch 一下感觉有点不好 呵呵
0
JFinal
JFinal

引用来自“刘传”的答案

单个controller 中不能自动捕获异常吗? 就像struts2 中可以针对每个package设置

global-exception-mappings


单个Controller可以通过拦截器来捕获异常
0
l
lcccc
嗯 呵呵 谢谢啊 正在用jf开发一个项目 刚开始用 很多细节问题都不熟 不过用起来是很轻松没有像SSH那样繁琐
JFinal
JFinal
欢迎多来交流提问,现在有不少童鞋已经开始了JFinal之旅,目前反馈良好 :)
0
JFinal
JFinal

引用来自“lcccc”的答案

getParaToInt(0) 这个方法就很容抛异常 action中每个方法都 try catch 一下感觉有点不好 呵呵
一般来说,web中的url都是你提供的,特定的action getParaToInt(0)出错应该是少数。并且这种错误即便出现,跳转到error500页面即可。出现这种错误一般是由于用户手动在浏览器中改变参数,这类用户可以不必过多考虑,正常用法是在web系统点击你安排好的url :)
0
JohnsonZ
JohnsonZ

@JFinal

请问下, 我想不同的访问地址返回的404页面是不同的, 比如 api接口的返回的是 json的404格式, 其它的显示的是  正常的404 页面.

这个要怎么全局设置啊?

0
JFinal
JFinal

引用来自“JohnsonZ”的评论


@JFinal

请问下, 我想不同的访问地址返回的404页面是不同的, 比如 api接口的返回的是 json的404格式, 其它的显示的是  正常的404 页面.

这个要怎么全局设置啊?


      很多办法实现,你可以在拦截器中try catch 住 ai.invoke(),然后利用 actionKey 或 controllerKey 来判断访问是否为 api 访问,如果根据不同的情况 render 不同的东西。

    另外,还可以通过扩展 IErrorRenderFactory 实现更为灵活的控制,例如:

MyErrorRenderFactory implements IErrorRenderFactory {
  public Render getRender(int errorCode, String view){
    if (errorCode == 123456)
      return MyErrorRender(view);
    return ErrorRender(errorCode, view);
  }
}
然后在configConstant 中设置一下:
public void configConstant(Constants me){
  me.setErrorRenderFactory(new MyErrorRenderFactory())
}
0
JohnsonZ
JohnsonZ


@Jfinal

按你说的方法不行, 

try {
ai.invoke();
} catch (Exception e) { 
controller.renderJson("test");
}

http://localhost:8888/api/getList (此URL存在) 

http://localhost:8888/api/getListA (此URL不存在) 我希望显示的 test 这个 404 json 但是实际显示的是 config 里面设置的404文件。


但是按上面的方法无法正常显示, 麻烦帮忙看看, 哪里有错么 谢谢!!


0
JFinal
JFinal

引用来自“JohnsonZ”的评论

@Jfinal

按你说的方法不行, 

try {
ai.invoke();
} catch (Exception e) { 
controller.renderJson("test");
}

http://localhost:8888/api/getList (此URL存在) 

http://localhost:8888/api/getListA (此URL不存在) 我希望显示的 test 这个 404 json 但是实际显示的是 config 里面设置的404文件。

但是按上面的方法无法正常显示, 麻烦帮忙看看, 哪里有错么 谢谢!!

try catch 只能捕捉到 renderError(404) 抛出的异常,你可以扩展一下 IErrorRenderFactory接口:

MyErrorRenderFactory implements IErrorRenderFactory{
  public Render getRender(int errorCode, String view){
    if (errorCode == 400)
      return new MyError404Render(view);
    return new ErrorRender(errorCode, view);
  }
}
然后在 configConstant 方法中注册一下:
public void configConstant(Constants me){
  me.setErrorRenderFactory(new MyErrorRenderFactory());
}

最后你就可以在 MyError404Render 做自己想做的事情了:

public class MyError404Render extends Render{
  public void render() {
  // ......
  }
}
JFinal
JFinal
回复 @小99 : 问答数量非常多,没时间整理,osc有朋友在博客中有整理过,可以收藏一下
小99
小99
希望波总收集一些网友的问题,以及最优解决方案!加入文档中,和新版本一同发布,应该对jf发展起到很大的作用
JohnsonZ
JohnsonZ
还是没有解决, 麻烦大神帮忙看看吧。 得到request 了, 但是没办法做出区别处理。:《
JohnsonZ
JohnsonZ
哦, 看到 Render 类里面有 this.request 那大概是用这个来判断传入的路径来做判断吧。 我试试看
JohnsonZ
JohnsonZ
非常感谢, 但是这样做, 还是把全部的 页面的404 显示为自定义的这个404错误JSON 了, 无法达到我想要的那种。不同的URL 返回不同的 404 错误信息。
返回顶部
顶部