jsp自定义标签,容器是如何找到.tld文件的

使用jsp自定义标签,我在web.xml里没有配置.tld 文件存放的位置,只是把它放到web-inf下, 容器是如何找到它的位置的。

回答: jsp自定义标签,容器是如何找到.tld文件的

  1. 1、使用uri找 如http://abc.com/a
    1.1、如果web.xml配置了 taglib 那么使用这个
    1.2、如果1没找到 那么到WEB-INF 及classpath(lib/classes)下搜索

    2、使用如
    <%@taglib prefix="time" tagdir="/WEB-INF/tags/time" %>
    可参考
    http://blog.csdn.net/daryl715/article/details/1536887

jsp自定义标签的参数赋值的问题!

  1. Q
    请问大家,有关jsp自定义标签中。在tld中设置的属性:
    <attribute>
    <name>type</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>

    在实现的类中,则以private int type;来getType();setType();

    这样的话应该是线程不安全的吧~~

    请问jsp自定义标签中的参数如何达到线程安全的呢???


    谢谢大家参与讨论!
  2. A
    你可以重载release方法,在里面写type = null;

jsp自定义标签,如何取得父标签?

  1. Q
    谁知道jsp自定义标签,如何取得父标签?
    我做一个嵌套的标签,怎么能在子标签里取得父标签啊?
  2. A
    在你的子标签里用个体
    getParent()方法就能取得父标签,但是记得要转换类型啊
    因为他取出来的是Tag类型的,只要把他转化成你父标签的类型就行啦

jsp自定义标签中能使用jstl的forEach标签吗?

  1. Q
    我的自定义标签中使用了jstl的forEach标签但是没有效果,如果我想使用其他标签应该怎么做?
  2. A
    <tag>
        <name>hello</name>
        <tag-class>cn.javass.web.taglib.HelloTag</tag-class>
        <body-content>JSP</body-content>
    </tag>

    <body-content>JSP</body-content>

struts2 整合freemarker 使用jsp自定义标签出错

  1. Q
    ==> assignment: my=JspTaglibs["/WEB-INF/cust_tag.tld"] [on line 2, column 1 in app/notice/noticeList.ftl]
    ----------

    Java backtrace for programmers:
    ----------
    freemarker.template.TemplateModelException: Could not load taglib information
    at freemarker.ext.jsp.TaglibFactory.get(TaglibFactory.java:184)

    web.xml
    加了 还是不行,困扰我两天了

    <servlet>
    <servlet-name>JSPSupportServlet</servlet-name>
    <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

    action 跳转的 ftl 页面加了
    <#assign my=JspTaglibs["/WEB-INF/cust_tag.tld"]> 
    还是不行
  2. A
    我觉得 应该看看 stacktrace 中 cause: 或者root cause:开头那部分。

    看起来是加载tld文件出问题了。

    考虑如下问题
    tld文件放对位置了吗?
    tld文件内容正确吗?
    tld里声明的类能在classpath里找到吗?

JSP自定义标签的类实例化时难道是单例?

  1. Q
    我写的自定义标签的类,继承自TagSupport
    jsp页里引入了2次这个标签,可类里就执行了一次构造函数,实例化了一次
    自定义标签类是有属性的,如果是单例属性就乱了

    请问这是怎么回事
  2. A
    你有没有看过jsp转化为的servlet。无论几个taglib,只要是相同的,最终都会转化为一个方法
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
    最终在servlet只转化为了下面一个方法
      private boolean _jspx_meth_c_005fout_005f0(PageContext _jspx_page_context)
              throws Throwable {
        PageContext pageContext = _jspx_page_context;
        JspWriter out = _jspx_page_context.getOut();
        //  c:out
        org.apache.taglibs.standard.tag.rt.core.OutTag _jspx_th_c_005fout_005f0 = (org.apache.taglibs.standard.tag.rt.core.OutTag) _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.OutTag.class);
        _jspx_th_c_005fout_005f0.setPageContext(_jspx_page_context);
        _jspx_th_c_005fout_005f0.setParent(null);
        // /index.jsp(21,8) name = value type = null reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
        _jspx_th_c_005fout_005f0.setValue((java.lang.Object) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${param.d}", java.lang.Object.class, (PageContext)_jspx_page_context, null, false));
        int _jspx_eval_c_005fout_005f0 = _jspx_th_c_005fout_005f0.doStartTag();
        if (_jspx_th_c_005fout_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
          _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.reuse(_jspx_th_c_005fout_005f0);
          return true;
        }
        _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.reuse(_jspx_th_c_005fout_005f0);
        return false;
      }

