1.Servlet简介
1)动态Web技术
2)在API中有一个接口:Servlet,Servlet是一个运行在web服务器的Java程序,由Servlet来接收并响应来自Web客户端的请求,通常通过HTTP来传输。
由此可见,开发一个Servlet程序只需要两步
- 编写一个Java类,实现Servlet接口;
- 将开发好的Java类部署到Web服务器中。
我们将实现了Servlet接口的Java程序叫做Servlet。
2.HelloServlet编写
1)创建一个空的Maven项目,删去src目录(pom.xml .idea不能删),之后我们就以这个空的工程为Maven的主工程,在这个工程下建立多个Module。
2)在pom文件中添加Servlet需要用到的依赖javax.servlet-api和jsp-api
在https://mvnrepository.com/中搜索最新的依赖
复制并粘贴到pom.xml文件中
将两个依赖都粘贴到pom文件中并下载。
3)创建一个Module,创建方法类似于创建工程
创建完成后project下的pom.xml文件会多一条module信息
module的pom.xml里也会多一条parent信息(我这里刚创建的时候有,加载完成后parent就消失了,手动添加上)
<parent> <artifactId>javaweb-03-maven</artifactId> <groupId>com.rzd</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent>
这里是Maven父子工程必须有的两个标签
<modules> <module>servlet/servlet-01-helloservlet</module> </modules>
将module的pom.xml文件中除以下内容外,均可以删去,保持项目干净
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>javaweb-03-maven</artifactId> <groupId>com.rzd</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>servlet-01-helloservlet</artifactId> <packaging>war</packaging> </project>
4)更换module下面src\main\webapp\WEB-INF\web.xml的版本,复制下面代码替换 (可以直接设置这个为模板)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> </web-app>
5)在module的main目录下添加java和resources目录并设置属性,最终目录结构如图
6)创建一个java类,实现Servlet接口(研究下怎么新增一个模板下次直接用)
这里我直接继承HttpServlet类,这是Sun公司提供的默认的实现Servlet接口的实现类。
1 package com.rzd; 2 import javax.servlet.http.HttpServlet; 3 4 public class HelloServlet extends HttpServlet { 5 //Alt+Enter自动导入jar包,这里module的pom文件里面没有添加依赖, 6 //但是也可以正常导入,是因为父工程的pom文件中有这个依赖 7 }
7)在类中重写方法
1 public class HelloServlet extends HttpServlet { 2 //Alt+Enter自动导入jar包,这里module的pom文件里面没有添加依赖, 3 //但是也可以正常导入,是因为父工程的pom文件中有这个依赖 4 5 //重写HttpServlet中的doGet()和doPost() 6 @Override 7 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 8 //super.doGet(req, resp); 9 PrintWriter writer = resp.getWriter();//响应流 10 //输出HelloServlet 11 writer.print("HelloServlet"); 12 } 13 14 @Override 15 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 16 super.doPost(req, resp); 17 } 18 }
8)编写Servlet的映射:因为Java程序要通过浏览器访问,而浏览器需要链接Web服务器,所以需要在Web服务器中注册自己写的Servlet,并且设置一个浏览器可以访问的路径
配置web.xml
<!--注册Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.rzd.HelloServlet</servlet-class> </servlet> <!--Servlet请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
9)配置tomcat
按照流程配置即可,检查以下项
10)点击运行,此时默认访问页面为index.jsp页面:http://localhost:8080/s1/
可以看到显示内容为Hllo World!
访问http://localhost:8080/s1/hello,即可访问我们自己写的HelloServlet
3.Mapping路径设置
1)一个Servlet指定一个映射路径:访问http://localhost:8080/s1/hello,显示为Hello Servlet!
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2)一个Servlet指定多个映射路径:访问http://localhost:8080/s1/hello1,http://localhost:8080/s1/hello2,http://localhost:8080/s1/hello3,显示为Hello Servlet!
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
3)Servlet指定通配符路径:访问http://localhost:8080/s1/hello,http://localhost:8080//s1/hello/dabcacad,显示为Hello Servlet!(http://localhost:8080/s1/hello123错误)
优先级:指定了的固有路径优先级最高,例如/hello和/*同时存在,虽然/*包含了/hello,但是访问/hello显示hello的内容,访问其他/12345则显示/*的内容
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4)默认请求路径:尽量不要使用
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5)指定前缀或后缀:访问http://localhost:8080/s1/111.do,显示为Hello Servlet!
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>