如何开发一个Servlet
Servlet的映射路径
Servlet缺省路径
Sevlet的生命周期
Servlet的自动加载
有参的init方法和无参的init方法
Servlet的多线程并发问题
ServletConfig对象
ServletContext对象
步骤:
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组成部分 | 作用 |
---|---|
(前提) | 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里面的方法 |
<servlet-mapping> <servlet-name>MyFirstServelet</servlet-name> <url-pattern>/first</url-pattern><!-- 本节讨论对象 --> </servlet-mapping>
类别 | url-pattern | 浏览器输入 |
---|---|---|
精确匹配 | /first | http://localhost:8080/myweb/first |
/rk/first | http://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优先级最低!!!
在%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错误页面。
结论: 先找动态资源,再找静态资源。