Servlet

  

【接口和类】

一、ServletRequest和ServletResponse接口

  当客户请求到来时,由容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象作为参数传递给service方法。

  这两个接口都用很多方法,可查看api文档。

  HttpServletRequest和HttpServletResponse分别继承自ServletRequest和ServletResponse接口(要使用http协议进行传输)。

二、ServletConfig接口

  Servlet容器使用ServletConfig对象在Servlet初始化期间向它传递配置信息,一个Servlet对象只有一个ServletConfig对象。该接口中定义下述四个方法:

     //返回名字为name的初始化参数的值
         String getInitParameter(String name);
      //返回所有初始化参数的的名字的枚举集合
         Enumeration getInitParameterNames() ;
      //返回Servlet上下文对象的引用
         ServletContext getServletContext();
      //返回Servlet实例的名字
         String getServletName() ;

三、ServletContext接口

  一个Web应用程序只有一个ServletContext对象,该对象可以被Web应用程序的所有Servlet所访问,因此通常使用Servlet对象保存一些需要在Web应用程序*享的信息

  ServletContext对象是Web服务器中一个已知路径的根 —— 用来表示上下文。该接口定义一组方法,Servlet可以使用这些方法与它的Servlet容器进行通信。

  (1)ServletContext对象被包含在ServletConfig对象中

 

// 可以通过ServletConfig对象的getServletContext方法来得到ServletContext对象,

 

 

 

  (2)由于一个Web应用程序中的所有Servlet都共享一个ServletContext对象,所以,ServletContext对象被称之为application对象

 

  功能:

 

  • 获取web应用程序的初始化参数
  • 记录日志
  • application域范围的属性
  • 访问资源文件
  • 获取虚拟路径所映射的本地路径:getRealPath(String path);
  • web应用程序之间的访问
  • 其它方法
Servlet
public class ContextDemo extends HttpServlet
{
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        ServletContext context=getServletContext();
        Integer count=null;
        synchronized(context)
        {
            count=(Integer)context.getAttribute("counter");
            if(count==null)
            {
                count=new Integer(1);
            }
            else
            {
                count=new Integer(count.intValue()+1);
            }
            context.setAttribute("counter", count);
        }
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out=response.getWriter();
        out.println("<html><head><title>页面访问统计</title></head><body>");
        out.println("该页面已被访问了"+"<b>"+count+"</b>"+"次");
        out.println("</body></html>");
        out.close();
    }
统计页面访问量的小例子

 四、RequestDispatcher接口

  RequestDispatcher对象用于封装一个由路径所标识的服务器资源,利用RequestDispatcher对象可以将请求转发给其他的Servlet或者JSP页面

  • 获取RequestDispatcher对象

  两种方法可以获取该对象,

  (1)一种是从ServletRequest接口的getRequestDispatcher方法获取【可以是相对于上下文根的路径名,而且可以是相对于当前Servlet的路径】

  (2)另一种是从ServletContext接口的getRequestDispatcher获取【只能是是相对于上下文根的路径名】

  • 请求转发方法

  在RequestDispatcher接口中定义了两种方法:forward(req,resp)和include(req,resp)

  两者的区别是:

  前者将请求转发给其他的Servlet,将由被调用的Servlet负责对请求作出相应,而原先Servlet的执行则终止

  后者将调用的Servlet对请求作出的响应并入原先的响应对象中,原先的Servlet还可以继续输出响应信息。示例代码如下:

Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        //该方法用于在响应中包含其他资源的内容并从ServletContext接口得到RequestDispatcher对象
        /*RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/hello.html");
        rd.include(request, response);*/
        
        //该方法用于将请求从一个Servlet传递给服务器上另外的Servlet、JSP页面或者是HTML文件。
        /*RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/hello.html");
        rd.forward(request, response);*/
        
        //从ServletRequest接口得到RequestDispatcher对象
        RequestDispatcher rd=request.getRequestDispatcher("hello.html");
        rd.include(request, response);
    }
示例

五、使用IDEA开发Servlet

1、new的时候直接选择Servlet即可   

      Servlet

Servlet
package cn.timetell.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * Created by Timetellu on 2019/9/27.
 * Servlet3.0:
 * 好处:
 *      支持注解配置。可以不需要web.xml了。
 */

@WebServlet("/anno")
public class Servlet_anno implements Servlet{
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet3.0 is coming");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
Servlet示例

2、可以配置Servlet模板

 Servlet

Servlet
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet("/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {

    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
        this.doPost(request,response);
    }
}
参考

 

上一篇:jsp:forward相当于requestDispatcher还是sendRedirect呢?


下一篇:web.xml: