Servlet技术 1)什么是servlet 1、Servlet是JavaEE规范之一。规范就是接口 2、Servlet就javaweb三大组件之一。三大组件分别是:Servlet程序、filter过滤器、listenner监听器。 3、Servlet是运行在服务器上的一个java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端 2)手动实现Servlet程序 1、编写一个类去实现Servlet接口 2、实现service方法,处理请求,并响应数据 3、到web.xml中去配置servlet程序的访问地址

编辑项目名称

新建包 com.mafei.servlet 新建class HelloServlet

最终的目录结构:

类中实现Servlet接口


package com.mafei.servlet;

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

public class HelloServlet implements Servlet {

   public HelloServlet() {
       System.out.println("1、构造器");
   }

   @Override
   public void init(ServletConfig servletConfig) throws ServletException {
       System.out.println("2、init 方法");
   }

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

   /**
    * service方法是专门用来处理请求和响应信息的
    * @param servletRequest
    * @param servletResponse
    * @throws ServletException
    * @throws IOException
    */
   @Override
   public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
       System.out.println("3、 Hello Servlet 被访问了。。。。。");
   }

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

   @Override
   public void destroy() {
       System.out.println("4、destroy 销毁方法");
   }
}

web.xml配置


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">
   <!-- servlet标签给tomcat配置servlet程序-->
   <servlet>
       <!-- servlet-name标签  servlet程序起一个别名(一般是类名)-->
       <servlet-name>HelloServlet</servlet-name>
       <!-- servlet-class 是servlet程序的全类名-->
       <servlet-class>com.mafei.servlet.HelloServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>HelloServlet</servlet-name>
       <!-- url-pattern 标签配置访问地址 <br/>

           / 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径
           /hello    表示地址为 http://ip:port/工程路径/hello

        -->
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>
</web-app>

执行过程:

2)Servlet的生命周期: 1、执行Servlet构造器方法 2、执行init初始化方法 第一、二步,是在第一次访问的时候创建Servlet程序 3、执行service方法 第三步,每次访问都会调用。 4、执行destory销毁方法 第四步,在web工程停止的时候调用

3)工程中调用的HttpServlet 方法

新建一个HelloServlet类



package com.mafei.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet2 extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("访问了 doGet方法");
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("访问了do Post 方法");
   }
}

web.xml中增加配置


<servlet>
   <servlet-name>HelloServlet2</servlet-name>
   <servlet-class>com.mafei.servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>HelloServlet2</servlet-name>
   <url-pattern>/hello2</url-pattern>
</servlet-mapping>

使用IDEA创建servlet

web.xml增加配置:


<servlet>
   <servlet-name>HelloServlet3</servlet-name>
   <servlet-class>com.mafei.servlet.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>HelloServlet3</servlet-name>
   <url-pattern>/hello3</url-pattern>
</servlet-mapping>

Servlet 实现过程

Servlet config三大作用:

以HelloServlet类举例:

HelloServlet类的init方法:

@Override
public void init(ServletConfig servletConfig) throws ServletException {
   System.out.println("2、init 方法");

   // 1、可以获取servlet程序的别名servlet-name的值
   System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());

   // 2、获取初始化参数init-param
   System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
   System.out.println("初始化参数url的值是:"+servletConfig.getInitParameter("url"));

   //3、获取servlet content对象
   System.out.println(servletConfig.getServletContext());

}

web.xml中关于HelloServlet的配置:

<servlet>
   <!-- servlet-name标签  servlet程序起一个别名(一般是类名)-->
   <servlet-name>HelloServlet</servlet-name>
   <!-- servlet-class 是servlet程序的全类名-->
   <servlet-class>com.mafei.servlet.HelloServlet</servlet-class>
   <init-param>
       <param-name>username</param-name>
       <param-value>root</param-value>
   </init-param>
   <init-param>
       <param-name>url</param-name>
       <param-value>jdbc:mysql://localhost:3306/test</param-value>
   </init-param>
</servlet>

最终访问效果: HelloServlet程序的别名是:HelloServlet 初始化参数username的值是:root 初始化参数url的值是:jdbc:mysql://localhost:3306/test org.apache.catalina.core.ApplicationContextFacade@5ba9dd28

在其他类中,重写servlet 的init方法:

@Override
public void init(ServletConfig config) throws ServletException {
   super.init(config);
   System.out.println("重写了init初始化方法,做了一些工作!");
}

ServletContent类

1、什么是ServletContext?

a)ServletContext是一个接口,它表示Servlet上下文对象
b)一个web工程,只有一个ServletContext对象实例。
c)ServletContext对象是一个域对象
d)ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁

什么是域对象? 域对象,是开源像map一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,是整个web工程

               存数据                           取数据              删除数据

Map put() get() remove() 域对象 setAttribute() getAttribute() removeAttribute();

