Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29951169
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2008-12-10 09:53:05

近日体验了一下Eclipse
 
打开某个jsp页面,页面上的select下拉列表框用Struts自定义标签来完成
 
1、新建页面:Test.jsp
 
2、在Web应用的WEB-INF目录下自定义标签TLD文件:TestTag.tld

">

   1.0
   1.1
   dtree
  
 
  
     selectResnodes
     myWeb.taglib.SelectTag
     empty
    
        id
        true
        false
    

    
        nodeslist
        true
        false
     

    
         scope
         false
         false
     

  
 
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("");
    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文件:
……
  ……
   
      
  
  ……
……
 
6、保证Test.jsp中包含如下的代码:
<%@ taglib uri="/WEB-INF/TestTag.tld" prefix="slotnode"%> 

……

selectResnodes id="nodelist" nodeslist="resnodesList" scope="request" />

……

其中prefix的名字是随便起的,只要有意义就可以。
 
但是在后面用的时候就要用这个名字,本例中是slotnode。
selectResnodes和TestTag.tld中定义的selectResnodes……必须是相同的的
另外nodeslist="resnodesList"中resnodesList即TestAction.java中定义的
request.setAttribute("resnodesList",alNodes);  中写入的属性resnodesList,两个名字必须是相同的。
 
7、比如我的Web应用发布的名字为LearnTag,发布在本地的Tomcat中,默认端口8080
则在地址栏输入:
 
OK。出来结果了吧。
整理的有点乱,再总结一下:
从页面发起.do请求,请求转至action,在action文件中执行数据库查询,取得需要的数据
将查询得到的数据列表用setAttribute加入request
自定义标签中取request中的加入的数据列表
由自定义标签中的标签java文件完成将数据打印出来的功能(用JspWriter类)
 
在页面显示出来。查看jsp文件的源代码,可以看到自定义的标签和数据都转换为html的代码了
阅读(1717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~