resexternalservice.java

来自「博克后台的开发,有很多使用的方法和例子可以提供给大家学习」· Java 代码 · 共 114 行

JAVA
114
字号
/*
 * Created on 2005-10-17
 *
 * 扩展ExternalService, 使其可带session状态管理的可选功能
 */
package com.emk.manage;

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.tapestry.ApplicationRuntimeException;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IExternalPage;
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.StaleSessionException;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.engine.ExternalService;
import org.apache.tapestry.engine.IEngineServiceView;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.request.ResponseOutputStream;

/**
 * 扩展ExternalService, 使其可带session状态管理的可选功能
 *  
 * @author 尹文锋
 *
 */
public class ResExternalService extends ExternalService {
	/**
     *  Encoded into URL if pageService was stateful.
     *  
     **/

    private static final String STATEFUL_ON = "1";

    /**
     *  Encoded into URL if pageService was not stateful.
     * 
     **/

    private static final String STATEFUL_OFF = "0";
    	
	

	/* (non-Javadoc)
	 * @see org.apache.tapestry.engine.IEngineService#getLink(org.apache.tapestry.IRequestCycle, org.apache.tapestry.IComponent, java.lang.Object[])
	 */
	public ILink getLink(IRequestCycle cycle, IComponent component, Object[] parameters) {
		if (parameters == null || parameters.length <2)
            throw new ApplicationRuntimeException(
                Tapestry.format("service-requires-parameters", Tapestry.EXTERNAL_SERVICE));

        String pageName = (String) parameters[0];
        //String stateful = (String) parameters[1];
		String stateful = parameters[1].toString();
        String[] context = new String[] { pageName, stateful};

        Object[] pageParameters = new Object[parameters.length - 2];
        System.arraycopy(parameters, 2, pageParameters, 0, parameters.length - 2);

        return constructLink(cycle, Tapestry.EXTERNAL_SERVICE, context, pageParameters, true);	
    }

	/* (non-Javadoc)
	 * @see org.apache.tapestry.engine.IEngineService#service(org.apache.tapestry.engine.IEngineServiceView, org.apache.tapestry.IRequestCycle, org.apache.tapestry.request.ResponseOutputStream)
	 */
	public void service(IEngineServiceView engine, IRequestCycle cycle,
			ResponseOutputStream output) throws ServletException, IOException {
		IExternalPage page = null;

        String[] context = getServiceContext(cycle.getRequestContext());

        if (context == null || context.length != 2)
            throw new ApplicationRuntimeException(
                Tapestry.format("service-single-context-parameter", Tapestry.EXTERNAL_SERVICE));

        String pageName = context[0];
        String stateful = context[1];
        
    	//增加session管理检验,若页面需要session检验时就要判断, 是否存在session,若不存在则抛出session过期异常
        if (stateful.equals(STATEFUL_ON)){
        	if (cycle.getRequestContext().getSession() == null || cycle.getRequestContext().getSession().isNew()){
            	IPage sessionPage = cycle.getPage("SessionException");
            	throw new StaleSessionException("SessionException", sessionPage);
            }            	
        }
        //-------------------------------------------------------------
	        
        try
        {
            page = (IExternalPage) cycle.getPage(pageName);
        }
        catch (ClassCastException ex)
        {
            throw new ApplicationRuntimeException(
                Tapestry.format("ExternalService.page-not-compatible", pageName),
                ex);
        }

        Object[] parameters = getParameters(cycle);

        cycle.setServiceParameters(parameters);

        cycle.activate(page);

        page.activateExternalPage(parameters, cycle);

        // Render the response.
        engine.renderResponse(cycle, output);
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?