我有大约90个菜单,每个菜单至少有4个代表CRUD动作的屏幕。在这些菜单中,有13个菜单具有波罗的海字符支持,而其他菜单则没有。但是在这87个菜单中,仍然有大量用户输入波罗的海字符,这是由于在后端填充了垃圾数据。 BE是一个不同的团队,他们无法适应atm的更改,因此我必须在前端处理它。
我正在寻找一种通用的解决方案,所以我只写一种方法并在其他地方重用。
我决定的通用解决方案是迭代请求bean对象,并通过反射遍历其方法,并检查每个值是否包含波罗的海字符。
我的另一个解决方案是迭代HttpServlet请求参数并检查它们是否存在波罗的字符。
我正在使用Struts2和Java7。我想知道以上两个选项中的哪一个更好。我知道,反思伴随着性能警告。但是我觉得它比httpservlet请求参数更好。
如果还有其他解决方案,请要求您分享您的想法/建议。
编辑: 对于某些菜单,在我们的应用程序中,我们使用了jsp-servlet体系结构,同样需要在这些类型的菜单中实现相同的功能。
答案 0 :(得分:0)
不确定“请求bean”指的是什么。
无论如何,拦截器可能是最好的选择,因为您可以访问参数映射。如果您的实际参数嵌套在没有类似地图访问权限的Bean中,则仍然需要进行反映。
这是我将S2视为Web和业务逻辑之间的薄层的原因之一:我倾向于不对发送给业务逻辑的内容进行预优化,这样我就可以在Web级别为诸如以下情况提供过滤这(例如,空白修剪过滤器可能适用于整个应用程序)。
修剪拦截器大致如下(从Struts 2.1开始):
public class TrimInterceptor extends MethodFilterInterceptor {
private List<String> excluded = new ArrayList<String>();
protected String doIntercept(ActionInvocation invocation) throws Exception {
Map<String, Object> parameters = invocation.getInvocationContext().getParameters();
for (String param : parameters.keySet()) {
if (isIncluded(param)) {
String[] vals = (String[]) parameters.get(param);
for (int i = 0; i < vals.length; i++) {
vals[i] = vals[i].trim();
}
}
}
return invocation.invoke();
}
private boolean isIncluded(String param) {
for (String exclude : excluded) {
if (param.startsWith(exclude)) {
return false;
}
}
return true;
}
public void setExcludedParams(String excludedParams) {
for (String s : StringUtils.split(excludedParams, ",")) {
excluded.add(s.trim());
}
}
}
那里有一些其他代码,但是您主要要寻找的是我们在哪里获得参数值:
String[] vals = (String[]) parameters.get(param);
如果它是波罗的海,则您需要执行所有操作,然后将其设置回值:
vals[i] = vals[i].trim();
这里是修剪空白,但是您知道了。
现在可能会有一些区别(这是从Struts 2.1时代开始的),但这足以使您顺利通过。