JFinal中有关render和页面渲染的疑惑

凯撒大弚 发布于 2012/08/03 12:22
阅读 8K+
收藏 2

/***************CommonController.java**************/

@Before(CommonInterceptor.class)
public class CommonController extends Controller {
	@Before(CommonValidator.class)
	public void index() {
		renderJsp("/common/index.html");
	}
}

/************CommonInterceptor.java**************/

public class CommonInterceptor implements Interceptor {

	@Override
	public void intercept(ActionInvocation ai) {
		System.out.println("Before invoking " + ai.getActionKey());
		ai.invoke();
		System.out.println("After invoking " + ai.getActionKey());
	}

}

/***************CommonValidator********************/
public class CommonValidator extends Validator {

	@Override
	protected void handleError(Controller cto) {
		System.out.println(getActionKey());
	}

	@Override
	protected void validate(Controller cto) {
		System.out.println("validate...");
	}

}

        由于最近一直考虑做一个网站,打算用一门新颖的技术来实现,忽然一天JFinal横空出世了,奔着史上最快最省代码这句话开始研究了,终于在今天晚上没有加班到凌晨,白天不用拼命修改bug的情况下开始了JFinal的研究之路,废话完毕,切入正题。

        JFinal里面有几个render的方法,render在此意为渲染,render、renderJsp、renderFreeMarker、renderHtml,由于我的页面是jsp的,于是在CommonController里面调用renderJsp("/common/index.jsp"),但是发现运行到页面后所有的css、js效果尽失,后来听说有ActionInvocation才行,于是加了一个CommonInterceptor,该类实现了Interceptor,而且在intercept(ActionInvocation ai)方法里面调用了ai.getActionKey(),然后去CommonController里面加上了@Before(CommonInterceptor.class),再次运行项目,发现jsp页面依然没有效果。求高手指点错在哪里? 

加载中
0
JFinal
JFinal

    render 以后 css、js 效果尽失应该是路径的问题,看页面源码就可以知道路径是否正确了。我在你代码中发现了下面这句:

renderJsp("/common/index.html");

    JSP 页面应该是要以 .jsp 作为扩展名 tomcat、jetty 这类才能被识别为jsp,否则被认为是静态html。另外你的项目主要是使用 JSP 页面,那么你可以在 configConstant(Constants me) 方法中设置一下:

public void configConstant(Constants me) {
  me.setViewType(ViewType.JSP);
}

    有了如上的设置,就可以一直使用 render("yourview.jsp") 这种方式渲染了,而不用每次都要调用 renderJsp(...),省三个字母  Jsp。如果你默认使用FreeMaker的话,省下的代码量就很可观了 

    Interceptor、Validator 对于一个 action 来说,并不是必须的,所以楼主创建的这两个文件可以删去。

    最后,Jsp 文件应当确实是 Jsp 内容,里面包含了一些jsp 独有的指令,如:<@page ...> 如果没有的话, tomcat、jetty应该不认。欢迎多来OSC提问哈,谢谢支持 :)


1
a
alvinte

你看一下实际html中的js和css的资源地址。这种应该是路径的问题,没有正确获取资源。

另外,这个与Interceptor和Validator没什么关系。

0
fneg
fneg
我觉得也是,不然JFinal就太复杂了
0
matrixcd90123456
matrixcd90123456
应该是 render 时指定的文件类型错了, jfinal 的 JspRender 用的是 forward 到 jsp ,所以 jsp 必须要是正规则 jsp 文件类型,不能是 html
JFinal
JFinal
JspRender 中用的:request.getRequestDispatcher(view).forward(request, response);
0
JFinal
JFinal

引用来自“matrixcd”的答案

应该是 render 时指定的文件类型错了, jfinal 的 JspRender 用的是 forward 到 jsp ,所以 jsp 必须要是正规则 jsp 文件类型,不能是 html
最大的可能就是这个了   
0
凯撒大弚
凯撒大弚

引用来自“alvinte”的答案

你看一下实际html中的js和css的资源地址。这种应该是路径的问题,没有正确获取资源。

另外,这个与Interceptor和Validator没什么关系。

多谢各位的回答,特别感谢一下 @alvinte ,竟然一下就猜到了原因,果然是路径不对,囧!比如<link rel="stylesheet" href="../css/login.css"/>、<link rel="stylesheet" href="/css/login.css"/>都是错误的路径<link rel="stylesheet" href="css/login.css"/>才是对的,我来个去。
0
凯撒大弚
凯撒大弚

引用来自“JFinal”的答案

引用来自“matrixcd”的答案

应该是 render 时指定的文件类型错了, jfinal 的 JspRender 用的是 forward 到 jsp ,所以 jsp 必须要是正规则 jsp 文件类型,不能是 html
最大的可能就是这个了   
感谢各位、感谢波哥,换成jsp和修改css、js路径后完美运行,
0
JFinal
JFinal

引用来自“雅各布奇”的答案

引用来自“JFinal”的答案

引用来自“matrixcd”的答案

应该是 render 时指定的文件类型错了, jfinal 的 JspRender 用的是 forward 到 jsp ,所以 jsp 必须要是正规则 jsp 文件类型,不能是 html
最大的可能就是这个了   
感谢各位、感谢波哥,换成jsp和修改css、js路径后完美运行,
不用客气,有问题随时提哈 :)
0
galaxy58
galaxy58
jsp 文件扩展名为 html 时会被认为是静态 html, 不会被编译成 servlet
返回顶部
顶部