Jodd-madvoc 与 beetl集成

原创
2013/12/07 22:22
阅读数 1.2K

Jodd-madvoc 是一个很不错的web mvc框架。但只使用了jsp作为视图技术,这显然拉了madvoc的后腿。本文将告诉你如何将beetl集成到jodd上。

第一步:配置web.xml:在基于madvoc的基础配置上,需要增加beetl的初始化工作


<filter>
        <filter-name>madvoc</filter-name>
        <filter-class>jodd.madvoc.MadvocServletFilter</filter-class>
         <init-param>
            <param-name>madvoc.webapp</param-name>
            <param-value> com.test.AppWebApplication</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>madvoc</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>



init-param 是自定义一个madvoc 的初始化类,我们将完成初始化beetl,以及注册一个ActionResult来处理视图渲染工作


第二步: 完成AppWebApplication类:

public class AppWebApplication extends WebApplication {
	protected void initResults(ResultsManager actionManager) {
		actionManager.register(new BeetlActionResult());
	}
	
	public void configure(MadvocConfigurator configurator) {
		AutomagicMadvocConfigurator auto = (AutomagicMadvocConfigurator)configurator;
		auto.setExcludedJars("**/beetl.1.25.03.jar");
		super.configure(configurator);
	}

}




重载了initResults 将注册一个BeetlActionResult,这是用来初始化Beetl,以及负责渲染具体视图,我们稍后会提到

重载了confgure ,auto.setExcludedJars 用于让jodd别扫描beetl类,因为jodd配置是基于扫描类来获取配置信息的。因为beetl也集成struts,spring等mvc框架,还是别让他扫描,以免出错


第三步,实现BeetlActionResult,  jodd提供机制允许注册视图渲染类,如json,二进制数据等,基类是ActionResult

package com.test;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jodd.madvoc.ActionRequest;
import jodd.madvoc.result.ActionResult;

import org.bee.tl.core.GroupTemplate;
import org.bee.tl.core.Template;
import org.bee.tl.ext.WebConfig;
import org.bee.tl.ext.WebPathKit;
import org.bee.tl.ext.spring.SessionWrapper;
import org.bee.tl.ext.spring.WebVariable;

public class BeetlActionResult  extends ActionResult{
	
	public static final String NAME = "beetl";	
	GroupTemplate group = null;
	public BeetlActionResult() {
		super(NAME);

		try{
			
			WebConfig config = new WebConfig();
			config.updateRootPath(WebPathKit.getWebRootPath()); //更新模版路径
			group = config.createGroupTemplate();
			group.setCharset("UTF-8");
		
		}catch(Exception ex){
			throw new RuntimeException(ex.getMessage());
		}
	}	


	@Override
	public void render(ActionRequest actionRequest, Object resultObject, String resultValue, String resultPath) throws Exception {
			
		HttpServletRequest request = actionRequest.getHttpServletRequest();
		HttpServletResponse response = actionRequest.getHttpServletResponse();
		response.setContentType("text/html;charset=UTF-8");
		String target = resultPath;
		
		
		Template t = group.getFileTemplate(resultPath);
		Enumeration en = request.getAttributeNames();
		while (en.hasMoreElements())
		{
			String key = (String) en.nextElement();
			t.set(key, request.getAttribute(key));
		}

		WebVariable webVariable = new WebVariable();
		webVariable.setRequest(request);
		webVariable.setResponse(response);
		webVariable.setSession(request.getSession());

		t.set("servlet", webVariable);
		t.set("request", request);
		t.set("ctxPath", request.getContextPath());
		t.setRawValue("session", new SessionWrapper(request.getSession()));
		t.getText(response.getWriter());

		
	}

}




第四步,测试一下:

写一个Controller:

package com.test;
import jodd.madvoc.meta.Action;
import jodd.madvoc.meta.In;
import jodd.madvoc.meta.MadvocAction;
import jodd.madvoc.meta.Out;

@MadvocAction
public class IndexAction {

     @In
     String name;

     @Out
     String value;

     @Action("/index.html")
     public String world() {
        
         value = "Hello World!";
         return "beetl:ok.html";
     }
}



按照Jodd定义,如果访问/index.hmtl,系统将自行world方法,其返回一个字符串以beetl开头,我们曾经注册个这个类,就是上面的BeetlActionResult。ok.html将根据Jodd定义,其视图是/index.ok.html,由于Beetl的GroupTemplate没有配置模板根目录,因此默认是Web-inf/template作为根目录,其目录下有一个index.ok.html文件(当然,你可以根据jodd配置如何映射到视图文件),内容非常简单,如下

hello,中国 ${value}



我已经将相关代码和工程放到git上,如果需要,可以访问 https://github.com/javamonkey/jodd-madvoc-beetl.git
有任何疑问,可以通过beetl qq群提问



展开阅读全文
加载中
点击加入讨论🔥(6) 发布并加入讨论🔥
6 评论
2 收藏
0
分享
返回顶部
顶部