由于项目里面由需要一个form可以提交多个action(本来可以用
dispatch值来实现,后来考虑到要使用validator框架验证)。后来考虑的方案为使用js来控制form的流向,例如
form.action='/bookstore/checkId.do'
不过新的问题来了!如何能不用hardcode而拿到我要的action的实际路径呢?比如我定义的struts-config文件里面的action是
path="/checkId"
但是实际解释后的path是:
action='/bookstore/checkId.do'
前
缀和后面的后缀.do都是根据你的项目部署的路径和你在web.xml中配置的mapping的后缀有关系,如果我把内容写死到jsp中那以后我要是想把
checkId.do改成checkId.action那就要更改jsp,由于struts本来提供的几个taglib里面的
<html:form action="/checkId" >
综合了一下决定还是自己写个taglib来实现,其实只需要照着struts 中的 FormTag.java 文件依葫芦画瓢就可以了,一下为本人的代码部分
StrutsActionCustomTag.java
package com.denis.framework.common.taglib.strutsActionExt;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.struts.taglib.TagUtils;
public class StrutsActionCustomTag extends TagSupport {
protected String actionName = null;
public String getActionName() {
return actionName;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
public int doStartTag() throws JspException {
StringBuffer results = new StringBuffer();
HttpServletResponse response =
(HttpServletResponse) this.pageContext.getResponse();
results.append(response.encodeURL( TagUtils.getInstance().getActionMappingURL( this.actionName , this.pageContext)) );
TagUtils.getInstance().write(pageContext, results.toString());
return (EVAL_BODY_INCLUDE);
}
public void release() {
super.release();
this.actionName = null ;
}
}
tld定义部分
framework-struts.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>framework</shortname>
<uri>http://www.denisFramework.org/Framework-Tag</uri>
<tag>
<name>getActionUrl</name>
<tagclass>com.denis.framework.common.taglib.strutsActionExt.StrutsActionCustomTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>actionName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
ok ! 直接在jsp中如下使用即可取到action的真正路径
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="/WEB-INF/framework-struts.tld" prefix="framework" %>
<html>
<head>
<title>JSP for loginForm form</title>
</head>
<body>
<framework:getActionUrl actionName="login" />
<html:form action="/login">
name : <html:text property="name"/><html:errors property="name"/><br/>
password : <html:password property="password"/><html:errors property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
大家要是有更好的解决方法希望能指正!谢谢!