[Servlet与Jsp学习指南]
*学习这servlet前。需要下载servlet-api.jar,MyEclipse给自己带来的需求javaEE3.0的天赋足以使用注解获得的版本号servlet
1.1、Servlet API概述
Javax.servlet 包括定义Servlet与Servlet容器之间契约的类和接口
Javax.servlet.http 包括定义http servlet与servlet容器之间契约的类和接口
Javax.servlet.annotation 包括对servlet、filter和listener进行标注的注解。它还为标注元件指定元数据。
Javax.servlet.descriptor 包括为web应用程序的配置信息提供编程式訪问的类型。
Servlet技术的核心是Servlet接口。这是全部Servlet类都必须直接或者间接实现的一个接口。用户的请求会引发Servlet容器调用一个servlet的service方法,并给这种方法传入一个ServletRequest实例和一个ServletResponse实例。
1.2、Servlet
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()
Init、service和destroy方法属于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中的另外两个方法是非声明周期方法:getServletInfo和getServletConfig。
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.4、ServletRequest
对于每个HTTP请求,Servlet容器都会创建一个serveltRequest实例,并将它传给Servlet的service方法。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请求的协议名称和版本
getParameter是ServletRequest中最经常使用的方法。
该方法通经常使用来返回一个HTML表单域的值。
getParameter也能够用来获取查询字符串的值。比如:假设利用以下这个URI调用一个servlet:
http://domain/context/servletName?
id=123
将能够在Servlet中利用以下这个语句来获取id的值
String id = request.getParameter(“id”) ;
注意。假设该參数不存在,那么getParameter将返回null。
1.5、ServletResponse
ServletResponse中定义的当中一个方法是getWriter方法,它返回能够将文本传给client的java.io.PrintWriter。在默认情况下,PrintWriter对象採用ISO-8859-1编码。
1.6、ServletConfig
为了从一个Servlet内部获取某个初始參数的值。应该在由Servlet容器传给Servlet的init方法的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="Benjamin"),
@WebInitParam(name="email",value="whx449261417@sina.com")
}
)
public class ServletConfigDemoServlet implements Servlet{
private transient ServletConfig servletConfig ;
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return servletConfig;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return "servletConfig demo";
}
@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 {
ServletConfig servletConfig = getServletConfig() ;
String admin = servletConfig.getInitParameter("admin") ;
String email = servletConfig.getInitParameter("email") ;
res.setContentType("text/html");
PrintWriter writer = res.getWriter() ;
writer.print("<html><head></head><body>Admin:"+admin+"<br/>Email:"+email+"</body></html>") ;
}
}