Servlet的使用
1.Servlet介绍
JavaTM servlets 是一个不受平台约束的Java小程序,它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的 applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理能力。
Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。
一个客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这个请求被运行在Web服 务器上的Servlet引擎处理,并返回响应到Servlet。Servlet通过HTTP将这个响应转发到客户端。在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。
Servlet更多的是配合动态资源来做,当然静态资源也需要使用到Servlet,只不过Tomcat里面已经定义好了一个Default Servlet。
2.Hello,Servlet!
1.配置Tomcat
1).打开Java EE视图,在Server下右键菜单点击new创建一个Server;
2).选择Tomcat v7.0 Server,Next;
3).配置Tomcat installation directory,也就是Tomcat的安装目录;
4).单击finish,右键Server下新建的服务器,选择open,选中Server Locations中的第二项Use Tomcat installstion(…)。
5).保存,Tomcat就配好了。
创建Dynamic Web Project项目,Next,Dynamic web module version选择2.5版本,然后finish,就创建了一个动态web工程。在web项目上右键,Run as --> Run on Server,web项目就启动了。
wtpwebapps目录:放置eclipse编写的web工程。
3.Servlet入门
Servlet初体验
用Eclipse导入web项目时,出现与javax.servlet相关的Jar包无法引入的问题;
原因是JDK并不包含servlet-api.jar这个包,解决方案有:
\1. 在网上下载servlet-api.jar这个包;
\2. 在tomcat的lib路径下找到这个包,C:\apache-tomcat-6.0.48\lib
直接将jar包复制粘贴到JDK目录下并不能自动引入,所以右键单击工程->properties->Java Build Path->Libraries->Add External JARs…->servlet-api.jar
1.新建一个类,实现Servlet接口;
2.配置Servlet,用意:告诉Tomcat我们的应用有这些个Servlet。
打开WebContent/WEB_INF/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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>mysite</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.nikehu.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
</web-app>
注册servlet,<servlet-name>虚拟名字路由匹配<servlet-mapping>时使用,<servlet-class>Servlet编译出来的.class文件的具体路径,包名.类名。
package com.nikehu.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("Hello,Servlet!");
}
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
4.Servlet执行过程
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.nikehu.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
url:http://localhost:8080/mysite/a
1.找到tomcat应用 http://localhost:8080
2.找到mysite项目
3.找到web.xml中url-pattern为/a的项的servlet-name
4.找到servlet-name为HelloServlet的项的<servlet>中的<servlet-class>,然后根据servlet-class的值执行相应的servlet程序。创建该类的实例,执行该实例的service()方法
5.Servlet通用写法
继承javax.servlet.Servlet的已知实现子类,并重写我们所需要的方法。
Servlet–GenericServlet–HttpServlet(用于处理Http请求)
package com.nikehu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet{
// @Override
// protected void service(HttpServletRequest req, HttpServletResponse resp)
// throws ServletException, IOException {
// System.out.println("Hello,MyServlet!");
// }
//
/**
* GET请求会执行doGet()方法
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("get----------");
}
/**
* POST请求会执行doPost()方法
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("post---------");
}
}
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.nikehu.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
6.Servlet生命周期
生命周期:从创建到销毁的一段时间。
生命周期方法:
package com.nikehu.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 演示Servlet生命周期
* This interface defines methods to initialize a servlet, to service requests,
* and to remove a servlet from the server.
* These are known as life-cycle methods and are called in the following sequence:
* 1.The servlet is constructed, then initialized with the init method.
* 2.Any calls from clients to the service method are handled.
* 3.The servlet is taken out of service, then destroyed with the destroy method,
* then garbage collected and finalized.
*/
public class LifeCycleServlet implements Servlet{
/**
* 在创建Servlet实例时,就执行init()方法
* 默认情况下,是初次访问该Servlet路由时才会创建实例
* 一个Servlet只会初始化一次,init()方法只会执行一次
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("LifeCycleServlet 初始化了...");
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
/**
* 只要客户端来了一个请求,就会执行service()方法;
* 一次请求对应一次service()方法的执行
*/
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("LifeCycleServlet service()方法执行了");
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
/**
* 当Servlet实例销毁时,会执行destory()方法;
* 该项目从服务器里面移除时,会执行destory()方法;
* 正常关闭服务器时,会执行destory()方法;执行shutdown.bat时。
*/
public void destroy() {
System.out.println("LifeCycleServlet destory()方法执行了");
}
}
<servlet>
<servlet-name>LifeCycleServlet</servlet-name>
<servlet-class>com.nikehu.servlet.LifeCycleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LifeCycleServlet</servlet-name>
<url-pattern>/c</url-pattern>
</servlet-mapping>
7.Servlet初始化提前
让Servlet创建的时机提前
默认情况下,只有在初次访问Servlet的时候,才会执行init()方法,有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至时做一些比较耗时的逻辑。此时,我们需要让init()方法提前执行。
做法:修改web.xml文件如下
<servlet>
<servlet-name>MyServlet01</servlet-name>
<servlet-class>com.nikehu.servlet.MyServlet01</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet01</servlet-name>
<url-pattern>/d</url-pattern>
</servlet-mapping>
<load-on-startup>表示在服务器启动时就创建servlet实例,其值时一个数值,数值越小,创建的时机越早,一般不写复数,从2开始。
8.Servlet ServletConfig
Servlet配置对象,通过这个对象,可以获取Servlet在配置的时候的一些信息。
package com.nikehu.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServletConfig extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//ServletConfig 可以获取Servlet配置时的一些信息
//1.得到Servlet配置对象,专门用于在配置servlet的信息
ServletConfig config = getServletConfig();
//获取Servlet名称,打印的时web.xml中的<servlet-name>的值
String servletName = config.getServletName();
System.out.println(servletName);
//获取初始化参数
String add = config.getInitParameter("add");
System.out.println("add="+add);
//获取所有初始化参数名称
Enumeration<String> initParameterNames = config.getInitParameterNames();
//遍历打印每一个名称
while (initParameterNames.hasMoreElements()) {
String string = (String) initParameterNames.nextElement();
System.out.print(string+"=");
System.out.println(config.getInitParameter(string));
}
}
/**
* 来了POST请求,让他走doGet()方法.
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>HelloServletCon</servlet-name>
<servlet-class>com.nikehu.servlet.HelloServletConfig</servlet-class>
<!-- 可以添加初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>22</param-value>
</init-param>
<init-param>
<param-name>add</param-name>
<param-value>西安</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServletCon</servlet-name>
<url-pattern>/f</url-pattern>
</servlet-mapping>