在 Struts 2 中发送带有嵌入 URL 的邮件
Posted
技术标签:
【中文标题】在 Struts 2 中发送带有嵌入 URL 的邮件【英文标题】:Sending mail with embedded URL in Struts 2 【发布时间】:2013-07-01 05:01:45 【问题描述】:对于我公司的项目,我必须发送包含嵌入式 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的字符串(如@987654324 @)。
有没有人对如何做到这一点有任何想法或指示?
编辑:
我尝试使用 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);
【问题讨论】:
您能否更具体地说明“无法找到生成 URL 的方法”。您是否尝试过您自己发布的上述代码?如果你试过了,你会得到任何错误。 “我在想下面的事情”还不够好。试试看,看看你遇到了什么错误或问题。 你写的是UrlManager
还是SendMail
?在 Struts2 框架中找不到。
是的,我都“写”了。实际上,SendMail 只是我为我的项目编写的一个助手,但 UrlManager 并不是真的。它更像是我希望它成为和工作的东西,比如 UrlHelper,它接近我想要的,但实际上并没有做我需要的,比如生成示例 url。 UrlHelper 省略了正在使用的端口(这里是 8080 用于开发机器),并将“.action”添加到 URL。
@CPU100,上面的代码不会这样做,因为我最好的尝试是使用 UrlHelper,它没有给出我期望的结果(它省略了端口,添加了“.action”到 url 等),即使我已将 struts 配置为没有操作扩展,并将端口设置为 8080 (struts.http.port=8080)。
@FabriceAGNELLO 你是如何使用 UrlHelper 的?编辑问题并分享您的经验。还提供默认 UrlHelper 有什么问题?
【参考方案1】:
您需要在您的操作中创建属性(依赖项)
@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);
【讨论】:
Roman,注射部分是我所缺少的。照你说的做的很好,所以问题已经解决了。非常感谢。【参考方案2】:您可以查看 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 是硬编码的。根据需要进行更改。
【讨论】:
我会尝试找到如何使用此方法,但它看起来与 UrlHelper 非常相似,无法完全解决问题。也许有了这个我会更幸运。 我已经编辑了我的初始帖子。我使用 UrlProvider.determineActionURL 方法(可能是错误的方式)得到 NullPointerException。你知道出了什么问题吗? @FabriceAGNELLO 更新了答案。 HTH :) 我终于尝试了 Roman C. 给出的解决方案,它就像一个魅力。您的解决方案似乎也很好,但我会继续使用 Roman 的解决方案。无论如何,感谢您的帮助。以上是关于在 Struts 2 中发送带有嵌入 URL 的邮件的主要内容,如果未能解决你的问题,请参考以下文章