Servlet

一、web资源

在http协议当中,规定了请求和响应双方, 客户端和服务器端。与web相关的资源。

  • 静态资源
    html 、 js、 css
  • 动态资源
    servlet/jsp

二、Servlet介绍+创建tomcat配置

  • 其实就是一个java程序,运行在我们的web服务器上,用于接收和响应客户端的http请求。

  • 更多的是配合动态资源来做。 当然静态资源也需要使用到servlet,只不过是Tomcat里面已经定义好了一个DefaultServlet

简单使用Web工程

  1. 切换工作空间(左上角文件–切换工作空间)

  2. 自动打开然后需要配置Tomcat,点开右上角透视图(如图)–JAVAEE

  1. 点击下边输出框的Servers–提示一行NO….–然后空白位置右键new

  1. Apache–tomcat版本7.0

  1. 选定tomcat–下面的Servers里面的tomcat7–右键open–中间Server Locations选中第二个

  1. 新建一个web项目–右键new–other–Web–Dynamic Web Project

  1. 新建一个名字HelloServlet–Dynamic web module version更改为2.5

  1. 在HelloServlet–WebContent新建名为index.html文件

  1. index里面写一个h标签内容–点run as–选自己的tomcat–稍等一会(提前不要打开tomcat)

  1. 可以通过访问网页展示
1
http://localhost:8080/HelloServlet/index.html


三、Servlet操作代码

  1. 在前面的基础上Java Resources–src–新建HelloServer类(实现Server接口)–要实现五个方法(只用改service方法)
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

package server;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServer implements Servlet{
public static void main(String[] args) {

}

@Override
public void destroy() {}

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

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

@Override
public void init(ServletConfig arg0) throws ServletException {}

@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("helloServlet...");
}

}
  1. 配置Servlet:告诉服务器我们的应用要这么写个servlet

点开WebContent–WFB-INF–lib–web.xml–点击下面框的source更改–然后重启tomcat

1
2
3
4
5
6
7
8
9
10
11
<!--1.向tomcat报告 我有一个XXX类,路径是XXX-->
<servlet> <!--提示报错之后选最后一个servlet-name-->
<servlet-name>HelloServer</servlet-name> <!--提示报错之后选最后一个servlet-class-->
<servlet-class>server.HelloServer</servlet-class> <!--需要写包.类名-->
</servlet>

<!--2.注册servlet的映射,servletName:找到上面注册的具体servlet,url-pattern:在地址栏上的path-->
<servlet-mapping> <!--提示报错之后选最后一个servlet-name-->
<servlet-name>HelloServer</servlet-name>
<url-pattern>/a</url-pattern> <!--一定要记得写/ 实在项目名后写的地址-->
</servlet-mapping>
  1. 地址栏输入http://localhost:8080/项目名称(HelloServlet)/a

执行框会显示类的结果:


四、Servlet 执行过程

执行分析过程:tomcat应用(localhost:8080)–找到项目(HelloServlet)–找到web.xml–找下面的url-pattern的/a–找到servlet-mapping中的servlet-name(类名)–找到上面的servlet-class 然后开始创建该类的实例–实现service方法


五、Servlet的通用写法

Servlet (接口)
    |
    |
GenericServlet
    |
    |
HttpServlet (用于处理http的请求)
  • 定义一个类—继承HttpServlet—复写doGet 和 doPost
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package server;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class shixian extends HttpServlet {

//Get请求会来这个方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get---");
}

//POST请求会来这个方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post----");
}

}


六、Servlet 生命周期

  • init方法

    在创建该servlet的实例时,就执行该方法。
    一个servlet只会初始化一次, init方法只会执行一次
    默认情况下是 : 初次访问该servlet,才会创建实例。 
  • service方法

    只要客户端来了一个请求,那么就执行这个方法了。
      该方法可以被执行很多次。 一次请求,对应一次service方法的调用
  • destroy方法

    servlet销毁的时候,就会执行该方法
    
        1. 该项目从tomcat的里面移除。
        2. 正常关闭tomcat就会执行 shutdown.bat

