前言:接上一篇文章Tomcat&Servlet的搭建,不会安装tomcat与servlet的小伙伴可以着重的去了解一下
目录
一.servlet的体系结构
在之前的servlet入门里去写servlet类的时候,我们是直接实现的servle的接口,实现接口的时候就必须要写接口的全部方法,但是一般在使用过程中只需要一两个方法即可,我们可以通过了解servlet的体系结构来选择继承相关的servlet类
1.servlet的体系结构
2.MyServlet类
这是我们一般时候需要写的一个类,继承自HttpServlet类,只需要重写HTTPServlet的几个方法即可
常用方法
1.doGet
该方法处理get请求
2.doPost
该方法处理post请求
二.HTTP的介绍
1.简介
超文本传输协议:规定了客户端与服务器沟通时,发送的数据格式
基于tcp/ip
请求 : 请求信息 http协议
客户端————————————————————>服务器
响应: 响应信息 http协议
客户端<————————————————————服务器
无状态协议
就像是人类说话一样,客户端与服务器端也有自己的语言
2.请求数据格式
1.请求行
请求的地址
请求的方法
2.请求头
简单说几个参数
accept:当前浏览器支持接受什么类型的数据
cookie:保留用户的会话信息
referer:从哪里跳转过来的(一般用于防盗链与统计工作)
user——agent:当前系统版本,浏览器版本
3.请求空行
什么都没有,区分请求行与请求体
4.请求体
一些表单什么的数据
三.Request的介绍
1.通过Request方法获取用户请求Request的属性
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取请求方式 :GET
String method = request.getMethod();
System.out.println(method);
//2.(*)获取虚拟目录:/day11
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3. 获取Servlet路径: /demo1
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4. 获取get方式请求参数:name=zhangsan
String queryString = request.getQueryString();
System.out.println(queryString);
//5.(*)获取请求URI:/day11/demo1
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//6. 获取协议及版本:HTTP/1.1
String protocol = request.getProtocol();
System.out.println(protocol);
//7. 获取客户机的IP地址:
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
2.通过Request方法获取用户请求头的键值对
public class ServletDome01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取所有请求头名称
Enumeration<String> headerNames = req.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根据名称获取请求头的值
String value = req.getHeader(name);
System.out.println(name+":"+value);
}
}
}
3. 通过Request方法获取用户提交的表单参数
访问事先准备好的html登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/demo01">
账号:
<input type="text" name="username" ><br>
密码:
<input type="password" name="password" ><br>
<input type="submit" value="登录">
</form>
</body>
</html>
public class ServletDome01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置流的编码
req.setCharacterEncoding("utf-8");
//获取请求参数username
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
}
成功获取到前端输入的找好密码
4.页内跳转
使用场景:登陆成功或者失败的跳转
req.getRequestDispatcher("/demo03").forward(req,resp);
这个跳转对用户来说是不可见的,就相当于函数内部的跳转一样
public class ServletDome01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置流的编码
req.setCharacterEncoding("utf-8");
//获取请求参数username
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
// 跳转到Demo03,可以使用setAttribute,把键值对放进request域,可以随时提取
req.setAttribute("msg","参数");
req.getRequestDispatcher("/demo03").forward(req,resp);
}
}
成功跳转到Demo03,并收到参数