jforumパッケージリクエストオブジェクト

6645 ワード

1、要求とプロファイルの発行


……

2、システム経由のリクエストコントローラ

/**
 * Front Controller.
 * 
 * @author Rafael Steil
 * @version $Id: JForum.java,v 1.116 2007/10/10 04:54:20 rafaelsteil Exp $
 */
public class JForum extends JForumBaseServlet 
{
/**
	 *  ( .page url), servlet ,<p>
	 * 1. servlet url *page, servlet , !<br>
	 * 2.
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException
	{
		Writer out = null;
		JForumContext forumContext = null;
		RequestContext request = null;
		ResponseContext response = null;
		String encoding = SystemGlobals.getValue(ConfigKeys.ENCODING);

		try {
			// Initializes the execution context
			JForumExecutionContext ex = JForumExecutionContext.get();

			request = new WebRequestContext(req);
            response = new WebResponseContext(res);

			this.checkDatabaseStatus();

            forumContext = new JForumContext(request.getContextPath(),
                SystemGlobals.getValue(ConfigKeys.SERVLET_EXTENSION),
                request,
                response
            );
            ex.setForumContext(forumContext);

            JForumExecutionContext.set(ex);

			// Setup stuff
			SimpleHash context = JForumExecutionContext.getTemplateContext();
			
			ControllerUtils utils = new ControllerUtils();
			utils.refreshSession();
			
			context.put("logged", SessionFacade.isLogged());
			
			// Process security data
			SecurityRepository.load(SessionFacade.getUserSession().getUserId());

			utils.prepareTemplateContext(context, forumContext);

			String module = request.getModule();
			
			// Gets the module class name
			String moduleClass = module != null 
				? ModulesRepository.getModuleClass(module) 
				: null;
			
			if (moduleClass == null) {
				// Module not found, send 404 not found response
				response.sendError(HttpServletResponse.SC_NOT_FOUND);
			}
			else {
				boolean shouldBan = this.shouldBan(request.getRemoteAddr());
				
				if (!shouldBan) {
					context.put("moduleName", module);
					context.put("action", request.getAction());
				}
				else {
					moduleClass = ModulesRepository.getModuleClass("forums");
					context.put("moduleName", "forums");
					((WebRequestContext)request).changeAction("banned");
				}
				
				if (shouldBan && SystemGlobals.getBoolValue(ConfigKeys.BANLIST_SEND_403FORBIDDEN)) {
					response.sendError(HttpServletResponse.SC_FORBIDDEN);
				}
				else {
					context.put("language", I18n.getUserLanguage());
					context.put("session", SessionFacade.getUserSession());
					context.put("request", req);
					context.put("response", response);
					
					out = this.processCommand(out, request, response, encoding, context, moduleClass);
				}
			}
		}
		catch (Exception e) {
			this.handleException(out, response, encoding, e, request);
		}
		finally {
			this.handleFinally(out, forumContext, response);
		}		
	}

説明:ここでは、パッケージングリクエストオブジェクトが作成されます.

3、パッケージ要求オブジェクトクラス


(オブジェクトを作成するときに、リクエストパラメータをマッピングに追加)
public class WebRequestContext extends HttpServletRequestWrapper implements RequestContext
{
	private Map query; //{module=forums, forum_id=1, action=show}
	
	/**
	 * Default constructor.
	 * 
	 * @param superRequest Original <code>HttpServletRequest</code> instance
	 * @throws IOException
	 */
	public WebRequestContext(HttpServletRequest superRequest) throws IOException
	{
		super(superRequest);

		this.query = new HashMap();
		boolean isMultipart = false;
		
		String requestType = superRequest.getMethod().toUpperCase();
		String contextPath = superRequest.getContextPath();
		String requestUri = this.extractRequestUri(superRequest.getRequestURI(), contextPath);
		String encoding = SystemGlobals.getValue(ConfigKeys.ENCODING);
		String servletExtension = SystemGlobals.getValue(ConfigKeys.SERVLET_EXTENSION);
		
		boolean isPost = "POST".equals(requestType);
		boolean isGet = !isPost;
		
		boolean isQueryStringEmpty = (superRequest.getQueryString() == null 
			|| superRequest.getQueryString().length() == 0);
		
		if (isGet && isQueryStringEmpty && requestUri.endsWith(servletExtension)) {
			superRequest.setCharacterEncoding(encoding); 
			this.parseFriendlyURL(requestUri, servletExtension);
		}
		else if (isPost) {
			isMultipart = ServletFileUpload.isMultipartContent(new ServletRequestContext(superRequest));
			
			if (isMultipart) {
			    this.handleMultipart(superRequest, encoding);
			}
		}
		
		if (!isMultipart) {
			boolean isAjax = "XMLHttpRequest".equals(superRequest.getHeader("X-Requested-With"));
			
			if (!isAjax) {
				superRequest.setCharacterEncoding(encoding);
			}
			else {
				// Ajax requests are *usually* sent using application/x-www-form-urlencoded; charset=UTF-8.
				// In JForum, we assume this as always true.
				superRequest.setCharacterEncoding("UTF-8");
			}
			
			String containerEncoding = SystemGlobals.getValue(ConfigKeys.DEFAULT_CONTAINER_ENCODING);
			
			if (isPost) { 
				containerEncoding = encoding;
			}
			
			for (Enumeration e = superRequest.getParameterNames(); e.hasMoreElements(); ) {
				String name = (String)e.nextElement();
				
				String[] values = superRequest.getParameterValues(name);
				
				if (values != null && values.length > 1) {
					for (int i = 0; i < values.length; i++) {
						this.addParameter(name, new String(values[i].getBytes(containerEncoding), encoding));
					}
				}
				else {
					this.addParameter(name, new String(superRequest.getParameter(name).getBytes(containerEncoding), encoding));
				}
			}
			
			if (this.getModule() == null && this.getAction() == null) {
				int index = requestUri.indexOf('?');
				
				if (index > -1) {
					requestUri = requestUri.substring(0, index);
				}
				
				this.parseFriendlyURL(requestUri, servletExtension);
			}
		}
	}

(特定の要求パラメータをマッピングに追加する方法)
public void addParameter(String name, Object value)
	{
		if (!this.query.containsKey(name)) {
			this.query.put(name, value);
		}
		else {
			Object currentValue = this.getObjectParameter(name);
			List l;
			
			if (!(currentValue instanceof List)) {
				l = new ArrayList();
				l.add(currentValue);
			}
			else {
				l = (List)currentValue;
			}
			
			l.add(value);
			this.query.put(name, l);
		}
	}