Servlet
一、简介
Servlet接口有两个默认的实现类HttpServlet和GenericServlet
- 用于开发动态web的技术,如果开发servlet程序,需要完成:编写一个类,实现servlet接口以及 将开发好的java类部署到web服务器中。
二、HelloServlet
-
构建maven项目,删掉里面的 【src】目录,以后在这里建立Module; 这个空的工程就是maven的主工程
-
(如何从全局上修改maven)
-
关于MAven父子工程:如果父项目中添加一个module,会发现在子项目中会存在
<parent> <artifactId>Javaweb-02-servlet</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>
在父项目中存在
<modules> <module>servlet-01</module> </modules>
-
将子项目中的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的结构搭建完整,建立java的dictionary,并标记为sources root ; 建立resources的dictionary, 并标记为 resources root
-
编写一个Servlet程序
- 编写一个普通类
- 实现Servlet接口,这里我们直接继承HttpServlet
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dobJIEFb-1613952347768)(C:\Users\AW\AppData\Roaming\Typora\typora-user-images\image-20210220111020002.png)]
-
override一个doGet和doPost方法,并让doPost调用doGet
(由于get或post只是请求实现的不同形式,可以互相调用,业务逻辑都一样) -
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 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.wk.servlet.HelloServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置tomcat
-
启动测试
三、Servlet原理
Servlet是有Web服务器调用,web服务器在收到浏览器请求后,会:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YPEyTeD-1613952347770)(C:\Users\AW\AppData\Roaming\Typora\typora-user-images\image-20210220122732976.png)]
四、Mapping问题
-
一个Servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个Servlet可以指定多个映射路径
//方法1 <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</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> //方法2 <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
注意:如果像下面这样
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
只有/*,但是没有其他的,则会优先执行这个
-
优先级问题:
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
<!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.wk.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
五、ServletContext
-
web容器在启动的时候,为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
- 共享数据
我在这个Servlet保存的数据,能在类一个Servlet中拿到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llroua6t-1613952347771)(C:\Users\AW\AppData\Roaming\Typora\typora-user-images\image-20210221154106339.png)]
- 共享数据
-
六、HttpServletResonse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表相应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
- 简单分类
负责向浏览
七、HttpServletRequest
需要导入到pom.xml中的依赖
<dependencies>
<!-- Servlet 依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- JSP依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- JSTL表倒是的依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--standard 标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>