jsp的头代码,jsp头部报错

发布时间:2023-12-08

jsp的头代码,jsp头部报错

更新:2022-11-18 11:12

本文目录一览:

  1. JSP 的首页头部 标题 关键词 网页描述应该怎么写代码啊
  2. 自定义标签和jsp页面怎么实现
  3. 如何在Eclipse中设置默认的JSP文件头部编码
  4. 在Intellij Idea中怎么引入c标签
  5. jsp页面出现文件头
  6. jsp页面头部的这两种声明有啥区别?

JSP 的首页头部 标题 关键词 网页描述应该怎么写代码啊

在head 标签里添加以下标签

  1. 这里写关键词,多个关键词可以用逗号分开
    meta http-equiv="keywords" content="keyword1,keyword2,keyword3"
  2. 这里写描述
    meta http-equiv="description" content="This is my page"

自定义标签和jsp页面怎么实现

jsp自定义标签用法,供大家参考,具体如下:

什么是标记

使用HTML语言我们可以这样去编辑我们的网页:

HTML
HEAD
TITLE
HELLO WORLD
/TITLE
/HEAD
BODY
HELLO WORLD
/BODY
/HTML

在这里我们把 /HEADTITLEBODY 称为标记。HTML 标记是HTML文档的控制语言,用于指定浏览器显示和打印文档的方式。它是用小于号 < 和大于号 > 括起来的短语和符号,如 Html/Body 等。许多HTML标记以成对的方式出现,如 TITLE /TITLEBody/Body 等。在JSP中我们也可以定制自己的标记,以供JSP页面使用,如下例所示:

<%-- login.jsp --%>
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
<html>
<head>
<title>login</title>
</head>
<body>
<tagclass:login width="200" height= "100">
</tagclass:login>
</body>
</html>

在上例中 <tagclass:login> 就是一个JSP定制标记符。width、height是这个标记的属性。<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %> 是一个标记库定义指令,在稍后我们将会讨论。在JSP中定制标记符,实质上就是以标记的形式封装了一个具有独立功能的Java类。标记的使用减少了直接嵌入JSP页面的Java代码,方便了页面的布局,并且有利于代码的复用,提高了开发的效率。

JSP服务器解析标记的过程

那么当一个标记被嵌入JSP页面后,JSP服务器是如何对这个标记进行解析的呢?各对象的含义如下所示:

  • Client:表示客户端。
  • JSP-Server:JSP服务器。
  • JSP-Page:JSP页面。
  • TLD:标记库描述文件,定义标记和标记的各种属性和处理文件等。
  • TagClass:标记处理程序 当一个用户访问一个JSP页面时,这个请求被发送到JSP服务器,JSP服务器会根据这个请求去调用相应的页面,如果这个页面中有自定义的标记,JSP服务就会根据页面指令 <%@ taglib %> 去访问TLD得到处理程序的相关信息,接着调用该处理程序的构造器方法,启动标记符处理程序,并读取标记符的属性和相应值。对每个没有设置属性的,调用相应的 set 方法。当标记符第一次使用时,它的任何属性都不会做过设置,因此对每个属性都调用 set 方法。属性设置完以后,JSP服务器调用处理程序的 doStartTag(),然后再调用 doEndTag() 方法。最后JSP服务器会继续处理剩下的页面,在页面结尾调用 release() 方法,清理占用的所有资源。

TLD文件

TLD(Tag Library Descriptor标记库描述符)文件,标准的XML格式的标记定义文件,被用来存放标记符的信息,下面就是一个典型的TLD文件。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- XML的版本及其字符集 -->
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"">
<!-- 文档类型定义 -->
<taglib>
<tlibversion>1.0</tlibversion>
<!-- 标记库的版本 -->
<jspversion>1.1</jspversion>
<!-- 所使用的JSP的版本 -->
<shortname>tagclass</shortname>
<!-- 缺省的名称 -->
<tag>
<name>login</name>
<!-- 标记的名称 -->
<tagclass>tagclass.login.login</tagclass>
<!-- 处理这个Tag的相应的类的名称 -->
<info>
<!-- 对本标记符的描述 -->
</info>
<attribute>
<name>height</name>
<!-- 属性的名称 -->
<required>true</required>
<!-- 表示这个属性是不是必须的 -->
<rtexprvalue>true</rtexprvalue>
<!-- 表示这个属性是否可以用JSP的程序段的结果输出 -->
</attribute>
<attribute>
<name>width</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

