2.Servlet入门
一.Servlet简介
- Servlet为sun公司开发动态web的一门技术
- Sun公司在这些API中提供了一个接口叫做:Servlet,如果想开发Servlet程序,需要完成两个小步骤:
- 编写一个类,实现Servlet接口。
- 把开发好的java类部署到Web服务器中。
我们把实现了Servlet接口的Java程序叫做,Servlet。
二.构建一个Servlet项目
步骤:
-
使用Maven搭建父项目,删除src文件用于之后搭建子项目
-
在父项目的pom.xml中导入依赖
-
在父项目中搭建带有webapp骨架的子项目
-
由于子项目中的web.xml版本过低,修改web.xml
-
在子项目中添加java和resources目录
-
编写第一个Servlet代码:
-
建立HelloServlet.java 继承HttpServlet重写doGet和doPost方法
-
在web.xml中注册Servlet以及绑定映射的请求路径
-
配置Tomcat 启动项目
-
学习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>
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中处理。