为什么我的自定义标记在jsp中出现多次?

vs3odd8k  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(216)

我在代码中使用了一个自定义标签来接收用户输入,但是jsp页面有多个输入,这是什么原因?
也请建议我一个适当的文档或任何资源来详细了解这些标记。
这是输出图像。

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib uri="/WEB-INF/myLib.tld" prefix="input" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
        <h1>JSP page data</h1>
        <hr>
        <form action="success.jsp" method="post">
            <input:iemail email=""></input:iemail>
            <input:iid id=""></input:iid>
            <input:iname name=""></input:iname>
            <input:ipass password=""></input:ipass>
            <input type="submit" value="Submit"/>
        </form>
        
</body>
</html>

myLib.tld
x一个一个一个一个x一个一个二个x
文本域和数字域应该只出现一次,不能重复。

irlmq6kh

irlmq6kh1#

如何在JSP中创建一个自定义标签。我正在创建一个自定义输入标签在JSP中。
因此,首先我们必须导入TagSupport jar文件,然后我们必须为我们的标记创建一个Java类。(例如MyCustomTag.java
然后,我们必须将该库中的TagSupport类继承给CustomTag java类。
然后我们将覆盖SuperClass TagSupport类的doStartTag方法。
这是重要的一步,我们将创建一个变量,我们希望在我们的html。让我们说,如果我们想创建一个输入字段,有不同的属性,如<input attr1(type="text") attr2(id="elmntid") attr3(name="elemntname") required
此外,我们还将为输入标记设置一个label,因此

<label > Attribut(labelname of inputfield)-->lets take "title">

然后根据这些属性,我们必须在自定义标记类中编写公共变量,例如

public String type;
public String id;
public String style;
public String name;
public String title;

(took标签标题bcoz标签会混淆)
然后在IDE中单击生成这些变量的getter和setter。
在那之后有一个Java类

JspWriter out = pageContext.getOut();

然后我们可以编写想要在out.println();中显示的代码
例如:

out.print("<label>"+title+"</label>");
out.println("<input type='"+ type +"' name = "'+ elmntname +'" id='"+ elmntid +"'>");

//////这将是使用自定义标记访问的行
然后用try catch包围它
web-xml文件中创建一个标记描述符库文件eg(myLib.tld),然后复制我在下面给出的代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library               1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>testing</short-name>
<uri>http://www.tomcat-demo.com/testing</uri>
<description>This is a demonstration tag library</description>

然后写入标签详细信息;第一写入起始标记

<tag>
<name>mytag</name>           ----> this is your tag name
<tag-class>(package_name.classname)CustomTagPackage.MyCustomTag.java</tag-   class>

然后开始将这些类的属性作为变量写入Java文件;
写上你的属性名,然后写上它是必需的,或者不是,意味着前端开发人员,将要使用这个标记,他应该使用你提到的标记作为必需的。
那就这样吧

<attribute>
        <name>name</name>
        <required>true</required>
    </attribute>

    <attribute>
        <name>id</name>
        <required>true</required>
    </attribute>

然后像这样写剩下的并关闭上面</taglib>的标记
代码应该是
myLib.tld(有些注解标记不是在java文件中创建的,所以如果需要,可以创建一个)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library  1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>testing</short-name>
<uri>http://www.tomcat-demo.com/testing</uri>
<description>This is a demonstration tag library</description>
<tag>
    <name>mytag</name>
    <tag-class>MyCustomTag.MyCustomTag</tag-class>

    <attribute>
        <name>name</name>
        <required>true</required>
    </attribute>

    <attribute>
        <name>id</name>
        <required>true</required>
    </attribute>

    <attribute>
        <name>title</name>
        <required>false</required>
    </attribute>

    <attribute>
        <name>type</name>
        <required>true</required>
    </attribute>

    //<attribute>
        <name>placeholder</name>
        <required>false</required>
    //</attribute>

    <attribute>
        <name>style</name>
        <required>false</required>
    </attribute>

    //<attribute>
        <name>requiretag</name>
    //</attribute>
</tag>
</taglib>

那么你只需要在你的jsp中导入标记库描述符文件
像这样

<%@taglib uri="/WEB-INF/myLib.tld" prefix="mtprefix"%>

并且必须使用前缀名称(mtprefix,通过它可以访问自定义标记)
保存jsp,然后就可以在java文件中使用自定义标记了
在jsp中,只要你输入"〈"并按ctrl + spce,它就会显示你的自定义标签,然后如果你输入它,它就会出现,就像你在java代码中设计的那样。
例如

<mtprefix:mytag title="Enter email:" name="stdemail" type="email" id="stdemail"    placeholder="johndoe@email.com" style=""></mtprefix:mytag>

(Note:title被写成标签名称)在这里,在上面的标签代码中,你可以像普通的html代码一样传递任何值,并且你可以随意使用你的标签。
您也可以使用StringBuffer来提高内存效率,然后将其添加到out. print();
此处为完整代码
MyCustomTag.java

package MyCustomTag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class MyCustomTag extends TagSupport {
public String type;
public String id;
public String name;
public String title;
public String placeholder;
public String style;
public boolean requiretag;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public boolean isRequiretag() {
    return requiretag;
}

public void setRequiretag(boolean requiretag) {
    this.requiretag = requiretag;
}

public String getStyle() {
    return style;
}

public void setStyle(String style) {
    this.style = style;
}

public String getPlaceholder() {
    return placeholder;
}

public void setPlaceholder(String placeholder) {
    this.placeholder = placeholder;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String gettitle() {
    return title;
}

public void settitle(String title) {
    this.title = title;
}

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

@Override
public int doStartTag() throws JspException {
    JspWriter out = pageContext.getOut();

    StringBuffer sb = new StringBuffer();
    try {
            sb.append("<label style='width:200px;' 'padding-left:70px;'>" +   title + "</label>");
            sb.append("<input type='" + type + "' name='" + name + "' id= '" + id + "' placeholder= '" + placeholder + "' ><br>");
        }
        out.println(sb);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return SKIP_BODY;
}

}
上面提到了myLib.tld
jsp页面代码(表单)

<form class="" action="login.do" id="myform">
                <div class="bodyofmodal" style="text-align: left;">
                    <mtprefix:mytag title="Enter id:" name="stdid" id="stdid"
                        type="number" placeholder="Enter three digit ID"
                         style=""></mtprefix:mytag>


                    <mtprefix:mytag title="Enter Name:" name="stdname"   type="text" id="stdname" placeholder="John Doe" style=""></mtprefix:mytag>


                    <mtprefix:mytag title="Enter email:" name="stdemail" type="email"  id="stdemail" placeholder="johndoe@email.com" style=""></mtprefix:mytag>


                    <mtprefix:mytag title="Password:" name="stdpassword"
                        type="password" id="stdpassword" placeholder="Enter Password"
                        style="" ></mtprefix:mytag>
                </div>

相关问题