4

私の会社のプロジェクトでは、埋め込まれた URL を含む電子メールを送信する必要があり、ユーザーはそれに従うように求められます。

たとえば、ある人が Web サイトに登録すると、Struts2 アプリケーションが、サブスクリプションを確認するための URL が記載された電子メールをその人に送信します。

これまでのところ、フォームの送信とメールの送信 (アクション内から) は問題なく機能しています。私が立ち往生している問題は、メール本文に埋め込みたい URL を生成する方法が見つからないことです。

間違ったやり方をしているに違いありませんが、次のようなことを考えていました。

public String send() throws Exception {
    StringBuffer body = new StringBuffer();

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("id", "xxxxxyyyyyaaaaa");

    body.append("Veuillez vous rendre ici :");
    body.append(UrlManager.getUrlForAction("action", params));

    SendMail sendMail = new SendMail();
    sendMail.send("me@me.fr", "Information", body.toString());

    return SUCCESS;
}

アクションとそのパラメーターを入力として取得し、対応する URL を含む文字列を出力するUrlManagerメソッド (フレームワークによって利用可能になるもの) が存在します ( など)。getUrlForAction()http://mysite.mycompany.com/confirm?id=xxxxxyyyyyaaaaa

誰かがそれを行う方法についてのアイデアや指針を持っていますか?

編集:

を使用してみUrlProviderましたが、呼び出し時にヌル ポインター例外が発生しdetermineActionUrlます。多分私はそれを間違った方法で使用しています。

HashMap<String,Object> params = new HashMap<String,Object>();
params.put("id", data.getMd5());

UrlProvider up = new ComponentUrlProvider(
                            new Component(ServletActionContext.getValueStack(ServletActionContext.getRequest())),
                            ServletActionContext.getRequest().getParameterMap());
downloadUrl = up.determineActionURL("confirm", "/", "GET",
                                    ServletActionContext.getRequest(),
                                    ServletActionContext.getResponse(),
                                    params,
                                    "http", true, true, true, true);
4

2 に答える 2

2

アクションでプロパティ (依存関係) を作成する必要があります

@Inject
public void setActionMapper(ActionMapper actionMapper) {
  this.actionMapper = actionMapper;
}

private UrlHelper urlHelper;

@Inject
public void setUrlHelper(UrlHelper urlHelper) {
  this.urlHelper = urlHelper;
}

次に、アクションで次のように書くことができます

Map<String, Object> parameters = new HashMap<>();
ActionMapping mapping = new ActionMapping("action", "namespace", "", parameters);
String uri = actionMapper.getUriFromActionMapping(mapping);
String url  = urlHelper.buildUrl(uri, ServletActionContext.getRequest(), ServletActionContext.getResponse(), parameters, "http", true, false, true, false);
于 2013-07-03T15:03:26.520 に答える
0

必要なことを行う Struts のUrlProvider.determineActionURLを参照してください。

更新 確かに、私は数週間前にこの方法を使用する必要があり、いくつかの NPE が台頭していることを覚えています...最後に、次のコードを書くことができました (私のアプリから適応):

String getMyActionUrl() throws Exception {

    ActionInvocation invocation = (ActionInvocation) ActionContext
            .getContext().get(ActionContext.ACTION_INVOCATION);

    org.apache.struts2.components.URL url = new org.apache.struts2.components.URL(invocation.getStack(), getServletRequest(),
            getServletResponse());
    url.addParameter("parameterToBeDeleted", null);
    url.addParameter("newParam", newValue);
    url.setActionMapper(new DefaultActionMapper());
    url.setUrlHelper(new DefaultUrlHelper());

    String myUrl = url
            .getUrlProvider()
            .determineActionURL(
                    "MyActionName",
                    invocation.getProxy().getNamespace(),
                    invocation.getProxy().getMethod(),
                    getServletRequest(),
                    getServletResponse(),
                    getServletRequest().getParameterMap(),
                    "http",
                    true, true, false, false);

    return myUrl;

}

ノート:

  • MyActionName は String としてここにあり、保守可能な優れたコードではありません。アクションに付けた名前と一致していることを確認してください (そのアクションの呼び出しを処理する Action クラスの名前とは異なる場合があります)。

  • http はハードコードされています。必要に応じて変更します。

于 2013-07-03T13:46:52.560 に答える