完成我的第一个Servlet测试也是一波三折。特别感谢【王浴昊】的博客,就是看这他的博客完成的。
(原博客地址:http://blog.csdn.net/a153375250/article/details/50916428)
Servlet 简介
Servlet是什么?简单地说,它就是一个Java程序,是一个运行在web服务器上的程序。它可以对Web浏览器或其他HTTP客服端程序发出的请求进行处理。但是使Servlet能够处理以上请求的前提条件是Servlet对象要被布置在Servlet容器当中,我们这里用的Servlet容器就是我们前面用到的Tomcat服务器。
Servlet的使用和JSP不同,它需要web.xml文件的配置。当一个客户端发出HTTP请求时,服务器会根据配置文件中的配置信息将该请求的信息发送给相对应的Servlet进行处理。
Servlet 既然这么好用,当然有它自己的标准和规范。
Servlet 基本结构
Servlet就是一段由java编写的程序,由服务器来维护。为了方便服务器的处理,Servlet需要遵循一定的结构规范。通常我们所说的Servlet就是一个实现了HttpServlet抽象类的类的实例。代码结构如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ServTest extends HttpServlet {
//handle post request
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
String name = request.getParameter("USERNAME");
out.println("Your Name : " + name);
}
//destroy
public void destroy() {}
}
1 Servlet继承HttpServlet类。
2 init()方法,服务器在创建Servlet实例后会调用该方法进行初始化的工作。
3 Servlet就是通过这些do方法来处理对应的Http请求的。事实上,这些do方法都是 从HttpServlet中继承来的,我们这里需要对这些方法进行重写以处理具体的请求。
4 当服务器关闭时,该destroy()方法会被调用,销毁该实例。
Servlet生命周期
我们知道,Servlet是由服务器维护的。那么服务器是如何管理Servlet的呢?通常有以下几个阶段,这些阶段也就是Servlet从生到死的生命周期:
1 当某个Servlet第一次被请求的时候,服务器会加载对应的Servlet类,将其放在Servlet实例池中。
2 创建Servlet实例后,将调用该实例的init()方法进行一些初始化操作。(即Servlet的代码结构中的init())
3 服务器通过调用Servlet的service()方法来处理客户端发送的请求。实际上,上面的Servlet的代码结构中的do方法都是通过service()来调用的。代码结构中我们没有显式地看到service()方法是因为我们没有对继承的该方法进行重写。
Servlet实例创建后会一直存在于内存中,直到服务器关闭,Servlet的destroy()方法被调用,该实例被销毁。
生命周期总结:
1 服务器收到客户请求。
2 调用Servlet类到实例池,并调用Servlet实例的init()方法。
3 根据客户的请求调用Servlet实例的service方法。
4 服务器关闭,Servlet执行destroy()方法,实例从内存中被销毁。
Servlet 的调用要和web.xml配置文件搭配使用
Servlet的 web.xml 配置
Servlet在使用之前需要进行一定的配置,来告诉服务器被请求的Servlet应该发使用哪个Servlet类。这其实就是一个Servlet在服务器的注册过程,这样服务器就会知道哪个Servlet请求对应哪个Servlet对象。配置过程通常分为Servlet的声明和Servlet的映射两部分。
Servlet的声明
语法格式如下:
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>path</servler-class>
</servlet>
第一条语句中的name是声明的Servlet对象的名字,名字可以随意取,就像声明一个String abc一样,abc名字可以自取。
第二条语句中的path是用于指定你的Servlet的class文件的路径的。通常你把你的Servlet编译好的class文件放在Tomacat安装目录下的/webapp/ProjectName/WEB-INF/classes文件夹下,此时只需要写你的Servlet的class文件的名字就行了:
<servlet-class>ServTest</servler-class>
ProjectName是你的webapp文件夹,里面的WEB-INF及classes文件夹需要手动创建。
如果你的Servlet在某个package中,比如说:
package servPack
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServTest extends HttpServlet {
}
该servTest在servPack包中,此时你要在/WEB-INF/classes文件中创建servPack文件夹,将你的servTest编译的class文件放到servPack中,路径写为:
<servlet-class>servPack.ServTest</servler-class>
Servlet的映射
语法格式如下:
<servlet-mapping>
<servlet-name>name</servlet-name>
<url-pattern>path</url-pattern>
<servlet-mapping>
这里是对我们上面声明的Servlet的一个映射,所以这里的name要和上面声明中的name一样才行。
url-pattern用于映射你的访问URL,例如将你的访问URL映射为:
<url-pattern>/ServletTest<url-pattern>
你就可以通过
localhost:8080/ServletTest
来请求该Servlet了。
我测试的第一个Servlet小程序
在Servlet的简单介绍后,做一个简单的Servlet程序。
首先在Myeclipse中新建一个Web Project,工程名为SimpleServlet。
接下来我们在/SimpleServlet目录下创建一个jsp文件来调用Servlet:index.jsp
index.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
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 Servlet Demo1</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">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>This is My Servlet Demo1</h1><hr>
<center>
<form action="MyServlet" name="form" method="post">
Your Name:<input type="text" name="USERNAME"><br>
<input type="submit" value="SUBMIT">
</form>
</center>
</body>
</html>
上面的JSP中表单指定了请求为post,我们套用上面介绍的代码结构:
在工程项目下的src文件夹中新建一个类,类名为ServTest
ServTest.java
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ServTest extends HttpServlet {
//handle post request
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("USERNAME");
out.println("Your Name : " + name);
}
//destroy
public void destroy() {}
}
由于表单指定的请求为post类型,我们这里只简单重写了doPost()方法。service()方法会识别并调用这里的doPost方法进行处理,并把这个java文件进行编译,编译后的class文件会放入/WEB-INF/classes/文件夹下。
接下来就是写配置文件了,也就是对该Servlet对象在服务器进行注册,进入到/SimpleServlet/WEB-INF/文件夹下,新建web.xml文件:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>ServletHandle</servlet-name>
<servlet-class>ServTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHandle</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
照样复制过来就可以了。我特意取了三个不同的名字:ServTest(类文件名),ServletHandle以及映射URL的/MyServlet。看明白这三个不同的名字有利于区分这些概念。注意表单中的
action="MyServlet"
接下来,部署工程并运行Tomcat服务器,在浏览器中输入:
localhost:8080/SimpleServlet/index.jsp
注:这个端口号8080也可以设置成其他的,我设置的是10086,不过默认的是8080.没什么特殊的情况,就不要去修改它。
然后在文本框内输入你的名字,输入英文,中文会乱码。如下图:
然后点击submit,会得到以下输出:
到这里一切都是那么的顺利!
其实,在这整个过程中还是有遇到挫折的。
在配置web.xml时候,复制博客里的配置到web.xml中,当时在项目文件夹下还找了web.xml没有找到。我以为是隐藏文件,就没在意了。哈哈哈,感觉自己有点傻傻的。
配置好了web.xml。就这样,我直接部署并运行tomcat服务器。打开localhost:8080/SimpleServlet/index.jsp页面
当输入完姓名,点击submit的时候,页面出现了异常。我查看项目下的classes文件夹中没有任何class文件,我想:是不是servlet没有被编译?
于是,带着这个设想去想着如何将Servlet类单独编译,生成class文件,并放到classes文件夹下。我想着在DOS框用javac命令完成编译,但是,竟然,这个命令不管用,提示无此命令。这个时候我想是不是环境变量没有配置好,又跟着百度把环境变量配置了好几遍。还是不管用,在将要放弃的时候,傻傻地看着web.xml,又傻傻地看着工程目录,突然,灵感来了,好像是在WEB-INF文件夹下手动添加web.xml文件没有刷新工程项目才导致没有web.xml。于是带着这个设想,重新刷新了项目,web.xml果然出来了。这个时候我还不确定是不是这个原因导致的jspServlet页面错误。试着重启了tomcat服务器,打开index.jsp输入姓名,点击提交,奇迹般的没有报错!!!显示正常。真的是IT技术这个东西,无底洞,稍不留意,很多弯路要绕的。一个很好的习惯就是写博客,把自己的错误记录下来,让自己长点记性,以后没事还能翻一番。
到这里,博客也写的差不多了。继续学习~~~