2009-01-11 4 views
9

나는과 같이 정말 기본 JSP index.jsp을 작성할 수 있습니다PHP에 Java의 RequestDispatcher.forward가 있습니까? 자바에서

<% request.getRequestDispatcher("/home.action").forward(request, response); %>

이것의 효과가 요청하는 사용자가 index.jsp (또는 포함하는 디렉토리 index.jsp을 가정하는 것은 기본 문서 디렉토리입니다)이다 브라우저 리디렉션없이 볼 수 있습니다. 즉, [forward] (http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse))은 서버 측에서 발생합니다.)

PHP와 비슷한 기능을 수행 할 수 있습니까?이 경우를 처리하도록 Apache를 구성 할 수는 있지만 관련 아파치 콘에 접근 할 수있다. 모양 나는 PHP 만 의존하는 솔루션에 관심이있을 것입니다.

답변

0

CURL 사용 가능성이 염려되는 경우 file_get_contents() 및 스트림을 사용할 수 있습니다.같은 기능을 설정 :

function forward($location, $vars = array()) 
{ 
    $file ='http://'.$_SERVER['HTTP_HOST'] 
    .substr($_SERVER['REQUEST_URI'],0,strrpos($_SERVER['REQUEST_URI'], '/')+1) 
    .$location; 

    if(!empty($vars)) 
    { 
     $file .="?".http_build_query($vars); 
    } 

    $response = file_get_contents($file); 

    echo $response; 
} 

이건 그냥 GET을 설정하지만, 당신은뿐만 아니라 file_get_contents()과 게시물을 할 수 있습니다.

+0

그 방법에는 많은 문제가 있습니다. 하나는 헤더를 따라 전달되지 않으며 GET 유형 요청으로 만 작동합니다. – troelskn

+0

그리고 PHP가 안전 모드에서 실행되고 있다면 비참하게 실패 할 것입니다 ... – SchizoDuckie

+0

... 아직 받아 들여집니다 : D –

-3

당신은 같이 사용할 수 있습니다 : 일부 HTML 출력이 이전에 전송 된 단지의 경우에 필요되는

header ("Location: /path/"); 
exit; 

출구, 헤더()는 어떤 출력하기 전에 새로운 헤더를 전송해야한다, 그래서 작동하지 않습니다 브라우저.

+0

이 솔루션에는 내부 리디렉션이없는 클라이언트가 관련되어 있습니다. – MatthieuP

1

Request.Forward에 대한 속임수는 당신이 원하는 동작에 대해 깨끗하고 새로운 요청을한다는 것입니다. 따라서 현재 요청의 잔류 물이 없습니다. 예를 들어, $ _SERVER [ 'REQUEST_URI']의 java eq에 의존하는 스크립트에는 아무런 문제가 없습니다.

당신은 단지 CURL 클래스에 드롭이 할 수있는 간단한 기능을 쓸 수있다 :

<?php 
/** 
* CURLHandler handles simple HTTP GETs and POSTs via Curl 
* 
* @author SchizoDuckie 
* @version 1.0 
* @access public 
*/ 
class CURLHandler 
{ 

    /** 
    * CURLHandler::Get() 
    * 
    * Executes a standard GET request via Curl. 
    * Static function, so that you can use: CurlHandler::Get('http://www.google.com'); 
    * 
    * @param string $url url to get 
    * @return string HTML output 
    */ 
    public static function Get($url) 
    { 
     return self::doRequest('GET', $url); 
    } 

    /** 
    * CURLHandler::Post() 
    * 
    * Executes a standard POST request via Curl. 
    * Static function, so you can use CurlHandler::Post('http://www.google.com', array('q'=>'belfabriek')); 
    * If you want to send a File via post (to e.g. PHP's $_FILES), prefix the value of an item with an @ ! 
    * @param string $url url to post data to 
    * @param Array $vars Array with key=>value pairs to post. 
    * @return string HTML output 
    */ 
    public static function Post($url, $vars, $auth = false) 
    { 
     return self::doRequest('POST', $url, $vars, $auth); 
    } 

