对于我公司的项目,我必须发送包含嵌入式网址的电子邮件,系统会提示用户注意这些网址。
例如,一个人在网站上注册,然后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的String (如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);
答案 0 :(得分: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);
答案 1 :(得分: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是硬编码的。如果需要改变。