2.Servlet入门

一.Servlet简介

  • Servlet为sun公司开发动态web的一门技术
  • Sun公司在这些API中提供了一个接口叫做:Servlet,如果想开发Servlet程序,需要完成两个小步骤:
    • 编写一个类,实现Servlet接口。
    • 把开发好的java类部署到Web服务器中。

我们把实现了Servlet接口的Java程序叫做,Servlet。

二.构建一个Servlet项目

步骤:

  1. 使用Maven搭建父项目,删除src文件用于之后搭建子项目

  2. 在父项目的pom.xml中导入依赖

  3. 在父项目中搭建带有webapp骨架的子项目

  4. 由于子项目中的web.xml版本过低,修改web.xml

  5. 在子项目中添加java和resources目录

  6. 编写第一个Servlet代码:

    1. 建立HelloServlet.java 继承HttpServlet重写doGet和doPost方法

    2. 在web.xml中注册Servlet以及绑定映射的请求路径

    3. 配置Tomcat 启动项目

    4. 学习mapping映射规则,编写ErrorServlet

1.构建一个普通的Maven项目,删掉里面的src目录,目的是以后在其中建立Module产生子模块;这个空的工程就是Maven的主工程;

删除src文件夹

在pom.xml中添加依赖

 1 <dependencies>
 2         <dependency>
 3             <groupId>javax.servlet</groupId>
 4             <artifactId>javax.servlet-api</artifactId>
 5             <version>4.0.1</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>javax.servlet.jsp</groupId>
 9             <artifactId>javax.servlet.jsp-api</artifactId>
10             <version>2.3.3</version>
11         </dependency>
12     </dependencies>
View Code

2.添加子模块

 

此时可以看到父项目中pom.xml多了modules属性

1 <modules>
2         <module>servlet191127</module>
3 </modules>

子项目中pom.xml有

1 <parent>
2         <artifactId>LearnServlet</artifactId>
3         <groupId>edu.ustc</groupId>
4         <version>1.0-SNAPSHOT</version>
5 </parent>

3.Maven环境优化

  • 修改web.xml中的web-app属性为4.0
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
 5                              http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
 6          version="4.0"
 7          metadata-complete="true">
 8 
 9     <display-name>Archetype Created Web Application</display-name>
10 </web-app>
  •  将maven项目构建完成添加java和resources目录并设置为代码和资源属性的目录

4.编写一个Servlet程序

Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet

  • 编写一个普通类HelloServlet,我们可以重写doGet和doPost方法。
  • 实现Servlet接口,这里我们直接继承HttpServlet。

 1 public class HelloServlet extends HttpServlet {
 2 
 3     //由于get/post方式只是请求实现方式不同,可以相互调用,业务逻辑都一样。
 4     @Override
 5     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 6         PrintWriter writer = resp.getWriter();  //响应流
 7         writer.println("First Servlet Project");
 8     }
 9 
10     @Override
11     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
12         super.doPost(req, resp);
13     }
14 }

5.编写Servlet的映射

  • 我们写的Java程序需要在web服务中注册我们写的Servlet,当用户通过浏览器访问web服务器后,服务器直接映射到我们的Servlet并且我们还要给浏览器一个可以访问的路径。

 1 <!--注册Servlet-->
 2     <servlet>
 3         <servlet-name>Hello</servlet-name>
 4         <servlet-class>ustc.wzh.servlet.HelloServlet</servlet-class>
 5     </servlet>
 6 
 7     <!--Servlet的请求路径-->
 8     <servlet-mapping>
 9         <servlet-name>Hello</servlet-name>
10         <url-pattern>/hello</url-pattern>
11     </servlet-mapping>

6.配置tomcat(看我的其他文章就可学会)

注:配置项目发布的路径就可以了

7.启动测试

第一个Servlet项目完成!

三.Servlet原理

四.Mapping问题

1.一个Servlet可以指定一个映射路径

 1 <!--注册Servlet-->
 2     <servlet>
 3         <servlet-name>Hello</servlet-name>
 4         <servlet-class>ustc.wzh.servlet.HelloServlet</servlet-class>
 5     </servlet>
 6 
 7     <!--Servlet的请求路径-->
 8     <servlet-mapping>
 9         <servlet-name>Hello</servlet-name>
10         <url-pattern>/hello</url-pattern>
11     </servlet-mapping>

2.一个Servlet可以指定多个映射路径,都能访问到

 1     <!--Servlet的请求路径-->
 2     <servlet-mapping>
 3         <servlet-name>Hello</servlet-name>
 4         <url-pattern>/hello</url-pattern>
 5     </servlet-mapping>
 6     <servlet-mapping>
 7         <servlet-name>Hello</servlet-name>
 8         <url-pattern>/hello2</url-pattern>
 9     </servlet-mapping>
10     <servlet-mapping>
11         <servlet-name>Hello</servlet-name>
12         <url-pattern>/hello3</url-pattern>
13     </servlet-mapping>

3.一个Servlet可以指定通用映射路径:所有/hello下的请求都能访问到

1 <!--Servlet的请求路径-->
2     <servlet-mapping>
3         <servlet-name>Hello</servlet-name>
4         <url-pattern>/hello/*</url-pattern>
5     </servlet-mapping>

4.默认请求路径:任何请求都到这里

1     <!--Servlet的请求路径-->
2     <servlet-mapping>
3         <servlet-name>Hello</servlet-name>
4         <url-pattern>/*</url-pattern>
5     </servlet-mapping>

5.指定一些前缀或后缀的路径:都能匹配到并处理

1     <!--Servlet的请求路径-->
2     <servlet-mapping>
3         <servlet-name>Hello</servlet-name>
4         <url-pattern>*.do</url-pattern>
5     </servlet-mapping>
6     <servlet-mapping>
7         <servlet-name>Hello</servlet-name>
8         <url-pattern>*.wzh</url-pattern>
9     </servlet-mapping>

注:可以使用通配符的两种格式

  • *.扩展名: *.do 或 *.xxx 

  • /* : hello/* 
  • 但不可以混合使用 hello/*.do 是非法的

6.优先级问题:

  指定了固有的映射路径优先级最高,找不到就会走默认的处理请求

例子:添加ErrorServlet

 1 public class ErrorServlet extends HttpServlet {
 2     @Override
 3     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 4         resp.setContentType("text/html");
 5         resp.setCharacterEncoding("utf-8");
 6 
 7         PrintWriter writer = resp.getWriter();
 8         writer.println("<h1>404</h1>");
 9     }
10 
11     @Override
12     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
13         doGet(req, resp);
14     }
15 }

web.xml中添加Servlet的映射

 1     <!--注册Servlet-->
 2     <servlet>
 3         <servlet-name>error</servlet-name>
 4         <servlet-class>ustc.wzh.servlet.ErrorServlet</servlet-class>
 5     </servlet>
 6 
 7     <!--Servlet的请求路径-->
 8     <servlet-mapping>
 9         <servlet-name>error</servlet-name>
10         <url-pattern>/*</url-pattern>
11     </servlet-mapping>

请求就不会进入index.jsp,所有错误请求都会进入ErrorServlet中处理,如果输入/hello则会进入HelloServlet中处理。

原文地址:https://www.cnblogs.com/zhihaospace/p/11941997.html