在这个TLD文件中定义了只有一个标记符的标记符库,这个名为 login 的标记符会调用一个Applet以验证用户的合法性。处理这个标记的类就是 tagclass.login.login。width、height是这个标记的两个属性。属性是在使用标记符时作为参数发送的值。我们可以在上面的示例中增加几个标记,也可以为每个标记添加几个属性。我们开发标记符库时不一定非要从头开始,自己编写一个全新TLD。我们可以使用某个集成的开发环境,也可以修改上面的例子。

TagLib指令

那么当JSP服务器在解析一个标记符时,它是如何定义一个标记库的呢?这就是TagLib指令的主要责任。

Taglib 指令

定义一个标记库以及其自定义标记的前缀。

JSP 语法
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
例子
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
<html>
<head>
<title>login</title>
</head>
<body>
<tagclass:login width="200" height= "100">
</tagclass:login>
</body>
</html>
描述

<%@ taglib %> 指令声明此JSP文件使用了自定义的标记,同时引用标记库,也指定了他们的标记的前缀。你必须在使用自定义标记之前使用 <%@ taglib %> 指令。

属性
  • uri="URIToTagLibrary":Uniform Resource Identifier (URI) 根据标记的前缀对自定义的标记进行唯一的命名,URI可以是一个相对或绝对的路径。
  • prefix="tagPrefix":在自定义标记之前的前缀。如上例中的 /tagclass:login

标记符的处理程序(Tag handle)

我们还是以一个例子来看下如何实现一个Tag handle。首先是看一下它的类图: 让我们再看一下它的代码:

package tagclass.login;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.*;
import java.io.*;
public class login extends TagSupport {
    public login() {
        super();
    }
    public int doStartTag() throws JspTagException {
        JspWriter out = pageContext.getOut();
        try {
            out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100></APPLET>");
        } catch (Exception e) {
        }
        return SKIP_BODY;
    }
    public int doEndTag() throws JsptagException {
        return EVAL_PAGE;
    }
    public void release() {
        super.release();
    }
    public void setWidth(String language) {
        this.width = width;
    }
    public String getWidth() {
        return this.width;
    }
    public void setHeight(String height) {
        this.height = height;
    }
    public String getHeight() {
        return this.height;
    }
    private String width;
    private String height;
}

从以上我们可以看出,实现一个简单的标记符处理程序有几个要求:

  1. 增加一个类,使之继承 java.Servlet.jsp.tagext.TagSupport 类。这个类提供了 java.Servlet.jsp.tagext.Tag 接口所要求的所有的方法。另外,还需要使用一些基本的API,使JSP容器能够调用我们自己提供的标记符处理程序。
  2. 必须为每个标记符属性分别创建一个 getattributesetattribute 方法,JSP容器需要使用这些方法处理程序传递参数。
  3. 要为标记符处理程序创建一个构造器和自毁器。JSP需要使用构造器启动处理程序。自毁器是在 realease() 方法中定义的。在处理程序的生命周期结束时,需要调用自毁器释放所占用的资源。
  4. 创建两个名为 doStartTag()doEndTag() 的方法,执行具体的处理和输出动作。这两个方法是在处理自定义标记符的起始位置和结束位置调用的。它们的返回值是在 Tag Interface 里定义的静态 int,这几个静态值分别是:
  • SKIP_BODY(隐含0):跳过了开始和结束标签之间的代码。
  • EVAL_BODY_INCLUDE(隐含1):将body的内容输出到存在的输出流中
  • SKIP_PAGE(隐含5):忽略剩下的页面。
  • EVAL_PAGE(隐含6):继续执行下面的页 当然标记符也有它自己的缺点。很不方便的封装过程,有限的功能。对于一些不太复杂和功能单一的逻辑描述,需要传递的参数要求不高时,使用JSP标记,要方便的多。对于大多数的商业逻辑应用,还是使用bean要好的多,也宜于servlet控制。

