我正在使用Struts Portlet桥开发基于Struts 1.2.9(出于历史原因,我们想重用许多现有代码)的JSR-286兼容Portlet。我想要一些链接来更改WindowState,但是门户网桥提供的FormTag和LinkTag没有设置WindowState的简便方法。我很高兴扩展这两个标记,但是不确定如何继续,如何确定需要以门户网站不可知的方式添加哪些请求参数?
最佳答案
哦,还可以回答我自己的问题:-)
我必须基于(不扩展)struts桥代码创建自己的TagSupport,FormTag和LinkTag版本。
我修改了方法TagsSupport.getUrl()和TagsSupport.getFormTagRenderFormStartElement()以接受WindowState参数,并在创建渲染和操作URL时使用它。
public static String getURL(PageContext pageContext, String url, PortletURLTypes.URLType type, WindowState ws)
...
if ( type.equals(PortletURLTypes.URLType.ACTION) )
{
final PortletURL portletURL = StrutsPortletURL.createActionURL(pageContext.getRequest(), url);
if (ws!=null) {
try {
portletURL.setWindowState(ws);
}
catch (WindowStateException e) {
e.printStackTrace();
}
}
return portletURL.toString();
}
else if ( type.equals(PortletURLTypes.URLType.RENDER) )
{
final PortletURL portletURL = StrutsPortletURL.createRenderURL(pageContext.getRequest(), url);
if (ws!=null) {
try {
portletURL.setWindowState(ws);
}
catch (WindowStateException e) {
e.printStackTrace();
}
}
return portletURL.toString();
}
...
和
public static String getFormTagRenderFormStartElement(PageContext pageContext, String formStartElement, WindowState ws)
{
if ( PortletServlet.isPortletRequest(pageContext.getRequest()))
{
int actionURLStart = formStartElement.indexOf("action=") + 8;
int actionURLEnd = formStartElement.indexOf('"', actionURLStart);
String actionURL = formStartElement.substring(actionURLStart,
actionURLEnd);
final PortletURL portletURL = StrutsPortletURL.createActionURL(pageContext.getRequest(),
actionURL);
if (ws!=null) {
try {
portletURL.setWindowState(ws);
}
catch (WindowStateException e) {
e.printStackTrace();
}
}
formStartElement = formStartElement.substring(0, actionURLStart)
+ portletURL.toString()
+ formStartElement.substring(actionURLEnd);
}
return formStartElement;
}
然后,我将FormTag和LinkTag更改为接受WindowState属性,并将其传递给TagSupport中的方法。
private String windowState;
public String getWindowState() {
return windowState;
}
public void setWindowState(String windowState) {
this.windowState = windowState;
}
和
url = TagsSupport.getURL(pageContext, url, urlType, new WindowState(getWindowState()));
显然,然后需要一个tld来引用我的修改标签。
它已作为补丁PB-91(也包含用于更改Portlet模式的修复程序)提供给struts桥项目。