Servlet API
Servlet和Applet的异同:
他们不是独立的,没有main
都是生存在容器中
都有init,和destroy
Applet有图形界面而Servlet没有
ServletRequest和ServletResponse
Object getAttribute(String name)返回以name为名字的属性的值
Enumeration getAttributeNames()返回请求中所有可用的属性的名字
Void removeAttribute( String name)移除请求中名字为name的属性
setAttribute( String name ,Object o)保存名字为name的属性
int getContextLength()返回请求正文的长度
String getContentType()返回请求正文的MIME类型
ServletInputStrream getInputStream()返回一个输入流
String getLocalAddr(0
String getLocalName();
String getParameter(String name)返回请求中name参数的值
Enumeration getParameterNames()返回请求中包含的所有参数的名字。
String[] getParameterValues(String name)返回请求中name参数的所有值
PrintWriter getWriter()返回PrintWriter对象,用于发送字符文本到客户端
Boolean isCommitted()是否已经提交了响应
(这些api不用全部记下来,平时多查)
HttpServlet
Void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP GET请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。
Void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP POST请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。
Void doPut(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP PUT请求。本方法中请求URI指出被载入的文件位置。
Void doDelete(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP DELETE请求。请求URI指出资源被删除。
Void doOptions(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP OPTIONS请求。返回一个Allow响应头标表明此servlet支持的HTTP方法。一个servlet不需要覆盖此方法,因为 HttpServlet方法已经实现规范所需的功能。
Void doTrace(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 由servlet引擎调用用处理一个HTTP TRACE请求。使得请求头标被反馈成响应关标。一个servlet不需要覆盖此方法,因为HttpServlet方法已经实现HTTP规范所需的功能。
Void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException Service(Request request,Response response)调用的一个立即方法,带有指定HTTP请求和响应。此方法实际上将请求导向doGet()、doPost()等等。不应该覆盖此方法。
Void service(Request request,Response response)throws ServletException,IOException 将请求和响应对象置入其指定的HTTP子类,并调用指定HTTP的service()方法。
HttpServletRequest和HttpServletResponse
String getContextPath()返回请求URL中表示请求上下文的部分,例如:请求URL为”/sample/test”,调用该方法返回的路径是/sample
Cookie[] getCookies()返回客户端在此次请求中发送的所有cookie对象
String getHeader( String name)返回名字为name的请求报头的值
Enumeration getHeaderNames()返回此次请求中包含的所有报头名字的枚举集合
Enumeration getHeaders(String name)返回名字为name的请求报头的所有的值得枚举集合
String getMethod()返回此次请求所使用的HTTP方法的名字。如get,post,put
。。。。。。。。。。。。。。。。。。。。
实例1:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
* Servlet implementation class for Servlet: SimpleHello
*
*/
public class SimpleHello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L ;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public SimpleHello() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.print("Hello world");
out.close();
}
}
doGet方法用于对GET请求方法做出响应,PrintWriter是个输出流类型。
部署Servlet
在Servlet容器运行时,web应用程序的类加载器首先加载classes目录下的,其次是lib目录下的类。如果这两个目录下存在同名的类,起作用的将是classes目录下的类。
WEB-INF是个特殊的目录,不属于web应用程序可以访问的上下文路径的一部分,对于客户端来说,这个目录不可见。
Web.xml是web应用程序部署描述符
<servlet>元素用于声明servlet,<servlet-name>子元素用于指定servlet名字。每个servlet的名字必须是唯一的。<servlet-class>子元素用于指定servlet类的完整限定名
<servlet-mapping>元素用于在servlet和url之间定义一个映射。它的子元素,servlet-name.指定的servlet名字必须和 <servlet>中的一阿姨那个。<url-pattern>子元素指定url路径,是相对于web应用程序的。
这样我们就可以用http://localhost:8080/ch06/hello访问servlet了
实例2:WelcomeYou
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
* Servlet implementation class for Servlet: WelcomeYou
*
*/
public class WelcomeYou extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L ;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public WelcomeYou() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String user=request.getParameter("user");
String info="welcome you "+user;
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<html><head><title>");
out.println("welcome pages");
out.println("</title></head>");
out.println("<body>");
out.println(info);
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
doGet(request,response);
}
}
更新class文件后需要重启tomcat。
Welcome.html页面的表单提交方法是post。提交的数据作为请求正文的内容发送到服务器端。所以在URL中就看不到附加的请求数据了(XXXX?user=kayv)。通常在提交表单时,如果数据量较小,而又没有安全性考虑可以采用get方法,如果数据量大或者有安全方面考虑则采用post方法。
实例3:response.setContentType(“text/html;charset=gb 2312” );将会设置http响应的content-type实体报头,这个实体报头的信息是给客户端软件看得,在页面中并不体现出来。
实例4:知识点:判断用户名与密码,重定向
使用request.getParameter(“属性名”)获取用户提交值,response.sendRedirect(“”)重定向
Servlet生命周期
1.加载和实例化
Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。
2.初始化
3.请求处理
4.服务终止
ServletContext接口
一个ServletContext对象表示了一个web应用程序的上下文。ServletConfig的getServletContext()和GenericServlet的getServletContext()都可以获得ServletConrtext对象。
页面访问量统计实例
ServletContext context=this.getServletContext();
Integer counter=(Integer)context.getAttribute("counter");
if(counter==null){
counter=new Integer(1);
}
else{
counter=new Integer(counter.intValue()+1);
}
Context.setAttribute(“counter”,counter);
请求转发(request dispatching)
有三种方法可以用来得到RequestDispatching对象。一是利用ServletRequest接口中的getRequestDispatcher()方法。另外两种是利用ServletContext接口中的getNamedDispatcher和getRequestDispatcher
ServletContext。getRequestDispatcher()方法的参数必须以斜杠 / 开始,被解析为相对于当前上下文根的路径
请求转发实例:
我们编写一个PortalServlet,在这个Servlet中,首先判断访问用户是否已经登陆,如果没有登录,则调用RequestDispatcher接口的include方法,将请求转发给LoginServlet2。LoginServlet2在响应中发送登录表单:如果已经登陆则调用RequestDispatcher接口的forward方法将请求转发给welcomeyou
if(name.equals("kayv") && "123".equals(pwd))
{
ServletContext context=getServletContext();
RequestDispatcher rd=context.getRequestDispatcher("/welcome");
rd.forward(req,resp);
}
else
{
RequestDispatcher rd=req.getRequestDispatcher("login2");
rd.include(req,resp);
}