附:文章中所用示例的完整代码

JSP代码:login.jsp

<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
<html>
<head>
<title></title>
</head>
<body>
<tagclass:login width="200" height= "100">
</tagclass:login>
</body>
</html>

标记符描述库:taglib.tld

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>tagclass</shortname>
<tag>
<name>login</name>
<tagclass>tagclass.login.login</tagclass>
<info>
</info>
<attribute>
<name>height</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>width</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

标记符处理程序:login.java

package tagclass.login;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.*;
import java.io.*;
public class login extends TagSupport {
    public login() {
        super();
    }
    public int doStartTag() throws JspTagException {
        JspWriter out = pageContext.getOut();
        try {
            out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100></APPLET>");
        } catch (Exception e) {
        }
        return SKIP_BODY;
    }
    public int doEndTag() throws JsptagException {
        return EVAL_PAGE;
    }
    public void release() {
        super.release();
    }
    public void setWidth(String language) {
        this.width = width;
    }
    public String getWidth() {
        return this.width;
    }
    public void setHeight(String height) {
        this.height = height;
    }
    public String getHeight() {
        return this.height;
    }
    private String width;
    private String height;
}

标记符处理程序中所使用的Applet:login.java

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class login extends Applet implements ActionListener {
    private String s_username;
    private String s_userpassword;
    private Button b_ok;
    private Button b_register;
    private Label l_username;
    private Label l_userpassword;
    private TextField t_username;
    private TextField t_userpassword;
    private GridLayout g_gridlayout;
    public void init() {
        b_ok = new Button("ok");
        b_register = new Button("register");
        l_username = new Label("name");
        l_userpassword = new Label("password");
        t_username = new TextField();
        t_userpassword = new TextField();
        b_ok.addActionListener(this);
        b_register.addActionListener(this);
        g_gridlayout = new GridLayout(3, 2, 10, 10);
        this.setLayout(g_gridlayout);
        add(l_username);
        add(t_username);
        add(l_userpassword);
        add(t_userpassword);
        add(b_ok);
        add(b_register);
    }
    public void actionPerformed(ActionEvent ev) {
        String s_label = ev.getActionCommand();
        if (s_label.equals("ok")) {
            t_username.setText("name");
        }
        if (s_label.equals("register")) {
            t_userpassword.setText("password");
        }
    }
    public void paint(Graphics g) {
    }
}

如何在Eclipse中设置默认的JSP文件头部编码

修改eclipse默认工作空间编码方式,General——Workspace——Text file encoding 修改工程编码方式,右击工程——Properties——Resource——Text file encoding 修改文件编码方式,和修改工程编码基本一致,右击文件——Properties 修改某类文件默认编码方式...

在Intellij Idea中怎么引入c标签

  1. 首先在jsp页面头部加如下代码:
<%@taglib prefix="c" uri="" %11

很多时候,当写完这句的时候,都会报一个错误提示信息。那么怎么解决? 进入“settings”设置选项,然后搜“DTD”然后如下图,在左边的标签选项卡找到“Schemas and DTDS” 然后选择右边的“External schemas and dtds”中的添加按钮

<%@taglib prefix="c" uri="" %11

然后选择ok,然后根据自己的需要配置

jsp页面出现文件头

jsp中的 <%@ pageEncoding="UTF-8"%> 是设置编码格式的,如果有中文的话统一指定为utf-8的话就不会出现乱码。 freemarker模板和传统的jsp+jstl我都用过,作为开发人员来说eclipse对jstl有提示,写起来比较顺手,jstl标签要求不那么严格,比如说 ${person.name} 这个属性为空自动显示为空字符串。freemarker对逻辑要求更严谨,比如如果你不做非空验证肯的那个会抛异常的,虽然异常提示很清楚,不过非空验证多了写起来太繁琐。

jsp页面头部的这两种声明有啥区别?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional

这句话就是告诉浏览器你用的html代码是哪一个版本 w3c根据你声明的版本来检查你的代码是否符合w3c规范 XHTML 1.0 Transitional 是过渡型, 具体的内容很多,想弄清楚还是要多看资料

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.1 Transitional//EN"

这样的不指定dtd的xml类型,如果你想css兼容好请使用

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"