doGet 和 doPost不算生命周期方法,所谓的生命周期方法是指,从对象的创建到销毁一定会执行的方法, 但是这两个方法,不一定会执行。

完整代码如下:

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
41
42
43
44
45
46
47
48
package server;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class Hello implements Servlet{

///1 (一次)
//在创建servlet实例-->执行的方法
//默认是初次访问servlet,才会创建实例
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("Hello初始化..."); //重启tomcat--浏览器输入http://localhost:8080/HelloServlet/Hello--控制台会输出
}

//2 (多次)
//只要客户端来请求,就执行
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("客户端来请求,service方法已经执行了"); //重启tomcat--浏览器输入http://localhost:8080/HelloServlet/Hello--控制台会输出
}

//3
//用于servlet销毁
///1. 该项目从tomcat的里面移除。
//2. 正常关闭tomcat(shutdown.bat)就会执行
@Override
public void destroy() {
System.out.println("destroy方法已经执行了"); //重启tomcat--浏览器输入http://localhost:8080/HelloServlet/Hello--控制台会输出
}


@Override
public ServletConfig getServletConfig() {
// TODO 自动生成的方法存根
return null;
}

@Override
public String getServletInfo() {
// TODO 自动生成的方法存根
return null;
}

}

七、Servlet创建实例提前(缓解init方法逗留时间太长)

  1. 默认情况下,只有在初次访问servlet的时候,才会执行init方法。 有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。
  2. 那么这个时候,初次访问,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。
  3. 在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2开始即可。

web.xml里面更改:

1
2
3
4
5
<servlet>
<servlet-name>HelloServlet04</servlet-name>
<servlet-class>com.itheima.servlet.HelloServlet04</servlet-class>
<load-on-startup>2</load-on-startup> //增加这一行
</servlet>

八、ServletConfig(API)

Servlet的配置,—>这个对象,获取servlet配置时的一些信息

完整代码如下:

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
41
42
43
44
package server;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletConfig extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//ServletConfig -----> 获取servlet配置的信息

//1.得到servlet配置对象
javax.servlet.ServletConfig config=getServletConfig();

//获取servlet里面xml的配置名称servletName
String servletName=config.getServletName();
System.out.println("servletName="+servletName);
System.out.println("-------");

//获取servlet里面具体的某一个参数
String address=config.getInitParameter("address"); //配置文件写的<param-name>address</param-name>
System.out.println("address="+address);
System.out.println("-------");

//遍历取出所有的参数名称
Enumeration<String> names = config.getInitParameterNames(); //ctrl+1--选“将方法给定指定局部变量 ”
while (names.hasMoreElements()) {
String key = (String) names.nextElement();
String value = config.getInitParameter(key);
System.out.println("key==="+key + " value="+value);
}

}

//来了post请求,就让它去执行doGet方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}

}

web.xml配置文件加入:

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
<!--ServletConfig类的配置文件-->

<servlet> <!--提示报错之后选最后一个servlet-name-->
<servlet-name>ServletConfig</servlet-name> <!--提示报错之后选最后一个servlet-class-->
<servlet-class>server.ServletConfig</servlet-class> <!--需要写包.类名-->

<!-- 添加初始化参数 init-param -->

<init-param>
<param-name>address</param-name>
<param-value>beijing...</param-value>
</init-param>

<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>

<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>

</servlet>

<servlet-mapping> <!--提示报错之后选最后一个servlet-name-->
<servlet-name>ServletConfig</servlet-name>
<url-pattern>/ServletConfig</url-pattern>
</servlet-mapping>

重新打开tomcat–浏览器输入http://localhost:8080/HelloServlet/ServletConfig--控制台得到结果


×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 一、web资源
  2. 2. 二、Servlet介绍+创建tomcat配置
    1. 2.1. 简单使用Web工程
  3. 3. 三、Servlet操作代码
  4. 4. 四、Servlet 执行过程
  5. 5. 五、Servlet的通用写法
  6. 6. 六、Servlet 生命周期
  7. 7. 七、Servlet创建实例提前(缓解init方法逗留时间太长)
  8. 8. 八、ServletConfig(API)
,