近日体验了一下Eclipse 打开某个jsp 页面,页面上的select下拉列表 框用Struts 自定义标签来完成
1、新建页面:Test.jsp
2、在Web应用 的WEB -INF目录下自定义标签TLD文件 :TestTag.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>dtree</shortname> <uri>http://jakarta.apache.org/struts/tags-bean< ;/uri> <tag> <name>selectResnodes</name> <tagclass>myWeb.taglib.SelectTag</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>id</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>nodeslist</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>scope</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib> <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> |
3、在myWeb.Action包下定义AbstractResAction.java文件和TestAction.java文件(利用了java的反射机制)
AbstractResAction.java文件:
package myWeb.Action;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; public abstract class AbstractResAction extends Action {
public final ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
String cmd = httpServletRequest.getParameter("actionType"); // 获取 参数,其实为函数名
System.out.println("actionType = " + cmd);
if (cmd == null || cmd.equals(""))
return actionMapping.findForward("default");
try {
Method method = this.getClass()
.getMethod(
cmd,new Class[] { ActionMapping.class,
ActionForm.class, HttpServletRequest.class,
HttpServletResponse.class }); // 利用反射机制,调用method方法。而这个method方法是由页面指定的actionType定义的。
return (ActionForward) method.invoke(this, new Object[] {
actionMapping, actionForm, httpServletRequest,
httpServletResponse });
} catch (Exception e) {
e.printStackTrace();
return actionMapping.findForward("default");
}
}
}
TestAction.java文件:
package myWeb.Action;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.asiainfo.ainx.advancedres.bo.ResnodesBO;
public class QueryNodesAction extends AbstractResAction {
public ActionForward showNodesList (ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
ResnodesBO bo = new ResnodesBO();
ArrayList alNodes = bo.selectData(); //我的应用中定义了BO和DAO类来封装对数据 库的读写。此处为从数据库 中取出的数据结果集
request.setAttribute("resnodesList ",alNodes); //页面中的用到该自定义标签时要用到resnodesList这个属性
return mapping.findForward("showResnode");
}
} 4、在myWeb.taglib包下定义SelectTag.java文件
package myWeb.taglib; import java.io.IOException; import java.util.ArrayList; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import org.apache.struts.util.RequestUtils; import myWeb.vo.ResnodesVO; public class SelectTag extends TagSupport { //这里的三个属性对应TestTag.tld文件中对selectResnodes 定义的三个属性 private String id ; private String scope ; private String nodeslist ; /** * @throws IOException */ public int doStartTag() { ArrayList list = null; try { list = (ArrayList) RequestUtils.lookup(pageContext, nodeslist, scope); } catch (JspException e1) { e1.printStackTrace(); <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> } if (list == null || list.size() == 0) return SKIP_BODY; JspWriter out = pageContext.getOut(); try { if (list != null) { out.println("<select name=/"Sel_Nodes/" style=/"width:90%/">"); for (int i = 0; i < list.size(); i++) { ResnodesVO nodevo = (ResnodesVO) list.get(i); out.println("<option value=/"" + nodevo.getId() + "/">" + nodevo.getSName() + "</option>"); // System.out.println(nodevo.getSName()); } out.println("</select>"); out.flush(); } } catch (IOException e) { e.printStackTrace(); } return EVAL_BODY_INCLUDE; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getNodeslist() { return nodeslist; } public void setNodeslist(String nodeslist) { this.nodeslist = nodeslist; } public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } } |
5、修改struts-config.xml文件:
…… <action-mappings> …… <action type="myWeb.Action.TestAction " scope="request" path="/queryResnodes"> <!-- 在地址栏或链接中请求时用该路径queryResnodes --> <forward name="showResnode" path="/Test.jsp" /> <!-- 在TestAction.java中执行查询数据的函数后,跳转至该showResnode定义的页面,即Test.jsp --> </action> …… </action-mappings> …… |
6、保证Test.jsp中包含如下的代码:
<%@ taglib uri="/WEB-INF/TestTag.tld " prefix="slotnode"%> <body> …… <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> <slotnode:selectResnodes id ="nodelist" nodeslist ="resnodesList" scope ="request" /> …… </body> 其中prefix的名字是随便起的,只要有意义就可以。 但是在后面用的时候就要用这个名字,本例中是slotnode。 <slotnode:selectResnodes …… 中的selectResnodes 和TestTag.tld中定义的<tag><name>selectResnodes </name>……必须是相同的的 另外nodeslist="resnodesList"中resnodesList即TestAction.java中定义的 request.setAttribute(" resnodesList ",alNodes); 中写入的属性resnodesList,两个名字必须是相同的。 |
7、比如我的Web应用发布的名字为LearnTag,发布在本地的Tomcat中,默认端口8080则在地址栏输入:http://localhost :8080/LearnTag/queryResnodes.do?actionType=showNodesList
OK.出来结果了吧。
整理的有点乱,再总结一下:
从页面发起。do请求,请求转至action,在action文件中执行数据库查询,取得需要的数据
将查询得到的数据列表用setAttribute加入request
自定义标签中取request中的加入的数据列表
<script type="text/javascript">
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> 由自定义标签中的标签java文件完成将数据打印出来的功能(用JspWriter类)
在页面显示出来。查看jsp文件的源代码,可以看到自定义的标签和数据都转换为html的代码了