首页 > 代码库 > 第一章_servlet

第一章_servlet

*学习此servlet前,需要下载servlet-api.jar,MyEclipse中需要自带javaEE3.0版本的才可以使用注解访问servlet

1.1Servlet API概述

Javax.servlet 包含定义ServletServlet容器之间契约的类和接口

Javax.servlet.http 包含定义http servletservlet容器之间契约的类和接口

Javax.servlet.annotation 包含对servletfilterlistener进行标注的注解。它还为标注元件指定元数据。

Javax.servlet.descriptor 包含为web应用程序的配置信息提供编程式访问的类型。

 

Servlet技术的核心是Servlet接口,这是所有Servlet类都必须直接或者间接实现的一个接口。用户的请求会引发Servlet容器调用一个servletservice方法,并给这个方法传入一个ServletRequest实例和一个ServletResponse实例。

 

1.2Servlet

Servlet接口定义了以下5个方法。

Void init(ServletConfig config) throws ServletException

Void service(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException

Void destroy()

java.lang.String getServletInfo()

ServletConfig getServletConfig()

 

Initservicedestroy方法属于Servlet声明周期方法。Servlet容器将根据以下原则调用这三个方法。

1. Init。第一次请求Servlet时,Servlet容器就会调用这个方法。在后续的请求中,将不再调用该方法。可以利用这个方法来编写一些应用程序初始化相关的代码。在调用这个方法时,Servlet容器会传递一个ServletConfig。一般来说,会将ServletConfig赋给一个类级变量,以便Servlet类中的其他方法也可以使用这个对象。

2. Service。每次请求Servlet时,Servlet容器都会调用这个方法。必须在这里编写要Servlet完成的相应代码,第一次请求Servlet时,Servlet容器会调用init方法和service方法,对于后续请求,则只调用service方法。

3. Destroy。要销毁Servlet时,Servlet容器就会调用这个方法。它通常发生在卸载应用程序,或者关闭Servlet容器的时候。一般来说,可以在这个方法中编写一些资源清理相关的代码。

Servlet中的另外两个方法是非声明周期方法:getServletInfogetServletConfig

1.  getServletInfo。该方法返回Servlet的描述,可以返回可能有用的任意字符串,甚至是null

2. getServletConfig。该方法返回由Servlet容器传给init方法的ServletConfig。但是,为了让getServletConfig返回非null值,你肯定已经为传给init方法的ServletConfig赋给了一个类级变量。

*必须注意个一点是线程安全性。一个应用程序中的所有用户将共用一个Servlet实例,因此不建议使用类级变量,除非他们是只读的,或者是java.util.concurrent.atomic包中的成员。

 

1.3、编写基础的Servlet应用程序

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet(name="MyServlet",urlPatterns={"/my"})
public class MyServlet implements Servlet{
	private transient ServletConfig servletConfig ;

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return servletConfig;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return "My Servlet";
	}

	@Override
	public void init(ServletConfig servletConfig) throws ServletException {
		// TODO Auto-generated method stub
		this.servletConfig = servletConfig ;
	}

	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String servletName = servletConfig.getServletName() ;
		res.setContentType("text/html");
		PrintWriter writer = res.getWriter() ;
		writer.print("<html><head></head><body>Hello from " + servletName + "</body></html>") ;
	}
	
}

1.4ServletRequest

对于每一个HTTP请求,Servlet容器都会创建一个serveltRequest实例,并将它传给Servletservice方法。ServletRequest封装有关请求的信息。

下面是ServletRequest接口中的方法。

Public int getContentLength()

返回请求主体中的字节数。如果不知道字节的长度,该方法将返回-1

Public java.lang.String getContentType()

返回请求主体MIME类型,如果不知道类型,则返回null

Public java.lang.String getParameter(java.lang.String name)

返回指定请求参数的值

Public java.lang.String getProtocol()

返回这个HTTP请求的协议名称和版本号

getParameterServletRequest中最常用的方法。该方法通常用来返回一个HTML表单域的值。

getParameter也可以用来获取查询字符串的值。例如:如果利用下面这个URI调用一个servlet

http://domain/context/servletName?id=123

将可以在Servlet中利用下面这个语句来获取id的值

String id = request.getParameter(“id”) ;

注意,如果该参数不存在,那么getParameter将返回null

 

1.5ServletResponse

ServletResponse中定义的其中一个方法是getWriter方法,它返回可以将文本传给客户端的java.io.PrintWriter。在默认情况下,PrintWriter对象采用ISO-8859-1编码。

 

1.6ServletConfig

为了从一个Servlet内部获取某个初始参数的值,应该在由Servlet容器传给Servletinit方法的ServletConfig中调用getInitParameter方法。getInitParameter方法的签名如下:

java.lang.getInitParameter(java.lang.String name) ;

此外,getInitParameterNames方法则是返回所有初始化参数名称的一个Enumeration

java.util.Enumeration<java.lang.String> getInitParameterNames()

除了这2个方法外,ServletConfig还提供了另一个很有用的方法:getServletContext。可以利用这个方法从Servlet内部获取ServletContext


package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
@WebServlet(name="ServletConfigDemoServlet",
		urlPatterns={"/servletConfigDemo"},
		initParams={
			@WebInitParam(name="admin",value=http://www.mamicode.com/"Benjamin"),>

未完待续...