概述:
1、Servlet是JavaEE规范之一。也就是接口。
2、Sevlet是JavaWeb三大组件之一。三大组件分别为Servlet、Filter过滤器、Listener监听器。
3、Servlet是运行在服务器端的Java小程序,可以对客户端发过来的请求作出响应。
手动实现Servlet程序:
1、手动编写一个类继承Servlet接口
2、实现service方法,处理请求响应数据。
3、在web.xml实现Servlet程序的访问地址。
Servlet继承树:
servlet:负责定义Servlet程序的访问规范。
GenericServlet:实现了Servlet接口,做了很多空实现。并持有一个ServletConfig类的引用。并对ServletConfig的使用做一些方法。
HttpServlet:抽取类实现了service()方法,并实现了请求的分类处理(doGet,doPost函数)。
ServletConfig类
ServletConfig类是Servlet程序的配置信息类。
Servlet程序和ServletConfig程序都由Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个ServletConfig对象。
ServletConfig类作用
1、可以获取Servlet程序的别名Servlet-name的值
2、获取初始化参数init-param
3、获取ServletContext对象
web.xml中的配置:
<servlet>
<servlet-name>username</servlet-name>
<servlet-class>root</servlet-calss>
<init-param>
<param-name>url</parm-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
<servlet>
<servlet-mapping>
<servlet-name>username</servlet-name>
<rul-pattern>/hello</url-pattern>
</servlet-mapping>
servlet中的代码:
@Override
public void init(ServletConfig servletConfig) throws ServletExcption {
System.out.print("HelloServlet程序设计的别名是:" + servletConfig.getServletName());
System.out.println("初始化参数username的值是:" + servletConfig.getInitParamter("username"));
System.out.println("初始化参数URL得值是:" + ServletConfig。getInitParamter("url"));
System.out.println(servletConfig.getServletContext());
}
ServletContext类
作用:
ServletContext context = getServletConfig().getServletContext() /
getServletContext()
1、获取web.xml中的配置的上下文参数context-param
context.getInitParameter(String s);
2、获取当前的工程路径,格式:/工程路径
context.getContextPath("/”); //工程部署路径
3、获取工程部署后再服务器硬盘上的绝对路径
context.getRealPath("/"); //工程部署路径
System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
4、向Map一样存取数据

HttpServletRequest类
1. getRequestURI()
获取请求的资源路径
2. getRequestURL()
获取请求的统一资源定位符(绝对路径)
3. getRemoteHost()
获取客户端的 ip 地址
4. getHeader()
获取请求头
5. getParameter()
获取请求的参数
6. getParameterValues()
获取请求的参数(多个值的时候使用)
7. getMethod()
获取请求的方式 GET 或 POST
8. setAttribute(key,
value);
设置域数据
9. getAttribute(key);
获取域数据
10. getRequestDispatcher()
获取请求转发对象
doGet 请求的中文乱码解决:
// 获取请求参数
String username = req.getParameter("username");
//1
先以 iso8859-1 进行编码
//2
再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
// 获取请求参数
String
username
=
req.getParameter("username");
String
password
=
req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"
+ username);
System.out.println("密码:" +
password);
System.out.println("兴趣爱好:" + Arrays.asList(hobby));
}
HttpServletResponse 类的作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传
递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
https://blog.csdn.net/qq_41112238/article/details/103595239
public class ResponseIOServlet extends HttpServlet {
@Override
protected
void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 要求 : 往客户端回传 字符串 数据。
PrintWriter writer = resp.getWriter();
writer.write("response's content!!!");
}
}
响应的乱码解决
解决响应中文乱码方案一(不推荐使用):
// 设置服务器字符集为
UTF-8 resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
响应乱码解决方案二(推荐)
//
它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
//
此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");
请求转发
什么是请求的转发?
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
Servlet1的代码:
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse
resp) throws ServletException,
IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" +
username);
// 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
req.setAttribute("key1","柜台 1 的章");
// 问路:Servlet2(柜台 2)怎么走
/**
* 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
<br/>
*
*/
RequestDispatcher requestDispatcher =
req.getRequestDispatcher("/servlet2");
//
RequestDispatcher
requestDispatcher
= req.getRequestDispatcher("http://www.baidu.com");
// 走向 Sevlet2(柜台
2)
requestDispatcher.forward(req,resp);}
}
servlet2的代码
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username);
// 查看 柜台 1 是否有盖章 Object key1 = req.getAttribute("key1");
System.out.println("柜台 1 是否有章:" + key1);
// 处理自己的业务
System.out.println("Servlet2 处理自己的业务 ");
}
}
Base标签的作用
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>Title</title>
<!--base 标签设置页面相对路径工作时参照的地址 href 属性就是参数的地址值 -->
<base href="http://localhost:8080/07_servlet/a/b/">
</head>
<body> 这是 a 下的 b 下的 c.html 页面<br/>
<a href="../../index.html">跳回首页</a><br/>
</body>
</html>
Web 中的相对路径和绝对路径
在 javaWeb 中,路径分为相对路径和绝对路径两种:
相对路径是:
.
表示当前目录
..
表示上一级目录
资源名
表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
1、绝对路径
2、base+相对
web 中 / 斜杠的不同意义
在 web 中 / 斜杠 是一种绝对路径。
/
斜杠
如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠</a>
/
斜杠
如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况: response.sendRediect(“/”);
把斜杠发送给浏览器解析。得到 http://ip:port/

请求转发和重定向的一些区别:
请求转发是在服务器内部进行,所以可以访问WEB_INF内的资源,重定向相当于是在浏览器端在请求一次别的地址,故不能访问WEB_INT内的资源。