0

CloudFoundry で実行したい基本的な Spring Web アプリ (Spring MVC プロジェクト) があります。デフォルトの HelloWorld プロジェクトに追加しました。CloudFoundry STS 拡張機能をインストールし、サーバーを作成し、アプリを CF サイトに公開しました。「ホーム」ページは、ローカルホスト サーバーと CF サーバーの両方に表示されます。すべて良い。しかし、別のメソッド/ビューの HomeController に戻る唯一のリンクをクリックすると、CF サーバーで「リソースが利用できません」というエラーが表示されますが、ローカルホスト (ローカル PC) サーバーでは完全に動作します。

ローカル PC で:

  1. URLは:(http://localhost:8080/myapp 正しい)
  2. 最初のページ (home.jsp) には 1 つのリンクが表示されます: <a href="/myapp/property">Property</a>(正しい)
  3. リンクにマウスを合わせると、ステータス バーに次のように表示されます: http://localhost:8080/myapp/property (正しい)
  4. クリックすると、 にマッピングされたメソッドに移動し/property、プロパティ ページが表示されます ( property.jsp)。(正しい)

CloudFoundry の場合:

  1. URLは:(http://myapp.cloudfoundry.com/正しい)
  2. 最初のページ ( home.jsp) は、私のローカルホスト PC と同じように表示されます。(正しい)
  3. リンクにマウスを合わせると、ステータスバーにこれが表示されます: http://myapp.cloudfoundry.com/myapp/property(正しいと思います)。
  4. クリックすると ' esource not available.
  5. myappロケーションウィンドウに移動してURLから削除すると、機能します。

以下はすべてのコードですが、これは私のローカル PC と CloudFoundry の 2 つの環境に対する私自身の誤解の一部に過ぎないと思います。ローカルと CloudFoundry の両方の環境でアプリを動作させるために、ここで私が知らないことを誰かが教えてくれることを願っています。

これは、最初のページである home.jsp の HTML です。

<html>
    <head></head>
    <body>
        <a href="/myspp/property">Property</a>
    </body>
</html>

ホームコントローラーは次のとおりです。

package com.myapp.app;
import java.util.Locale;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.myapp.services.PropertyServicesImpl;

/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
    private static final String VIEW_HOME = "home";
    private static final String VIEW_PROPERTY = "property";
    private static final String ACQUISITIONS = "acquisitions";
    @Autowired private PropertyServicesImpl propertyServices;   

    /**
* Shows home view
    */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView home(Locale locale, Model model) {
        return new ModelAndView(VIEW_HOME);
    }

    /**
    * Shows Property.jsp with jQuery tabs.
    */
    @RequestMapping(value = "/property", method = RequestMethod.GET)
        public ModelAndView property(Locale locale, Model model) {
            return new ModelAndView(VIEW_PROPERTY);
    }
}
4

2 に答える 2

1

CF のコンテキスト パスは {app.name}.cloudfoundry.com であり、{app.name}.cloudfoundry.com/{app.name} ではありません

jsp を に置き換え<a href="/myapp/property">Property</a> ます<a href="/property">Property</a>

于 2012-06-14T10:27:17.030 に答える
1

ビューに固定値を入れるのではなく、リクエストのコンテキスト パスを取得し、それをビューのパスに追加するのが最善です。

次のインポートを Home コントローラーに追加します。

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

次に、RequestMapping メソッドで現在のリクエスト オブジェクトを取得し、UrlPathHelper インスタンスを作成して、リクエスト コンテキストのベース パスを取得します。

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
UrlPathHelper helper = new UrlPathHelper();

String baseURL = helper.getContextPath(request);

そのため、vFabric からローカルで実行する場合、baseURL は「/myapp」になり、Cloud Foundry インスタンスから実行する場合は「」になります。

あとは、これをモデルに追加してビューで使用するだけです。

model.addAttribute("relPath", baseURL);

これを STS の Spring MVC テンプレート プロジェクトでテストしたところ、問題なく動作しました。私の HomeController は次のようになりました。

package com.vmware.mvctest;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.sun.tools.internal.ws.processor.model.Request;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! the client locale is "+ locale.toString());
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        UrlPathHelper helper = new UrlPathHelper();

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);
        String baseURL = helper.getContextPath(request);

        model.addAttribute("serverTime", formattedDate );
        model.addAttribute("relPath", baseURL);

        return "home";
    }

}

私の見解はこのように見えました。

<%@ page session="false" %>
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1>
    Hello world! (${relPath}) 
</h1>
<a href="${relPath}/home">home</a>
<P>  The time on the server is ${serverTime}. </P>
</body>
</html>
于 2012-06-14T10:22:42.290 に答える