ServletConfig和ServletContext是Servlet的两个核心对象
HttpServlet继承了GenericServlet,GenericServlet实现了Servlet,ServletConfig和Serializable。
GenericServlet中有一个getServletConfig()方法用于获取配置信息。比如资源的别名
在web.xml用可以设置初始化信息
Servlet上下文对象(又叫Servlet域对象):ServletContext
作用:可以像map一样存储数据,可以获取全局共享初始化数据
域:取值的范围
ServletContext的作用域范围是整个工程,生命周期是从Servlet创建到销毁,即当Servlet的实例被创建,ServletContext就也被创建,在当前工程任意一个类获取的ServletContext都是同一个,它的内存地址永远是相同的。在当前工程的任何地方都能获取到ServletContext中的数据。
<!--配置全局共享数据-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost/3306</param-value>
</context-param>
获取方法:
1、根据getServletConfig()的对象servletconfig获取
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Servlet配置对象
ServletConfig servletConfig = getServletConfig();
//获取Servlet域对象
ServletContext servletContext = servletConfig.getServletContext();
//向ServletContext中存值得方法
//ServletContext的作用域范围是Servlet的整个生命周期
servletContext.setAttribute("asdf","sfd");
//获取域中数据方法servletContext.getAttribute()
Object asdf = servletContext.getAttribute("asdf");
Object sfd = servletContext.getAttribute("sfd");
//获取全局共享初始化数据的方法servletContext.getInitParameter()
String url = servletContext.getInitParameter("url")
}
servletContext.getAttribute()是获取域中的数据,servletContext.getInitParameter()是获取全局共享数据
HTTP协议
所谓HTTP协议,客户端和服务端通信时,需要遵守的规则,叫HTTP协议
请求分为get请求和post请求
get请求
1、请求行
1)请求方式get
2)请求的资源路径【+?+请求参数】
3)请求的协议的版本号HTTP/1.1
2、请求头
key:value组成不同的键值对,表示不同的含义
例如:
POST请求
1、请求行
1)请求方式post
2)请求的资源路径【+?+请求参数】
3)请求的协议的版本号HTTP/1.1
2、key:value组成不同的键值对,表示不同的含义
3、请求体:就是发送给服务器的数据
get请求会把所有的数据拼接在地址栏上,所以没有请求体。
get提交方式不能在地址栏中手动拼接参数,它会在你输入数据后解析到地址栏上,post提交方式可以手动输入数据在地址栏上。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<form action="http://localhost:8080/test/05" method="get">
<input type="text" name="username">
<input type="text" password="password">
<input type="submit" value="提交">
</form>
</body>
</html>
get方式,通过在text框中输入数据,解析后数据会显示在地址栏上
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<form action="http://localhost:8080/test/05?username = zs&password=root" method="post">
<input type="submit" value="提交">
</form>
</body>
</html>
post方式
可以直接在地址栏后手动拼接数据,也可以不拼接。
若是不拼接提交后数据不会显示在地址栏,而是在请求体(form data)中;若是拼接,所拼接参数会显示在地址栏中;若是在text框输入了数据,且地址栏中拼接了参数,则参数会显示在地址栏和query string parameter 中,所输入数据则在请求体(form data)中。
常用响应码说明:
200请求成功
302请求重定向
404请求地址错误
500代码错误
HttpServletRequest类
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
HttpServletRequest类的常用方法:
1)getRequestURI()获取资源路径
2)getRequestURL()获取请求的统一资源定位符(绝对路径)
3)getRemoteHost()获取客户端的ip地址
4)getHeader()获取请求头
5)getParameter()获取请求的参数(当参数有多个值时,只获取第一个)
6)getParameterValues()获取请求的参数(多个值的时候使用)
7)getMethod()获取请求的方式
8)setAttribute(key,value)设置域数据
9)getAttribute(key)获取域数据
10)getRequestDispater(“xxx”)获取请求转发对象(括号中参数是要转发的资源路径)
RequestDispatcher requestdispatcher = request.getRequestDispatcher("/hello")//请求转发
requestdispatcher.forward(request,response); //指向具体的资源
doGet方法的参数request也是域对象,作用域是一次请求之内,一次请求之内即地址栏上的地址没有变化。
请求转发
指的是服务器收到请求后,从一个资源跳转到另一个资源的过程。
HttpServletResponse类
每次只要有请求进入Tomcat服务器,Tomcat服务器就会创建一个Response对象传递给Servlet程序使用。HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来设置。
往客户端回传数据
字节流和字符流对象不能同时存在
字节流getOutputStream()
常用于下载(传递二进制数据)
字符流getWriter()
常用于回传字符串(常用)
响应的乱码解决
setContentType(“text/html;charset=UTF-8”)
请求重定向
请求重定向,指的是客户端给服务器发请求然后服务器告诉客户端去新地址访问。(旧地址可以已经废弃)
请求重定向使用的是response对象
1、原始方法(源代码方式)
//请求重定向
response.setStatus(302);
//设置响应头,执行地址的跳转
response.setHeader("location","https://www.baidu.com/");
2、用sendRedirect()方法
//方案二
response.sendRedirect("https://www.baidu.com/");
请求重定向是进行了两次请求的,所以不能通过请求重定向进行request域对象的请求转发。重定向在执行中会发生地址的跳转,并且不共享request域中的数据