Servlet
- 开发动态web的一门技术
- Sun公司在这些API中提供了一个接口叫做Servlet
- 开发Servlet程序,只需要完成两个步骤:
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中
把实现了Servlet接口的Java程序叫做,Servlet
HelloServlet
- servlet有两个默认的实现类:HttpServlet,GenericServlet
- 构建一个普通的Maven项目,删掉里面的src目录,以后的学习可以在该项目里建立Model,这个空的工程,就是Maven的主工程
- 第一步,https://mvnrepository.com/中搜索要使用的依赖包
- 第二部,将搜索到的代码放入标签下
- 第三步,打开Maven仓库
- 第四步,下载依赖
新建项目
-
关于Maven父子工程的理解:
子类下:
<parent> <artifactId>javaweb-02-Servlet</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>
父类下:
<modules> <module>servlet01</module> </modules>
父项目中的jar包,子项目可以直接使用
-
Maven环境优化
- 修改子项目中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>
- 将Maven的结构搭建完整(main目录下建立java和resources)
-
编写一个Servlet程序
- 编写一个普通类
- 实现Servlet接口,这里继承HttpServlet
- 重写方法:
public class HelloServlet extends HttpServlet { //由于get或者post只是请求实现的不同方式,可以相互调用,业务逻辑都一样 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter();//响应流 writer.print("Hello,Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
编写Servlet的映射
为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需要给他一个浏览器能够访问的路径;
<!--注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.ch1.servlet.HelloServlet</servlet-class> </servlet> <!--servlet的映射路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置Tomcat
- 启动测试
Mapping
一个servlet可以映射一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 可以访问localhost:8080/hello
一个servlet可以映射多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<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>
- 可以访问localhost:8080/hello
- 可以访问localhost:8080/hello1
- 可以访问localhost:8080/hello2
- 可以访问localhost:8080/hello3
一个servlet可以映射通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
- 可以访问localhost:8080/hello/随意字符输入
可以映射通用后缀映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.ch1</url-pattern>
</servlet-mapping>
注意:*.ch1前不加/
- 可以访问localhost:8080/随意字符输入.ch1
优先级问题
指定了的固有的映射路径优先级最高
如:
<servlet-mapping>
<servlet-name>hello1</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello2</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
登陆页面时,会先进入hello2的映射路径,因为其映射路径为通用路径,而在通用路径后输入/hello时,会进入到hello1的映射路径,找不到的路径则会进入到默认的映射路径(hello2)