4

对于我公司的项目,我必须发送包含嵌入式 URL 的电子邮件,系统会提示用户关注这些 URL。

例如,一个人在网站上注册,然后 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;
}

那里会有一个UrlManager(框架可以提供的东西)带有一个方法,该方法getUrlForAction()获取一个动作及其参数作为输入,并输出一个包含相应 URL 的字符串(如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 在这里是一个字符串——不是一个很好的可维护代码。确保它与您为操作指定的名称匹配(这可能与处理对该操作的调用的 Action 类的名称不同)。

  • http是硬编码的。如果需要,请更改。

于 2013-07-03T13:46:52.560 回答