    /** 
    * CURLHandler::doRequest() 
    * This is what actually does the request 
    * <pre> 
    * - Create Curl handle with curl_init 
    * - Set options like CURLOPT_URL, CURLOPT_RETURNTRANSFER and CURLOPT_HEADER 
    * - Set eventual optional options (like CURLOPT_POST and CURLOPT_POSTFIELDS) 
    * - Call curl_exec on the interface 
    * - Close the connection 
    * - Return the result or throw an exception. 
    * </pre> 
    * @param mixed $method Request Method (Get/ Post) 
    * @param mixed $url URI to get or post to 
    * @param mixed $vars Array of variables (only mandatory in POST requests) 
    * @return string HTML output 
    */ 
    public static function doRequest($method, $url, $vars=array(), $auth = false) 
    { 
     $curlInterface = curl_init(); 

     curl_setopt_array ($curlInterface, array( 
      CURLOPT_URL => $url, 
      CURLOPT_CONNECTTIMEOUT => 2, 
      CURLOPT_RETURNTRANSFER => 1, 
      CURLOPT_FOLLOWLOCATION =>1, 
      CURLOPT_HEADER => 0)); 

     if (strtoupper($method) == 'POST') 
     { 
      curl_setopt_array($curlInterface, array(
       CURLOPT_POST => 1, 
       CURLOPT_POSTFIELDS => http_build_query($vars)) 
      ); 
     } 
     if($auth !== false) 
     { 
       curl_setopt($curlInterface, CURLOPT_USERPWD, $auth['username'] . ":" . $auth['password']); 
     } 
     $result = curl_exec ($curlInterface); 
     curl_close ($curlInterface); 

     if($result === NULL) 
     { 
      throw new Exception('Curl Request Error: '.curl_errno($curlInterface) . " - " . curl_error($curlInterface)); 
     } 
     else 
     { 
      return($result); 
     } 
    } 

} 

그냥 class.CURLHandler.php이 덤프하고이 수행 할 수 있습니다 사용, 당연히

을 $ _REQUEST는 실제로 안전하지 않습니다 ($ _SERVER [ 'REQUEST_METHOD']를 확인해야합니다).

<?php 
include('class.CURLHandler.php'); 
die CURLHandler::doRequest($_SERVER['REQUEST_METHOD'], 'http://server/myaction', $_REQUEST); 
?> 

은 당연히, CURL 사방을 를 설치하지거야하지만 우리는 당신이 또한 후 공정을 출력을 잡을 수 있기 때문에 이것은 당신에게 Request.Forward보다 더 많은 유연성을 제공, 또한

native PHP curl emulators for that. 있어요.

+0

curl은 PHP에서 기본적으로 활성화되어 있지 않습니다. 또한 컬은 다른 http 요청 마녀가 CPU 사용량을 더 많이한다는 것을 의미합니다. – Ivan

+0

예, 그렇지만 .forward는 이처럼 너무 무언가를합니다. 현재 요청과 관련된 환경 적 요소가 없습니다. 따라서 다른 'http 요청'이 발생해야합니다. 동일한 범위에서이 스크립트를 실행하고 싶지는 않습니다. 정의 된 변수에 문제가 발생할 수 있기 때문입니다. – SchizoDuckie

1

가장 비슷한 방법 중 하나는 아파치 모듈로 php를 실행하는 동안 virtual() 함수를 사용하는 것입니다.

가상()는 mod_include의 에서 유사한 아파치 특정 함수이다. Apache 하위 요청을 수행합니다.

1

젠드 프레임 워크와 같은 MVC를 사용하면 컨트롤러 동작을 변경하거나 컨트롤러 동작간에 이동할 수 있습니다. 메서드는 _described here과 같은 _forward입니다.

1

시도해보십시오.

function forward($page, $vars = null){ 
    ob_clean(); 
    include($page); 
    exit; 
} 

자바 요청이

0

개념 리디렉션 및 Java처럼 전달, 너무 PHP에서 달성 할 수있는 속성으로 포함 페이지의 $vars 변수가 작동합니다.

리디렉션 :: header("Location: redirect.php"); - (주소 표시 줄 변경에 URL)

앞으로 :: include forward.php ; - (주소 표시 줄에서 변경되지 않은 URL)이 & 다른 프로그래밍 논리와 그것의 관리