环境
JDK1.7 + JAVAEE6
Myeclipse10
maven坐标
如果不是用javaee6而是用maven项目的话,需要引入如下坐标。
<dependencies>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
代码编写
项目结构
web.xml
因为用的web3.0,servlet3.0提供了注解简化了开发,不再像javaee5的web2.5一样每个servlet都需要配置web.xml文件了
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
HelloServlet
servlet使用@WebServlet("/url")注解代替xml配置映射关系。
import java.io.IOException;
import java.text.*;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = dateFormat.format(new Date());
req.setAttribute("currentTime",currentTime);
req.getRequestDispatcher("/WEB-INF/JSP/hello.jsp").forward(req,resp); /*注意url大小写,不要写错,否则找不到,比较坑*/
}
}
hello.jsp
默认模板新建一个jsp,然后使用el表达式访问request中的内容。
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'hello.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
${currentTime}
</body>
</html>
测试
浏览器访问http://localhost:8080/web3/hello
tld自定义标签
1.写一个标签对应的java类继承SimpleTagSupport类并覆盖doTag()方法。
2.在WEB-INF下面新建一个tld文件,名字随意,在文件中定义标签名并指定标签对应的java类。
body-content:
- empty:这个是一个空标记.
- scriptless:标记主体可以有内容, 并且jsp容器会去处理里面的jsp元素, 这些内容可以是文本, EL表达式, 标准动作甚至另一个自定义标记.(默认情况下是这个值)
- tagdependent:标记主体可以有内容, 而jsp容器会把它们当作纯文件处理
3.使用时需要在jsp最上面引入tld文件,可以写tld的文件路径,也可以写tld文件中定义的uri。
<%@ taglib prefix="at" uri="/WEB-INF/autumn.tld"%>
输出标签
通过标签向jsp界面输出内容。
标签处理类
新建一个java类
package com.autumn.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
//获取向界面输出的对象
JspWriter out = getJspContext().getOut();
out.println("Hello autumn Tag!");
}
}
tld中定义tag
在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>at</short-name>
<!-- 通过标签向jsp输出内容 -->
<tag>
<name>Hello</name>
<tag-class>com.autumn.tag.HelloTag</tag-class>
<!-- body-content为empty时标签中间不能填写任何内容 -->
<body-content>empty</body-content>
</tag>
</taglib>
jsp中使用tag
先用taglib指令引用tld文件并指定前缀,然后再通过前缀去使用标签。
<%@ taglib prefix="at" uri="/WEB-INF/autumn.tld"%>
<!-- 通过标签向jsp输出内容 -->
<at:Hello></at:Hello>
访问标签体
标签处理类
新建一个java类
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 标签处理类: 访问标签体
*/
public class BodyTag extends SimpleTagSupport{
StringWriter sw = new StringWriter();
@Override
public void doTag() throws JspException, IOException {
getJspBody().invoke(sw); //获取标签中间的内容
System.out.println(sw.toString());
getJspContext().getOut().println(sw.toString()); //把内容在向前端输出
}
}
tld中定义tag
在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>at</short-name>
<!-- 访问标签体:通过标签向java处理类传递标签中间的内容 -->
<tag>
<name>Hello2</name>
<tag-class>com.autumn.tag.BodyTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
jsp中使用tag
先用taglib指令引用tld文件并指定前缀,然后再通过前缀去使用标签。
<%@ taglib prefix="at" uri="/WEB-INF/autumn.tld"%>
<!-- 通过标签体向处理类传递参数 -->
<at:Hello2>this is message body</at:Hello2>
后台可以获取标签体的字符串
访问标签属性
标签处理类
新建一个java类
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 标签处理类: 自定义标签属性
*/
public class AttrTag extends SimpleTagSupport{
//标签属性与这里的变量一一对应
private String message;
// 通过set方法把标签的属性值放入变量,所以一定要实现变量的set方法
public void setMessage(String msg) {
this.message = msg;
}
StringWriter sw = new StringWriter();
@Override
public void doTag() throws JspException, IOException {
if (message != null) {
/* Use message from attribute */
JspWriter out = getJspContext().getOut();
out.println("this is attribute: "+message);
} else {
/* use message from the body */
getJspBody().invoke(sw);
getJspContext().getOut().println("this is tagbody:" + sw.toString());
}
}
}
tld中定义tag
在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>at</short-name>
<!-- 访问标签属性: 通过标签属性向java处理类传递变量 -->
<tag>
<name>Hello3</name>
<tag-class>com.autumn.tag.AttrTag</tag-class>
<body-content>scriptless</body-content>
<!-- 标签属性 -->
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
jsp中使用tag
先用taglib指令引用tld文件并指定前缀,然后再通过前缀去使用标签。
<%@ taglib prefix="at" uri="/WEB-INF/autumn.tld"%>
<!-- 通过标签属性向处理类传递参数 -->
<at:Hello3 message="this is message3"/>
tag文件自定义标签
tag文件
在WEB-INF下面新建一个tag文件,内容如下
<%@ tag language="java" pageEncoding="UTF-8"%>
<p>
<% int size=1;
for(int i=1;i<=3;i++) {
size=size+1;
%>
<br>
<font size=<%=size%> style="background-color:#ff<%=size%>">
<!-- jsp:doBody代表标签的本体文字 -->
<jsp:doBody />
</font>
<%
}
%>
</p>
jsp中使用
首先像引入tld文件一样引入标签的文件夹tagdir,并定义前缀。
<%@ taglib prefix="tg" tagdir="/WEB-INF/tags" %>
<tg:show>
message for tag file
</tg:show>