Struts 2 – 使用嵌入式URL发送邮件

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

例如,一个人在网站上注册,然后Struts2应用程序向该人发送一封电子邮件,其中有一个URL来确认订阅。

到目前为止,表单提交和发送电子邮件(从操作内部)工作得很好。 我遇到的问题是我无法找到一种方法来生成我想要嵌入邮件正文的URL。

我必须以错误的方式做到这一点,但我正在考虑以下内容:

public String send() throws Exception { StringBuffer body = new StringBuffer(); HashMap params = new HashMap(); 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; } 

使用方法getUrlForAction()获取getUrlForAction()框架可以提供的东西getUrlForAction() ,获取操作及其参数作为输入,并输出包含相应URL的String(如http://mysite.mycompany.com/confirm?id=xxxxxyyyyyaaaaa )。

有没有人有任何想法或指示如何做到这一点?

编辑:

我尝试使用UrlProvider ,但我在determineActionUrl调用上得到一个空指针exception。 也许我以错误的方式使用它。

 HashMap params = new HashMap(); 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); 

您需要在操作中创建属性(依赖项)

 @Inject public void setActionMapper(ActionMapper actionMapper) { this.actionMapper = actionMapper; } private UrlHelper urlHelper; @Inject public void setUrlHelper(UrlHelper urlHelper) { this.urlHelper = urlHelper; } 

然后在动作中你可以写出像

 Map 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); 

您可以查看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是硬编码的。 如果需要改变。