jsp自定义标签效率问题

  1. Q
    我目前做的一个项目中有一个下拉框的问题。在不同页面下拉框的选项都可以在字典表中定义。
    我在项目里写了一个简单的自定义下拉框。标签里选项取数据问题,代码如下。
    还请各位指点下,这里面的效率问题。我这样写会不会有什么不妥的地方。尤其是执行sql那块。我是直接WebApplicationContextUtils这个类去得到jdbc的连接.这样会不会存在什么问题!


    public class DictTag extends TagSupport{
    	/*
    	 * 选择框  id
    	 */
    	private String id;
    	/*
    	 * 选择框  name
    	 */
    	private String name;
    	/*
    	 * 选择框  通过下拉框value默认选中
    	 */
    	private String selectValue;
    	/*
    	 * 选择框  通过下拉框文本默认选中
    	 */
    	private String selectText;
    	
    	/*
    	 * 要显示字典中组的选项
    	 */
    	private String dictGroupId;
    	/*
    	 * 默认值
    	 */
    	private String defaultValue = "";
    	/*
    	 * 默认文本
    	 */
    	private String defaultText = "请选择";
    
    	public String getDefaultValue() {
    		return defaultValue;
    	}
    	public void setDefaultValue(String defaultValue) {
    		this.defaultValue = defaultValue;
    	}
    	public String getDefaultText() {
    		return defaultText;
    	}
    	public void setDefaultText(String defaultText) {
    		this.defaultText = defaultText;
    	}
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSelectValue() {
    		return selectValue;
    	}
    	public void setSelectValue(String selectValue) {
    		this.selectValue = selectValue;
    	}
    	public String getSelectText() {
    		return selectText;
    	}
    	public void setSelectText(String selectText) {
    		this.selectText = selectText;
    	}
    	public String getDictGroupId() {
    		return dictGroupId;
    	}
    	public void setDictGroupId(String dictGroupId) {
    		this.dictGroupId = dictGroupId;
    	}
    
    
    	/**
    	 * 标签加载开始
    	 */
    	@Override
    	public int doStartTag(){
    		StringBuffer select = new StringBuffer();
    		select.append("<select");
    		/*
    		 * 给select加上id
    		 */
    		if(id != null && !"".equals(id)) {
    			select.append(" id='")	
    				  .append(id)	
    				  .append("'");	
    		}
    		/*
    		 * 给select加上name
    		 */
    		if(name != null && !"".equals(name)) {
    			select.append(" name='")	
    				  .append(name)	
    				  .append("'");	
    		}
    		select.append(">");
    		if(dictGroupId != null && !"".equals(dictGroupId)) {
    			/*
    			 * 查找字典表中的选项sql
    			 */
    			String sql = "SELECT d.entry_value,d.entry_name FROM t_sys_dict d ,t_sys_dictgroup dg "
    						+"WHERE dg.dictgroup_id = ? AND d.dictgroup_id = dg.dictgroup_id ";
    			Object[] args = {Integer.valueOf(dictGroupId)}; 
    			select.append("<option value='");
    			select.append(defaultValue);
    			select.append("'>");
    			select.append(defaultText);
    			select.append("</option>");
    			List list = new ArrayList();
    			try {
    				/*
    				 * 执行sql
    				 */
    				org.springframework.jdbc.core.JdbcTemplate jdbc = (org.springframework.jdbc.core.JdbcTemplate)org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(this.pageContext.getServletContext()).getBean("jdbcTemplate");
    				list =  jdbc.queryForList(sql,args);
    			} catch (Exception e1) {
    				
    			}
    			if (list != null && list.size() > 0) {
    				for (int i=0;i<list.size();i++) {
    					Map map = (Map)list.get(i);
    					String selectStatus = "";
    					if(selectValue != null && !"".equals(selectValue) && selectValue.equals(map.get("entry_value").toString())) {
    						selectStatus = "selected='selected'";
    					}
    					if(selectText != null && !"".equals(selectText) && selectText.equals(map.get("entry_name").toString())) {
    						selectStatus = "selected='selected'";
    					}
    					select.append("<option value='");
    					select.append(map.get("entry_value"));
    					select.append("' ");
    					select.append(selectStatus);
    					select.append(">");
    					select.append(map.get("entry_name"));
    					select.append("</option>");
    				}
    			}
    			JspWriter jsp = this.pageContext.getOut();
    			try {
    				jsp.print(select.toString());
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		} else {
    			select.append("<option value=''>");
    			select.append("无下拉选项");
    			select.append("</option>");
    		}
    		select.append("</select>");
    		return SKIP_BODY;
    	}
    }
    

    问题补充:kidd3166 写道没什么问题,最大的问题是你每次都重新从数据库里加载数据,你可以适当的从缓存里拿数据

    请问具体的操作是什么 ! 如何实现从缓存中取数
  2. A
    简单的话可以建个hashmap,将查询出来的数据放进去,下次就在这里取,不用查数据库了,当有CUD就更新下,因为字典的内容没有需求是不会怎样变的

如何快速的替换jsp页面自定义标签

  1. Q
    目前做一个项目的升级,以前写了很多自定义标签,现在对这个系统进行升级,以前做的那些自定义标签全部要替换目前的新标签,
    为了以后的升级,要用程序实现,
    目前一个办法,就是把那些jsp文件用IO流的形式对出来,在用正则去匹配,这样,也面多了很耗性能,不知道给位大侠有什么更好的思路,说来听听, 谢谢
    问题补充:7454103 写道引用前一个办法,就是把那些jsp文件用IO流的形式对出来,在用正则去匹配,这样,也面多了很耗性能,

    排到最后把!  虽然我没有很优雅的设计

    对标签升级? 为什么不是 改变原来的名字 只是把相应的功能实现 进行升级呢!
    就是 置换 核心!


    升级的内容不是我做的,现在让我对页面上所有的标签进行替换,我也搞不清楚他们是怎么想的,是否有更好的方案呢?
    问题补充:7454103 写道引用前一个办法,就是把那些jsp文件用IO流的形式对出来,在用正则去匹配,这样,也面多了很耗性能,

    排到最后把!  虽然我没有很优雅的设计

    对标签升级? 为什么不是 改变原来的名字 只是把相应的功能实现 进行升级呢!
    就是 置换 核心!


    引用
    之前的那个业务不是我做的,现在我要改前台页面上面所有的设计到以前的那些自定义标签,有没有更好的设计方案?

    问题补充:7454103 写道引用升级的内容不是我做的,现在让我对页面上所有的标签进行替换,我也搞不清楚他们是怎么想的,是否有更好的方案呢?


    如何快速的替换jsp页面自定义标签
      原来如此哈!  Myeclipse 自带 批量 搜索和替换 功能哦! 难道要试试!

    Search--file--- *.jsp
    引用这个我想过了,要用程序实现,我想看看大家有什么更好的方案
    问题补充:7454103 写道引用升级的内容不是我做的,现在让我对页面上所有的标签进行替换,我也搞不清楚他们是怎么想的,是否有更好的方案呢?


    如何快速的替换jsp页面自定义标签
      原来如此哈!  Myeclipse 自带 批量 搜索和替换 功能哦! 难道要试试!

    Search--file--- *.jsp
    引用现在要改成可以维护了,Myeclipse 自带的 我知道,但是上面要用程序实现,增强程序的可以维护行,你没有更好的方案?
  2. A
    引用升级的内容不是我做的,现在让我对页面上所有的标签进行替换,我也搞不清楚他们是怎么想的,是否有更好的方案呢?


    如何快速的替换jsp页面自定义标签
      原来如此哈!  Myeclipse 自带 批量 搜索和替换 功能哦! 难道要试试!

    Search--file--- *.jsp

有两个自定义标签A和B继承TagSupport,怎么样在A标签中使用B标签?

  1. Q
    有两个自定义标签A和B,怎么样在A标签中使用B标签?
  2. A
    明白了。。
    如果说自定义的标签,在a标签对应的tld文件中找到
        <body-content>empty</body-content>
        改为
        <body-content>JSP</body-content>
    然后在需要使用的页面,导入A标签,B标签

关于Freemarker自定义标签问题

  1. Q

     请问在ftl怎样才能像调用jsp那样方便的调用自定义标签?在一个ftl里面去include另一个ftl并用它里面的标签去取数据并展现又应该怎能去实现?

    在SpringMvc中用ftl做页面展示,比如:

     

    @RequestMapping("/test")
    	public void test(HttpServletRequest request,HttpServletResponse response){
    		Map<String,Object> root=new HashMap<String, Object>();
            root.put("ts", new LabelDirective());
            FreeMarkertUtil.processTemplate(sysConfig.getBlogTemplatePath(request),"list.ftl", "UTF-8", root,response);
    	}

     

     root.put("ts", new LabelDirective());的确能创建一个叫ts的标签,但是这样会非常麻烦,因为每次处理完业务之后都要非常被动的去生成标签。如果return的String直接是list.ftl有没办法调用自定义标签。 

    public String test(xxxxx){
        return "list";
    }

     

     

  2. A
    用org.springframework.context.support.ReloadableResourceBundleMessageSource集成Spring和Freemarker。
    <bean id="xxx" class="com.xxx.Directive"/>

    org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer map xxx