描述
自定义jsp标签,实现注册页面跳转到欢迎页面
步骤
创建标签类处理文件WelcomeTag.java和RedStarTag.java
创建mytag.tld
创建welcome.jsp和register.jsp
问题
- 一开始按照书上的代码打,出现“unknown tag”的报错,发现没有将java文件放入包里,于是建包,没成功
- 发现自己没有classes文件,摸索了很久,在命令行下javac生成的class文件复制粘贴到web-inf下,没用
- 因为用的是eclipse走了一些弯路,发现web-inf下没有classes文件,去网上搜知道eclipse中生成的class文件在build下面,于是通过java build path改成classes
- 但是classes里仍然没有自动编译的class文件,通过javac编译生成的文件又没用,最后发现少加了jsp-api.jar这个文件,在环境变量里配置,还是失败
- 摸索中发现可以将jsp-api.jar文件放入jdk/jre/lib/ext下并且在java build path中libraries下添加改文件,还是没成功,但是有了正确的class文件
- 为什么jsp页面无法显示呢,我尝试将uri改成了/WEB-INF/mytag.lib,结果可以显示第一个界面,又把welcome.jsp中的uri和prefix颠倒让uri在前,两个界面都成功了
- 后来又尝试将uri换成http://www.mydomain.com/sample,依然成功,不知道为什么。。。
结果截图
代码
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.mydomain.com/sample" prefix="demo" %>
<html>
<head>
<title>Welcome Tag</title>
</head>
<body>
<h3><demo:welcome /></h3>
<h3><demo:welcome user="john" /></h3>
<h3><demo:welcome user="${param.custName}" /></h3>
<h3><demo:welcome user='<%= request.getParameter("custName") %>'/> </h3>
</body>
</html>
register.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://www.mydomain.com/sample" prefix="demo" %>
<html><head><title>User Register</title></head>
<body>
请输入客户信息,带<demo:star />的域必须填写。
<form action="welcome.jsp" method="post" >
<table>
<tr> <td>客户名</td>
<td><input type='text' name='custName'><demo:star /></td>
</tr>
<tr> <td> Email地址</td>
<td><input type='text' name='email'><demo:star /></td>
</tr>
<tr> <td> 电话 </td>
<td><input type='text' name='phone'><demo:star /></td>
</tr>
</table>
<input type='submit' value="提交" >
</form>
</body></html>
mytag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>TagExample</description>
<display-name>TagExample</display-name>
<tlib-version>1.1</tlib-version>
<short-name>Tag</short-name>
<uri>http://www.mydomain.com/sample</uri>
<tag>
<name>star</name>
<tag-class>com.demo.RedStarTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>welcome</name>
<tag-class>com.demo.WelcomeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>user</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
WelcomeTag.java
package com.demo;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class WelcomeTag extends SimpleTagSupport {
private String user;
public void setUser(String user) {
this.user = user;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out=getJspContext().getOut();
try{
if(user==null){
out.print("welcome,guest<br>");
}else{
out.print("welcome, "+user+"!<br>");
}
}catch (Exception e){
throw new JspException("Error doTag");
}
}
}}
RedStarTag.java
package com.demo;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class RedStarTag extends SimpleTagSupport {
@Override
public void doTag() throws IOException {
JspWriter out= getJspContext().getOut();
out.print("<font color='#FF0000'>*</font>");
}
}
标注一下对我有用的几篇文章:
https://blog.csdn.net/luman1991/article/details/52796980
http://my.oschina.net/u/852387/blog/393825
另外 jsp-version也是有很大影响的