实现java中的占位符

作者: Furion | 来源:发表于2016-05-25 20:53 被阅读1996次

    学习过.net MVC 的同学,都知道其中用一个文件share /_Layout.cshtml,它主要实现的是一个类似母版页(可以参照word的母版)的功能,那么在javaee中是否有类似的功能呢?其实javaee 提供了一个包含页面的动作:

    <jsp:include page="a.jsp" flush="true"/>

    它能引入一些公共的部分,但是如果公共的地方不止一处,则需要写很多的类似语句。有没有一个类似.net中母版页的功能呢?据我现在所知,javaee中是没有的,当初我遇到高重复的页面时,百度了很久,终于在一个技术blog中找到实现该功能的demo,由于时间太久已经忘记在哪找到,如果我接下来写的侵犯了原作者权益,看见立删。

    想实现这个功能要有以下文件:

    1:BlockTag.java:

    2: OverwriteTag.java

    3:MyTag.tld

    4:web.xml

    5:_Layout.jsp

    1,2两个文件放在src下的一个包中如:com.**.util

    3放在web-inf 下

    1:BlockTag.java

    import java.io.IOException;

    import javax.servlet.ServletRequest;

    import javax.servlet.jsp.JspException;

    import javax.servlet.jsp.tagext.BodyTagSupport;

    import org.apache.commons.lang.StringUtils;

    public class BlockTag extends BodyTagSupport {

    /**

    * 占位模块名称

    */

    private String name;

    private static final long serialVersionUID = 1425068108614007667L;

    @Override

    public int doStartTag() throws JspException{

    return super.doStartTag();

    }

    @Override

    public int doEndTag() throws JspException {

    ServletRequest request = pageContext.getRequest();

    //block标签中的默认值

    String defaultContent = (getBodyContent() == null)?"":getBodyContent().getString();

    String bodyContent = (String) request.getAttribute(OverwriteTag.PREFIX+ name);

    //如果页面没有重写该模块则显示默认内容

    bodyContent = StringUtils.isEmpty(bodyContent)?defaultContent:bodyContent;

    try {

    pageContext.getOut().write(bodyContent);

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    // TODO Auto-generated method stub

    return super.doEndTag();

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    }

    2:OverwriteTag.java

    import javax.servlet.ServletRequest;

    import javax.servlet.jsp.JspException;

    import javax.servlet.jsp.tagext.BodyContent;

    import javax.servlet.jsp.tagext.BodyTagSupport;

    import org.apache.commons.lang.StringUtils;

    /**

    * 自定义标签,用于在jsp模板中重写指定的占位内容

    *

    * 基本原理:

    * 将overwrite标签内容部分添加到ServletRequest的attribute属性中

    * 在后续block标签中再通过属性名读取出来,将其渲染到最终的页面上即可

    *

    *

    */

    public class OverwriteTag extends BodyTagSupport {

    private static final long serialVersionUID = 5901780136314677968L;

    //模块名的前缀

    public static final String PREFIX = "JspTemplateBlockName_";

    //模块名

    private String name;

    public int doStartTag() throws JspException {

    // TODO Auto-generated method stub

    return super.doStartTag();

    }

    @Override

    public int doEndTag() throws JspException {

    ServletRequest request = pageContext.getRequest();

    //标签内容

    BodyContent bodyContent = getBodyContent();

    request.setAttribute(PREFIX+name,  StringUtils.trim(bodyContent.getString()));

    // TODO Auto-generated method stub

    return super.doEndTag();

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    }

    3:mytab

    <?xml version="1.0" encoding="utf-8"?>

    <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

    <tlib-version>1.0</tlib-version>

    <jsp-version>2.0</jsp-version>

    <short-name>Mytag</short-name>

    <uri>mytag</uri>

    <tag>

      <name>block</name> <!--tag的名字-->

    <tag-class>com.wsbalance.util.BlockTag</tag-class> <!--对应其中的java类-->

    <body-content>jsp</body-content>

    <!--JSP,empty,scriptless,tagdependent

    JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、

    JSP指令和动作

    empty:空标记,即起始标记和结束标记之间没有内容

    scriptless:接受文本、EL和JSP动作。如<%=request.getProtocol()%>使用

    scriptless 则报错

    tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释-->

    <attribute><!--tag的参数-->

    <name>name</name> <!--参数名-->

    <required>true</required><!--是否是必填选项-->

    <rtexprvalue>true</rtexprvalue><!--是否可以动态赋值-->

    <type>java.lang.String</type><!--参数类型-->

    </attribute>

    </tag>

    <tag>

    <name>ouerwrite</name>

    <tag-class>com.**.util.OverwriteTag</tag-class>

    <body-content>jsp</body-content>

    <attribute>

    <name>name</name>

    <required>true<required>

    <rtexprvalue>true<rtexprvalue>

    <type>java.lang.String</type>

    </attribute>

    </tag>

    </taglib>

    4:web.xml

    web.xml中配置自定义标签

    5:在share/_layout.jsp中写母版

    母版页中(注意Layout:block>)

    6:子页面中:

    好了结束了,如果有不太懂的请留言哦,第一次写如有不足请多多关照!!

    相关文章

      网友评论

        本文标题:实现java中的占位符

        本文链接:https://www.haomeiwen.com/subject/dlvtdttx.html