前面我们把Tomcat+JDK1.5+MySQL+Eclipse架构搭起来了,接下去的工作是举一个小例子让初学者明白如何创建和发布Web应用,有了一个总的框架,这样大家在做JSP和Servlet的时候就不会有一种破损残缺、缺乏系统的感觉,我的学习方式历来是由粗到细,先看树木再俯瞰森林会把我弄疯的......
1、首先创建Web应用的目录结构,我这里在Tomcat的/webapps下面创建一个Web应用的目录helloapp,这是Web应用的根目录,所有JSP和HTML文件都存放在此目录下;它下一级有个WEB-INF文件夹,它存放web.xml文件和classes、lib文件夹,详细后面再说,先建了。
2、介绍web.xml文件。这是一个发布描述文件,用来配置发布信息,包括:Servlet定义;Servlet初始化参数;Servlet以及JSP的映射;安全域配置参数;welcome文件清单;资源引用;环境变量的定义。闲话少说,创建web.xml文件,内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
</web-app>
第一行指定XML的版本和字符编码,第二行指定文档类型,<web-app>中放着关于Web应用的配置元素。
3、在server.xml中加入<Context>元素。server.xml在/conf下,打开后在<host>后面加入如下<Context>元素
<Context path="/helloapp" docBase="helloapp" debug="0"
reloadable="true"/>
其中,path指定访问该Web应用的URL入口;docBase指定Web应用的文件路径;reloadable如果为true,一旦class文件被更新,服务器会自动重新加载Web应用,当然这样会加重服务器运行负荷。
4、部署HTML文件。在helloapp下创建index.html文件,内容如下:
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<p><font size="7">Welcome to Alec's Home</p>
<p><a href="login.jsp?language=English">English version</a>
</body>
</html>
在浏览器地址栏键入http://localhost:8080/helloapp/index.html
5、部署JSP。创建两个JSP文件,一个login.jsp,一个hello.jsp。前者显示登陆页面,要求输入用户名和口令,这个页面链接到名为DispatcherServlet的Servlet。后者被这个Servlet调用,显示hello页面。如前面所说,JSP文件都放在helloapp下。
<html>
<head>
<title>Alex's Addressing</title>
</head>
<body>
<br>
<form name="loginForm" method="post" action="dispatcher">
<table>
<tr>
<td><div align="right">用户名:</div></td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="Submit" name="Submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
上述是login.jsp文件内容。
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<b>欢迎:<%=request.getAttribute("USER")%></b>
</body>
</html>
这是hello.jsp文件内容。
6、部署Servlet。创建名为DispatcherServlet.java的文件编译成Servlet,它调用HttpServletRequest对象的getParameter方法读取提交的loginForm表单数据,获取用户名和口令,然后将用户名和口令保存在HttpServletRequest对象的属性中,在把请求转发给hello.jsp。
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class DispatcherServlet extends HttpServlet
{
public String target="/hello.jsp";
public void init(ServletConfig config)
throws ServletException{
super.init(config);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
String username=request.getParameter("username");
String password=request.getParameter("password");
request.setAttribute("USER",username);
request.setAttribute("PASSWORD",password);
//将请求定向到目标文件
ServletContext context=getServletContext();
System.out.println("重定向到"+target);
RequestDispatcher dispatcher=context.getRequestDispatcher(target);
dispatcher.forward(request,response);
}
public void destroy(){
}
}
上述是DispatcherServlet.java文件,用来编译成servlet。编译成class文件后存放位置为/helloapp/WEB-INF/classes/mypack/DispatcherServlet.class;然后在/helloapp下的web.xml中作如下修改:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/j2ee/dtds/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
</web-app>
说明一下,<servlet-name>定义Servlet的名字;<servlet-class>指定实现这个Servlet的类;<init-param>定义Servlet的初始化参数(包括参数名和参数值),一个<servlet>元素中可以有多个<init-param>元素;<load-on-startup>指当Web应用启动时,装载Servlet的次序。当这个值为正数或零时,Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet,如果这个值为负数或者没有设定,那么Servlet容器将在Web客户首次访问这个Servlet时加载它。我这里没用到后两个元素。
7、部署JSP Tag Library
Tag Library向用户提供了自定义JSP标签的功能。我们定义一个名为mytaglib的标签库,包含一个简单的hello标签,它能将JSP页面中所有的<mm:hello/>解析为字符串“Hello”。
(1)
package mypack;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloTag extends TagSupport
{
public void HelloTag(){}
public int doEndTag() throws JspException{
try{
pageContext.getOut().print("Hello");
}
catch(Exception e){
throw new JspTagException(e.getMessage());
}
return SKIP_BODY;
}
public void release(){
super.release();
}
}
这是HelloTag.java文件,编译成用于处理hello标签的类。
(2)创建Tag Library的描述文件mytaglib.tld文件,这个文件定义mytaglib标签库和hello标签。它存放为/WEB-INF/mytaglib.tld。源码如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>mytaglib</shortname>
<uri>mytaglib</uri>
<tag>
<name>hello</name>
<tagclass>mypack.HelloTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Just Says Hello</info>
</tag>
</taglib>
(3)在/helloapp/WEB-INF下的web.xml添加<taglib>元素,如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/mytaglib</taglib-uri>
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
</web-app>
<taglib>中包含<taglib-uri>和<taglib-location>属性。前者指定Tag Library标示符;后者指定Tag Library的描述文件(TLD)的位置。
(4)在hello.jsp文件中加入hello标签。prefix用来指定引用mytaglib标签库时的前缀,修改后如下:
<%@ taglib uri="/mytaglib" prefix="mm"%>
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<b><mm:hello/><%=request.getAttribute("USER")%></b>
</body>
</html>
经测试OK!
8、创建并发布WAR文件。一般来说,在Web应用的开发阶段,为了方便调试,采用开放式的目录结构来发布Web应用,这样方便更新或替换文件。产品发布时,应将整个Web应用打包为WAR文件,再进行发布。
(1)MS-DOS下进入/helloapp目录下键入如下命令:jar cvf helloapp.war *.*;
(2)把helloapp.war拷贝到/webapps目录下;
(3)删除原来的helloapp目录;
(4)启动Tomcat服务器。
Tomcat服务器启动时,会把webapps下所有WAR文件自动展开为开放式的目录结构,变为/webapps/helloapp目录。
文章来源:http://syneer1981.spaces.live.com/blog/cns!6F8B2C7500427759!120.entry?_c=BlogPart