您的位置:首页 > 编程语言 > Java开发

Javaweb基础之Servlet学习

2017-08-28 21:03 507 查看

一、Servlet简介

1.1 什么是Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet是一套规范,也就是说其中的一部分的类抽象成了接口,实际过程中Servlet运行在web服务器中,具体的实现要由web服务器来实现(与JDBC的驱动一个道理)。

1.2 Servlet运行机制

浏览器发送一个HTTP请求,HTTP请求由Web容器(服务器)分配给特定的Servlet进行处理,Servlet的本质是一个Java对象,这个对象拥有一系列的方法来处理HTTP请求。常见的方法有doGet(),doPost()等。Web容器中包含了多个Servlet,特定的HTTP请求该由哪一个Servlet来处理是由Web容器中的web.xml来决定的。

1.3 Tomcat与Servlet关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品。

二、实现javax.servlet.Servlet接口

2.1 Servlet接口的相关方法

(1) ServletConfig getServletConfig:获取Servlet的配置信息

(2) String getServletInfo:获取servlet的信息

(3) void init(ServletConfig config) :出生之后执行初始化操作(只执行一次)。

(4) void service(ServletRequest req,ServletResponse res):每次处理请求时都会被调用。

(5) void destory():临终前的处理善后工作,销毁servlet占用的非内存资源。

2.2 Servlet接口的具体实现

2.2.1 实现Servlet接口

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

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

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

@Override
public void destroy() {
System.out.println("destroy()...");
}
}


2.2.2 配置web.xml文件

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.xxx.myServlet.MyServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/aServlet</url-pattern>
</servlet-mapping>


web.xml中配置Servlet的目的是把访问路径与一个Servlet绑定在一起。如本例配置的就是把com.xxx.myServlet.MyServlet和路径“/aServlet”绑定在一起。

:指定某个Servlet,并给其命名。

:指定访问路径访问的servlet的名称

2.3 Servlet的生命周期

Servlet的生命周期是指Servlet的出生,服务,以及死亡的过程。与Servlet生命周期相关的方法如下:

void init(ServletConfig servletConfig):出生时执行初始化操作(只能一次)

void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用。

void destory():关闭服务器时被销毁。

2.3.1 Servlet的出生

服务器会在Servlet第一次被访问时创建Servlet对象(或在服务器启动时创建),一个Servlet类型服务器只创建一个实例。

在服务器启动时创建Servlet需要在web.xml的
<servlet>
标签中配置
<load-on-startup>2</load-on-startup>
),数字2如果有数字1出现时会在其之前执行。数字范围1~9。

2.3.2 Servlet的服务

具体的对数据库的增删改查,当服务器每次接收请求时,都会调用Servlet的service(ServletRequest req,ServletResponse res)方法。service方法可以被多次调用。

2.3.3 Servlet的死亡

Servlet在关闭服务器时才会死亡,离去时会调用destory()方法,非内存资源会在destory()中被销毁。

2.4 Servlet接口相关参数

ServletRequest和ServletResponse(请求和响应)

ServletConfig



ServletConfig对象由tomcat创建,然后传递给Servlet的init()方法,所以可以在init方法中使用ServletConfig对象。

String getServletName():获取Servlet在web.xml中配置的servlet名称()

ServletContext getServletContext():获取ServletContext对象

String getInitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名获取参数值

Enummeration getInitParameterNames():用来获取web.xml中配置的所有初始化参数名称(可遍历打印)

2.4.1 在web.xml文件中初始化参数配置和ServletConfig方法调用

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.xxx.myServlet.MyServlet</servlet-class>
<init-param>
<param-name>name1</param-name>
<param-value>Jack</param-value>
</init-param>
<init-param>
<param-name>name2</param-name>
<param-value>Jerry</param-value>
</init-param>
</servlet>
```

```
//获取sevlet的名称(在init方法中)
System.out.println("servlet的名称"+servletConfig.getServletName());

