一、什么是Servlet
- 1、Servlet是JavaEE规范之一,规范就是接口。
- 2、Servlet是JavaWeb三大组件之一。
三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
- 3、Servlet是运行在服务器上的一个java小程序,
它可以接受客户端发送过来的请求,并响应数据给客户端。
二、如何使用Servlet
- 继承HttpServlet实现Servlet程序
- 并需要在xml里面配置映射
三、HTTP协议
- 客户端->服务器叫
请求
- 服务器->客户端叫
响应
* 常用的响应码:
* 200 表示请求成功
* 302 表示请求重定向
* 404 表示请求服务器已经收到了,但是数据不存在(请求地址错误)
* 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
* 常用请求头:
* Accept: 表示客户端可以接受的数据类型
* Accept-Languege: 表示客户端可以接受的语言类型
* User-Agent: 表示客户端浏览器的信息
* Host: 表示请求时的服务器ip和端口号
请求又分为get请求和post请求:
- get 请求用来从服务器上获取资源
- post 请求通常是用来向服务器提交数据的
四、Servlet下的类
4.1 HttpServletRequest类
- 每次只要请求进入Tomcat服务器,它就会把请求过来的Http协议信息解析好封装到Request对象中。
- 然后传递到Service方法(doGet和doPost)中给我们使用。
System.out.println("servlet01的get方法");
//getRequestURI() 获取请求的资源路径
System.out.println("URI->" + request.getRequestURI());
//getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println("URL->" + request.getRequestURL());
//getRemoteHost() 获取客户端ip地址
System.out.println("客户端 ip地址:" + request.getRemoteHost());
//getHeader() 获取请求头
System.out.println("请求头User-Agent:" + request.getHeader("User-Agent"));
//getMethod() 获取请求的方式GET或POST
System.out.println("请求的方式:" + request.getMethod());
用户登陆传参数值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/JavaWeb01/Servlet01" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
爱好:<input type="checkbox" name = "hobby" value="sing">唱歌
<input type="checkbox" name = "hobby" value="dance">跳舞
<input type="checkbox" name="hobby" value = "play">和cxk一起打篮球
<input type="submit" value="登陆">
</form>
</body>
</html>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置req对象的解码方式
req.setCharacterEncoding("UTF-8");
//获取请求参数
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));
for(int i = 0; i < hobby.length; i ++ ){
System.out.println(hobby[i]);
}
}
请求转发
- 请求转发指的是
服务器
收到请求后,从一个资源跳转到另一个资源的操作。
------------servlet02---------------------
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("dog","leigou");
//dispatcher调度
RequestDispatcher rd = req.getRequestDispatcher("/Servlet03");
rd.forward(req,resp);
}
------------servlet03---------------------
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
String dog = (String) req.getAttribute("dog");
if(dog != null) out.println(dog);
}
Web下的路径
* 在web中/斜杠是一种绝对路径
* 如果被浏览器解析,得到的地址是:http://ip:port/
* <a href="/"></a>
* 如果被服务器解析,得到的地址是:http://ip:port/工程路径
* Redirect:使改方向
* 特殊的:response.sendRediect("/") :http://ip:port/
4.2 HttpServletResponse类
- 上面一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletRequest表示请求的信息,HttpServletResponse表示所有响应的信息。
两个响应流:
* 字节流 getOutputStream() 常用与下载(传递二进制数据)
* 字符流 getWriter() 常用于回传字符串(常用)
* 两个流同时只能使用一个!
//在客户端上打印hello
PrintWriter out = resp.getWriter();
out.write("hello");
服务器和客户端字符编码集的设置
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器使用UTF-8字符集
resp.setHeader("Content-Type","text/html;charset=UTF-8");
//默认ISO-8859-1
//同时设置服务器和客户端都是用UTF-8字符集,还设置了响应头
resp.setContentType("text/html;charset=utf-8");
System.out.println(resp.getCharacterEncoding());
PrintWriter out = resp.getWriter();
out.write("磊是真狗");
请求重定向
- 请求重定向:
客户端给服务器发请求,然后服务器给客户端一个新地址去访问(可能旧地址已经被抛弃了emm) - 第一种方法:
//设置响应状态码302,表示重定向
resp.setStatus(302);
//设置响应头,说明新地址在哪
resp.setHeader("Location","/JavaWeb01/Servlet03");
-第二种方法:
resp.sendRedirect("/JavaWeb01/Servlet03");