servlet(ee-13)

Servlet

Servlet的概述

  • Servlet: 就是一个运行在WEB服务器上的小的Java进程,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.Servlet就是SUN公司提供的一个动态网页开发技术
  • Servlet的作用: 用来处理从客户端浏览器发送的请求,并且可以对请求作出响应
  • 使用Servlet:
    • 编写一个类实现Servlet接口.
    • 将编写的这个类配置到服务器中.
  • Servlet的入门
1
2
3
4
5
6
7
8
9
10
11
编写类
public class ServletDemo1 implements Servlet{
@Override
/**
* 为用户处理请求和响应的方法.
*/
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().println("Hello Servlet...");
}
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
* 配置:web.xml中
<!-- 配置Servlet -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>test1</servlet-name>
<!-- SErvlet的全路径 -->
<servlet-class>com.itheima.a_servlet.ServletDemo1</servlet-class>
</servlet>

<!-- Servlet的映射 -->
<servlet-mapping>
<!-- Servlet的名称 -->
<servlet-name>test1</servlet-name>
<!-- Servlet的访问路径 -->
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>

访问: http://localhost:8080/day09/ServletDemo1

使用ServletRequest接收参数

  • String getParameter(String name); —用于接收一个名称对应一个值的数据.
  • String[] getParameterValues(String name);—用于接收一个名称对应多个值的数据.
  • Map getParameterMap(); —用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
  • Enumeration getParameterNames() —用于获取表单中提交的所有的参数的名称.

Servlet的访问流程

Servlet的实现的关系

1
2
3
4
5
6
7
Servlet			:接口
|
GenericServlet :通用的Servlet(abstract class)实现servlet
|
HttpServlet :HttpServlet(abstract class)
编写一个类继承HttpServlet,重写doGet和doPost方法.
配置web.xml

Servlet的生命周期

  • 生命周期:就是一个对象从创建到销毁的过程.
  • Servlet生命周期:Servlet从创建到销毁的过程.
    • 何时创建:用户第一次访问Servlet创建Servlet的实例
    • 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
  • 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例(单例,其他用户不创建),那么Servlet中init方法就会执行(创建实例时执行).任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.

Servlet的相关的配置

启动时创建Servlet
1
2
3
Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:<load-on-startup>2</load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高.
创建后init方法会执行
url-pattern的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
url-pattern配置方式共有三种:
1.完全路径匹配 :以 / 开始 例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
2.目录匹配 :以 / 开始 需要以 * 结束. 例如: /* ,/aaa/* ,/aaa/bbb/*
3.扩展名匹配 :不能以 / 开始 以 * 开始的. 例如: *.do , *.action
错误的写法 : /*.do

有如下的配置:
<servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>com.zyc.a_servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/ServletDemo4</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>com.zyc.a_servlet.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>ServletDemo6</servlet-name>
<servlet-class>com.zyc.a_servlet.ServletDemo6</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo6</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

如果访问地址:
http://localhost:8080/day09/ServletDemo4 :第一个
http://localhost:8080/day09/aaa.do :第二个
url-pattern唯一 不能重复
一个请求一个响应,一个请求可能对应多个匹配,所以优先级:
完全路径匹配 > 目录匹配 > 扩展名匹配
开发中的路径的编写
1
2
3
4
5
6
7
8
9
10
相对路径:都是需要找位置相对关系.不能以 / 开始.
./ 当前路径 ../上一级目录
使用相对路径访问:
1 http://localhost:8080/day09/demo4-url/demo1.html
2 http://localhost:8080/day09/ServletDemo6
从1路径访问2路径 相对路径的写法 ../ServletDemo6
绝对路径:不需要找位置相对关系. 以 / 开始的.
绝对路径中分为客户端路径和服务器端路径:
* 客户端路径一定要加工程名. /day09/ServletDemo6
* 服务器端路径不需要加工程名. /ServletDemo6

response中设置响应头

  • addHeader(String name,String value); — 针对一个key对应多个value的响应头.
  • addDateHeader(String name,long date);
  • addIntHeader(String name,int value);

  • setHeader(String name,String value); — 针对一个key对应一个value的响应头.

  • setDateHeader(String name,long date);
  • setIntHeader(String name,int value);

例如:头信息: xxx:aaa

  • addHeader(“xxx”,”bbb”); –>xxx:aaa,bbb
  • setHeader(“xxx”,”bbb”); –>xxx:bbb
设置头信息
  • Refresh
    response.setHeader("Refresh", "5;url=/day09/demo5-refresh/index.html");
    表示5秒后跳转day09/demo5-refresh/index.html页面
    or:<meta http-equiv=”refresh” content=”3;url=http://www.baidu.com”></meta>
  • 重定向
    response.setStatus(302);
    response.setHeader("Location", "/day09/demo5- refresh/success.html");

得到页面请求值

String getParameter(String name) ;
String[] getParameterValues(String name) ;复选框

ServletContext对象

  • ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象.
    • 得到域对象:Servlet对象.getServletContext();
    • 在servlet中得到:this.getServletContext();
  • 存取数据
    • 存数据:setAttribute(String name, Object obj);
    • 取数据:getAttribute(String name);
  • ServletContext的作用:
    1 .用来获得全局初始化参数.
    2 .用来获得文档的MIME的类型.
    3 .作为域对象存取数据.

    • 作用范围:整个web工程.
    • 创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象(单例).一个项目中得到的ServletContext对象都是同一个,可以资源共享(可以理解为静态对象)。
    • 销毁:服务器关闭的时候,或者项目从服务器中移除的时候.

    4 .用来读取web项目下的文档.

小结:
ServletContext是一个域对象,比起用一般变量存值,作用范围更大,且资源共享。
单例:在运行环境相同的情况下,一个用户创建的是同一个对象,不同的用户创建的也是同一个对象,如:创建Servlet对象,ServletContext对象,都是在同一个服务器下。像手机WeChat,不同的运行环境,不同的用户创建的就不是一个对象了。
ServletContext对象是通过 GenericServlet类的getServletContext()方法获取的。

ServletConfig 对象

获得Servlet的配置信息

1
2
3
4
5
6
7
ServletConfig servletConfig = this.getServletConfig();
String servletName = servletConfig.getServletName();
System.out.println(servletName);

String username = servletConfig.getInitParameter("username");
String password = servletConfig.getInitParameter("password");
System.out.println(username+" "+password);

1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<servlet-name>ServletDemo7</servlet-name>
<servlet-class>com.itheima.a_servlet.ServletDemo7</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>