System.out.println("---------------------");
//获取初始化参数值
System.out.println("获取name1的值:"+servletConfig.getInitParameter("name1"));
System.out.println("获取name2的值:"+servletConfig.getInitParameter("name2"));
System.out.println("---------------------");
//获取全部的初始化参数
Enumeration e=servletConfig.getInitParameterNames();
while(e.hasMoreElements()){
System.out.println(e.nextElement());
}


三、继承HttpServlet

HttpServlet类是GennericServlet类的子类,提供了对HTTP请求的特殊支持,因而应用更为广泛。

3.1 doGet()和doPost()方法

tomcat创建HttpServlet对象,调用HttpServlet的service(HttpServletRequest req, HttpServletResponse resp)方法,并判断当前请求是get还是post,是get调用doGet(),post调用doPost()。

3.2 具体实现方法

1.继承HttpServlet


public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=gbk");
resp.getWriter().print("你好呀");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}


2.配置web.xml文件


<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.xxx.test.AServlet</servlet-class>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/AServlet</url-pattern>
</servlet-mapping>


注:调用doPost方法需要表单提交方式为method="post"


四、Servlet与线程安全

因为一个类型的Servlet只有一个实例对象,那么所以可能会出现一个Servlet同时处理多个请求。Servlet不是线程安全的,工作效率较高,但同时也存在线程安全问题。

不要在Servlet中创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程进行读操作。

五、标签

是的子元素,用来指定Servlet的访问路径(url),一般以“/”开头,*.x除外。

当在同一个中配置多个时,无论访问哪一个路径都可以访问该Servlet。

通配符”*”代表可以匹配任何URL前缀(或后缀)如:

/* 代表匹配所有url

.do:只要后缀是 .do都可以匹配

六、ServletContext

6.1概述

ServletContext(上下文对象)是Java四大域对象之一。服务器会为每一个应用创建一个ServletCotext对象。随着tomcat的启动而产生,随着tomcat的关闭消失。ServletContext对象的作用是整个Web应用的动态资源之间共享的数据。例如AServlet中向ServletContext对象中保存一个值,然后在BServlet中可以获取这个值。

6.2 ServletContext对象的获取

在void init(ServletConfig servletConfig)中:servletConfig可以调用ServletContext getServletContext()

在HttpServlet中获取ServletContext对象:

因为HttpServlet继承GenericServlet类,而该类中有一个方法 ServletContext getServletContext() ;所以可以在HttpServlet的方法中直接使用this.getServletContext()来获取ServletContext对象。

6.3 获取应用初始化参数

Servlet也可获取初始化参数,但是它的参数是局部参数,也就是说,一个Servlet只能获取自己的初始化参数,不能获取别的Servlet的初始化参数。

可以配置公共的初始化参数,为所有的Servlet而用!这个就需要使用ServletContext!

需要在web.xml中配置应用初始化数据

<web-app>
.....
<context-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</context-param>
</web-app>


使用ServletContext获取应用初始化数据

ServletContext sc=  servletConfig.getServletContext();
String value1 = sc.getInitParamter("name1");


6.4 ServletContext作为域对象的功能

6.4.1.域对象简介

ServletContext对象用来操作数据的方法

* void setAttibute(String name,Object value):用来存储一个对象。多次调用setAtrribute(“name1”)会对上一个name1的值产生覆盖效果

* Object getAttribute(String name):获取存储数据name所对应的值 value

* void removeAttribute(String name):移除ServletContext中域属性

* Enumeration getAttributeNames():获取所有的域属性的名称;

Servlet获取资源路径

* 获取绝对路径

ServletContext sc = config.getServletContext();

String realPath = sc.getRealPath(“/a.txt”);

* 获取资源流

ServletContext sc = this.getServletContext();

InputStream is1 = sc.getResourceAsStream(“/a.txt”);

InputStream is2 = sc.getResourceAsStream(“/WEB-INF/b.txt”);

* 获取指定目录下的所有资源路径

ServletContext sc = request.getServletContext();

Set set = sc.getResourcePaths(“/WEB-INF”);

System.out.println(set);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: