当前位置: 首页 > 图文教程 > Java技术 > Web框架 > Struts自定义标签的过程

Web框架
Struts开发过程中的异常处理机制
ServletContext与ServletConfig分析
使用Ajax的挑战
Web程序从Struts向Stripes框架的移植
Shale不是Struts
Web框架:基于Ajax的应用程序架构汇总
Web框架:使用Ajax技术开发Web应用程序
Web框架:简单理解Hibernate三种状态的概念及互相转化
Web框架:浅谈Struts2中拦截器应用
Web框架:Struts2中的Action
Web框架:Struts2高级文件上传
Web框架:小编谈嵌入XFire服务介绍及实现
Web框架:DWR中signatures标签的使用
WEB框架:小编总结Struts2的经典输入校验
WEB框架:小编祥谈Struts2的数据标签中Action与Bean标签的使用
Web框架:小议struts2类型转换
Web框架:小编浅谈Struts2的pub-sub事件模型
Web框架:小编简述JSF
Web框架:Hibernate事务管理
Web框架:Struts高级特性(StrutsAdvancedFeature)验证

Web框架 中的 Struts自定义标签的过程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 95 ::
收藏到网摘: n/a

近日体验了一下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>
 


    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();
  }
  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>

……

<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中的加入的数据列表

    由自定义标签中的标签java文件完成将数据打印出来的功能(用JspWriter类)

    在页面显示出来。查看jsp文件的源代码,可以看到自定义的标签和数据都转换为html的代码了