servlet
1. servlet简介
- 使用来做什么的?是使用来开发动态web的一门技术
- 是哪一个公司的技术:是sun公司的提供的一个接口
- 想开发一个servlet程序,只要两步走
- 编写一个类是西安Httpservlet接口
- 在web服务器中部署这个类就行
- 我们把实现servlet的全部程序集合叫做servlet
2.新建一个主模块
- 搭建一个基本的maven项目,并删除构建好的maven下面的src包
- 主要目的是为了构建多模块
- 以下为maven最干净的主项目
3. 引入jar包
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
引入以下jar包是总是引入不了
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
3.1 解决方法
- 改用其他版试一下,可以就行,如若不行
- 手动下载jar包丢进去
- 检测是否有这个版本
4. 建立一个子模块
-
在当前项目上new一个module
-
如下图所示,注意图中标出来的这几点选择了之后就是创建了一个在主模块下面创建了一个web应用的子模块
- 点击下一步后如图所示,重点关注以下图中标注的位置,其他基本不动
-
点击下一步后如同所示,得检查图中的标注位置是否是自己配置maven地址和仓库,不是则改
至此,子模块构建完成,finish
- 观察下图的,重点标出来的地方
解释:在父项目中pom文件下面会出现一个module的标签,表示他的下面有一个模块
<modules>
<module>servlet-demo-01</module>
</modules>
在子工程中会出现parent的标签,表示他是在父亲的保佑下进行活动的,父亲有的他一定有,他自己有的父项目不能能使用
<parent>
<artifactId>javaweb-01-servlet</artifactId>
<groupId>com.defend</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
如果没有这个的可自行手动添加到子工程中
5. 为子项目创建目录机构
- 图中标注的两个地方为两个方法都可以进入到下图中
-
进入子项目中进行目录配置,右击main新建一个目录,然后点击上面的一排中其中一个设置成对一应的目录即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yIMXZgek-1596363897042)(photo/image-20200802121312438.png)]
6. 环境优化到最新
-
改web.xml的头部
-
创建自己的开发文档目录,切记遵守阿里巴巴的Java开发公约
- 我的基本上是我自己的域名加上项目名称com.defend.servlet
-
简单实现一个servlet程序 经典hello
- 普通类HelloServlet实现HttpServlet
- 不实现servlet而选择继承HttpServlet的理由是继承的GenericServlet没有实现service方法
解析:我们自己类去继承HttpServlet,而HttpServlet去继承GenericServlet类,GenericServlet又去实现servlet接口
-
一般实现两个方法即可
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
- get 与post业务逻辑都是一样的,只是实现的方式不一样
7. 编写一个类映射
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!--配置服务-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.defend.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
一个servlet类可以对应多个路径
写完一个servlet类就给其配置到服务器中,免得遗忘
映射时注意使用*通配符,优先级高于默认的首页
使用*.do时注意前面的不能添加当前路径斜杠/如:“/*.do”时错误的,应去掉/
8. 配置tomcat并启动
- 注意以下几点即可
9. 启动tomcat进行运行
- 运行图如下,图中标出是价值所在
10. 推演servlet运行原理
- 运行原理图如下:
11. 分析并编写一个错误的servlet页面
- 页面如下
分析:查看图中有中文显示,我们就得设置返回值content-type的两个参数
12. ServletContext
在一个web就有一个servletContext来进行管理,故他代表了当前的web应用
这个类能做上面
-
实现共享数据
- 子啊一个servlet中写入数据,在另外有一个servlet中就可以拿到
类1中的 public class HelloNewServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("servlet02Test"); ServletContext context = this.getServletContext(); String name = "孙吻"; context.setAttribute("name",name); System.out.println("测试完成"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } } 类2 public class ReadGetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String name = (String) context.getAttribute("name"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字:"+name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
得在web.xml配置两个servlet的服务先请求有set方法的哪一个把数据set进去,然后请求get得到共享数据,其中编码这些得先设置,要不然会出现加载乱码问题
原理图如下
servletContext的其他应用得
其中有一个重点就是请求转发
重定向