servlet学习

本文介绍了Servlet的基本概念,包括Servlet与Applet的区别、Servlet生命周期、常用API等,并通过多个实例展示了如何部署Servlet及其实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  href="file:///E:/temp/msohtml1/01/clip_filelist.xml" rel="File-List" /> href="file:///E:/temp/msohtml1/01/clip_editdata.mso" rel="Edit-Time-Data" />

Servlet API

       ServletApplet的异同:

              他们不是独立的,没有main

              都是生存在容器中

              都有init,和destroy

              Applet有图形界面而Servlet没有

ServletRequestServletResponse

       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子类,并调用指定HTTPservice()方法。    

HttpServletRequestHttpServletResponse

       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方法的名字。如getpostput

       。。。。。。。。。。。。。。。。。。。。

实例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.xmlweb应用程序部署描述符

<servlet>元素用于声明servlet<servlet-name>子元素用于指定servlet名字。每个servlet的名字必须是唯一的。<servlet-class>子元素用于指定servlet类的完整限定名

<servlet-mapping>元素用于在servleturl之间定义一个映射。它的子元素,servlet-name.指定的servlet名字必须和 <servlet>中的一阿姨那个。<url-pattern>子元素指定url路径,是相对于web应用程序的。

这样我们就可以用http://localhost:8080/ch06/hello访问servlet

 

 

实例2WelcomeYou

 

 

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方法。

 

实例3response.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应用程序的上下文。ServletConfiggetServletContext()GenericServletgetServletContext()都可以获得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接口中的getNamedDispatchergetRequestDispatcher

ServletContextgetRequestDispatcher()方法的参数必须以斜杠 /  开始,被解析为相对于当前上下文根的路径

 

 

请求转发实例:

我们编写一个PortalServlet,在这个Servlet中,首先判断访问用户是否已经登陆,如果没有登录,则调用RequestDispatcher接口的include方法,将请求转发给LoginServlet2LoginServlet2在响应中发送登录表单:如果已经登陆则调用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);

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值