Servlet编程:如何使用Servlet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet编程:如何使用Servlet相关的知识,希望对你有一定的参考价值。

  1. 如何开发一个Servlet

  2. Servlet的映射路径

  3. Servlet缺省路径

  4. Sevlet的生命周期

  5. Servlet的自动加载

  6. 有参的init方法和无参的init方法

  7. Servlet的多线程并发问题

  8. ServletConfig对象

  9. ServletContext对象

1、如何开发一个Servlet


步骤:

1)编写java类,继承自javax.servlet.http.HttpServlet类

2)覆写doGet和doPost方法

3)Servlet程序交给tomcat服务器运行!!

3.1)将Servlet程序的class字节码文件拷贝到WEB-INF/classes目录

3.2)在web.xml文件中进行配置


示例:MyFirstServlet.java

package com.rk.http.a_howtouse;

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 MyFirstServlet extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.getWriter().write("this is my first Servelt");
	}
}

示例:web.xml中配置Servlet的部分

  <!-- 配置一个servlet -->
  <servlet> <!-- servlet的配置 -->
  	<servlet-name>MyFirstServelet</servlet-name><!-- servlet的内部名称,自定义。尽量有意义 -->
  	<servlet-class>com.rk.http.a_howtouse.MyFirstServlet</servlet-class><!-- servlet的类全名: 包名+简单类名 -->
  </servlet>
  <servlet-mapping><!-- servlet的映射配置 -->
  	<servlet-name>MyFirstServelet</servlet-name><!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
  	<url-pattern>/first</url-pattern><!-- servlet的映射路径(访问servlet的名称) -->
  </servlet-mapping>

示例:完整的web.xml文件 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  
  <!-- 配置一个servlet -->
  <servlet> <!-- servlet的配置 -->
  	<servlet-name>MyFirstServelet</servlet-name><!-- servlet的内部名称,自定义。尽量有意义 -->
  	<servlet-class>com.rk.http.a_howtouse.MyFirstServlet</servlet-class><!-- servlet的类全名: 包名+简单类名 -->
  </servlet>
  <servlet-mapping><!-- servlet的映射配置 -->
  	<servlet-name>MyFirstServelet</servlet-name><!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
  	<url-pattern>/first</url-pattern><!-- servlet的映射路径(访问servlet的名称) -->
  </servlet-mapping>
</web-app>


问题:如何根据URL(“http://localhost:8080/myweb/first”)找到资源的?

通过URL寻找资源的过程
URL组成部分作用
(前提)tomcat服务器启动时,首先加载webapps中的每个web应用的web.xml配置文件。
http://http协议。浏览器遵循HTTP协议发送(Request)请求数据
localhost到本地的hosts文件中查找是否存在该域名对应的IP地址,得到127.0.0.1
8080找到tomcat服务器
/myweb在tomcat的webapps目录下找myweb的目录
/first

资源名称。

1)在myweb的web.xml中查找是否有匹配的url-pattern的内容(/first)

2)如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的servlet配置

3)如果找到,则取出对应的servlet配置信息中的servlet-class内容:

字符串:com.rk.http.a_howtouse.MyFirstServlet

通过反射:

a)构造MyFirstServlet的对象

b)然后调用MyFirstServlet里面的方法


2、Servlet的映射路径


  <servlet-mapping>
  	<servlet-name>MyFirstServelet</servlet-name>
  	<url-pattern>/first</url-pattern><!-- 本节讨论对象 -->
  </servlet-mapping>


Servlet映射路径的精确匹配和模糊匹配
类别url-pattern浏览器输入
精确匹配/firsthttp://localhost:8080/myweb/first
/rk/firsthttp://localhost:8080/myweb/rk/first
模糊匹配/*http://localhost:8080/myweb/任意路径
/rk/*http://localhost:8080/myweb/rk/任意路径

*.后缀名

*.do

*.action

*.html(伪静态)

http://localhost:8080/myweb/任意路径.do

注意事项:

1)url-pattern要么以 / 开头,要么以*开头。  例如,直接写“rk”(前面没有“/”线)是非法路径。

2)不能同时使用两种模糊匹配,例如 /rk/*.do是非法路径,它由rk/*和*.do两种模糊匹配组合而成。

3)当有输入的URL有多个servlet同时被匹配的情况下:(冲突处理)

3.1)精确匹配优先。(长的最像的,优先被匹配)

3.2)以后缀名结尾的模糊url-pattern优先级最低!!!



3、Servlet缺省路径

在%tomcat%/conf/web.xml中,有以下一段XML代码:

    <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


Servlet的缺省路径(/)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。


问题: URL输入http://localhost:8080/myweb/index.html 是如何读取文件的?

1)到当前myweb应用下的web.xml文件查找是否有匹配的url-pattern。

2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理

3)DefaultServlet程序到myweb应用的根目录下查找是否存在一个名称为index.html的静态文件。

4)如果找到该文件,则读取该文件内容,返回给浏览器。

5)如果找不到该文件,则返回404错误页面。

结论: 先找动态资源,再找静态资源。







以上是关于Servlet编程:如何使用Servlet的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eclipse 开发 Java Servlet?

Servlet编程

Servlet编程:ServletConfig

day10servlet编程

如何以编程方式添加 servlet 过滤器?

Servlet编程:Servlet的生命周期