2、ServletContext类的四个作用

a)获取web.xml中配置的上下文参数 context-param
b)获取当前的工程路径,格式:/工程路径
c)获取工程部术后在服务器硬盘上的绝对路径
d)像Map一样存取数据

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletConfig().getServletContext(); // a)获取web.xml中配置的上下文参数 context-param

   String username = context.getInitParameter("username");
   System.out.println("context-param参数username的值是:"+username);
   System.out.println("context-param参数password的值是:"+context.getInitParameter("password"));

// b)获取当前的工程路径,格式:/工程路径 System.out.println("当前工程路径:"+context.getContextPath()); // c)获取工程部术后在服务器硬盘上的绝对路径 System.out.println("工程部署的路径是:"+ context.getRealPath("/"));

   System.out.println("工程的1.css绝对路径是:"+context.getRealPath("/css/1.css"));

}

在web.xml中增加跟servlet平级的配置::

<!-- context-param 是上下文参数(它属于整个web工程)-->

<context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>123</param-value> </context-param>

输出效果: context-param参数username的值是:root context-param参数password的值是:123 当前工程路径:/web02 工程部署的路径是:C:\Users\tophant\IdeaProjects\web02\out\artifacts\web02_war_exploded
工程的1.css绝对路径是:C:\Users\tophant\IdeaProjects\web02\out\artifacts\web02_war_exploded\css\1.css

context.setAttribute("key1","----"); Object key1 = context.getAttribute("key1"); System.out.println("获取到的key1, 这个key1可以在其他工程中也可以看到");

HttpServletRequest类说明:

1、HttpServletRequest类有什么作用。 每次只要有请求进入到tomcat服务器,tomcat服务器就会把请求过来的http协议信息解析好封装到request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息

2、HttpServletRequest类常用方法: 1)getRequestURI() 获取请求的资源路径 2)getRequestURL() 获取绝对路径 3)getRemoteHost() 获取客户端的ip地址 4)getHeader() 获取请求头 5)getParameter() 获取请求的参数 6)getParameterValues() 获取请求的参数(多个值的时候使用) 7) getMethod() 获取请求的方法GET或POST 8)getAttribute(key); 获取域数据 9) getRequestDispatcher() 获取请求转发对象

Servlet 接收参数:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   //设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
   req.setCharacterEncoding("UTF-8");

   // 获取请求参数
   String username = req.getParameter("username");
   String password = req.getParameter("password");
   String[] hobby = req.getParameterValues("hobby");
   System.out.println("用户名:"+username);
   System.out.println("密码:"+password);
   System.out.println("兴趣:"+ Arrays.asList(hobby));
}

web.xml

<servlet>
   <servlet-name>ParameterServlet</servlet-name>
   <servlet-class>com.mafei.www.ParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>ParameterServlet</servlet-name>
   <url-pattern>/parameterServlet</url-pattern>
</servlet-mapping>

Servlet 转发请求

Servlet1的doGet方法:


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   Object username = req.getParameter("username");
   System.out.println("Servlet1接收到的参数:"+username);
   req.setAttribute("key1", username);
   // 转发给servlet2
   RequestDispatcher dispatcher = req.getRequestDispatcher("/servlet2");

   dispatcher.forward(req, resp);
}

Servlet2的doGet方法:


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   Object key1 = req.getAttribute("key1");
   System.out.println("获取到Servlet1的key:"+key1);
   System.out.println("开始处理Servlet2的业务");
}

web.xml配置文件:

<servlet>
   <servlet-name>Servlet1</servlet-name>
   <servlet-class>com.mafei.www.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>Servlet1</servlet-name>
   <url-pattern>/servlet1</url-pattern>
</servlet-mapping>


<servlet>
   <servlet-name>Servlet2</servlet-name>
   <servlet-class>com.mafei.www.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>Servlet2</servlet-name>
   <url-pattern>/servlet2</url-pattern>
</servlet-mapping>

HttpServletResponse类说明:

1、作用 HttpServletResponse类和HttpServletRequest类一样。每次请求进来,tomcat服务器都会创建一个response对象传递给servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置 2、两个输出流的说明: 字节流: getOutputStrem(); 常用于下载(传递二进制数据) 字符流 : getWriter(); 常用于回传字符串(常用)

返回字符串给客户端

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   PrintWriter writer = resp.getWriter();
   writer.write("response's content!!!!!");
}

请求重定向

有response1和response2,访问response1会重定向到response2页面

response1:

public class Response1 extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("在response1中走过了。。。");
//        resp.setStatus(302);
//        resp.setHeader("Location","/web03/response2");
      
       resp.sendRedirect("/web03/response2");  //第二种方法,更方便
   }
}

response2:

public class Response2 extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("response2中的响应信息");
       resp.getWriter().write("response2's content!!!!!1");
   }
}

JAVA EE三层架构