准备工作
下载tomcat 9.0.62
1.Servlet
Servlet是Sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫作:Servlet,如果你想开发一个Servlet程序,只需要两步:
- 编写一个类,实现Servlet接口。
- 把开发好的Java类部署到web服务器中。
把实现了Servlet接口的Java程序,叫作Servlet
2.Hello Servlet
1.构建一个普通的Maven项目(主工程),删除里面的src目录,之后的学习都是在该项目里建立Modle(子工程)。
2.创建Model子工程。
遇到的问题:创建的Model子工程下没有webapp目录
创建Model时,选择的是New Model 然后直接点击create。(就是没有选择导入框架
解决办法:创建Model时,点击Maven Archetype 在Archetype中选择框架,再点击Create等待自动创建。
创建好的Model子工程
3.在主工程的pom.xml中导入依赖。
maven 版本依赖、版本更新、版本查询网站:https://mvnrepository.com/
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
Maven子父项目:
父项目中的jar包子项目可以使用,子项目的jar包父项目不可以使用。
构建后servlet-01子项目后
父项目中:
<modules>
<module>servlet-01</module>
</modules>
子项目中:
<parent>
<artifactId>javaweb</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
4.编写一个servlet程序:
1.编写一个普通类。
2.实现Servlet接口,这里我们直接继承(extends)HttpServlet。
public class Hello 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 {
super.doPost(req, resp);
}
}
3.编写Servlet的映射。
为什么要映射?
我们写的是Java程序,但是要通过浏览器访问。而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径。
在web.xml中配置。
5.配置tomcat
之前博客有写 添加链接描述
6.启动Tomcat
启动后自动跳转到http://localhost:8086/servlet_01_war/
在url路径上加/hello
http://localhost:8086/servlet_01_war/hello
页面显示我们doGet里设置好的内容Hello Servlet
可能遇到的问题:
500:Tomcat版本过高,换成9.0
3.Mapping原理
一个Servlet可以指定一个映射路径
一个Servlet可以指定多个映射路径
一个Servlet可以指定通用映射路径
指定一些后缀或者前缀等等……
优先级问题:
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。
4.ServletContext
Web容器在启动的时候,它会为每个Web程序都创建一个对应的ServletContext对象。它代表了当前的Web应用。
共享数据:
我在这个Servlet中保存的数据,可以在另一个Servlet中拿到.
1.存:Hello类里的内容:(向ServletContext写数据)
package com.example.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//将数据保存在ServletContext中;名字:username;值(数据):zhang san
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("username","zhang san");
}
}
2.取:新建一个GetData类(获取信息类)
package com.example.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class GetData extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String str = (String) servletContext.getAttribute("username");
PrintWriter writer = resp.getWriter();
writer.println(str);
}
}
tips:映射关系也需要补充好
如果先进入http://localhost:8086/servlet_01_war/getdata
,则页面显示null(还未获取到信息)。
再进入http://localhost:8086/servlet_01_war/hello
,页面为空。
再次进入http://localhost:8086/servlet_01_war/getdata
,页面显示zhang san。
若获取数据为中文张三
,显示界面可能会??
(乱码)
在GetData类中加入下面的代码。
//响应到浏览器(处理乱码问题(配置类型和编码))
resp.setContentType("text/html");//响应类型
resp.setCharacterEncoding("UTF-8");//响应的编码格式
ServletContext获取初始化参数
1.在配置文件web.xml中设置初始化参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>Good Morning</param-name>
<param-value>2022-05-15 07:22</param-value>
</context-param>
2.新建GetInit类
package com.example.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetInit extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取ServletContext对象
ServletContext servletContext = this.getServletContext();
//2.获取初始化参数
//引号之间的内容要和<param-name>一致,否则跳转到http://localhost:8086/servlet_01_war/getinit,弹出页面显示null
String str = servletContext.getInitParameter("Good Morning");
//3.输出结果
resp.getWriter().print(str);
}
}
3.配置GetInit映射
<servlet>
<servlet-name>getinit</servlet-name>
<servlet-class>com.example.servlet.GetInit</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getinit</servlet-name>
<url-pattern>/getinit</url-pattern>
</servlet-mapping>
4.运行
ServletContext请求转发
请求A界面,实际访问B界面,URL不变。
1.创建GetRequestDispatch类
package com.example.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetRequestDispatch extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//进入了/getRequestDispatch 界面
System.out.println("进入了GetRequestDispatch");
//实际被转发到了/getinit 界面
servletContext.getRequestDispatcher("/getinit");
servletContext.getRequestDispatcher("/getinit").forward(req,resp);
}
}
2.配置映射关系
<servlet>
<servlet-name>getRequestDispatch</servlet-name>
<servlet-class>com.example.servlet.GetRequestDispatch</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getRequestDispatch</servlet-name>
<url-pattern>/getRequestDispatch</url-pattern>
</servlet-mapping>
3.运行: