默认欢迎资源文件
apache-tomcat-9.0.46\conf\web.xml
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
Http状态码
100:通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收
响应包之后,继续向Http服务器所要依赖的其他资源文件
200:通知浏览器本次返回的资源文件是一个完整独立资源文件,浏览器在接收到之后不需要所要其他关联文件
302: 通知浏览器本次返回的不是一个资源文件内容而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件
response.sendRedirect(“资源文件地址”)写入到响应头中location
而这个行为导致Tomcat将302状态码写入到状态行
前面写过登录(login)页面,当用户名和密码正确时,跳转到index.html,
否则跳转到login_error页面。
404:通知浏览器,由于在服务端没有定位到被访问的资源文件
因此无法提供帮助
405:通知浏览器,在服务端已经定位到被访问的资源文件(servlet)
但是这个servlet对于浏览器采用的请求方式不能处理
500:通知浏览器,在服务端已经定位到被访问的资源文件(servlet)
这个servlet可以接收浏览器采用请求方式,但是servlet在处理请求期间,由于Java异常导致处理失败
多个servlet调用的规则
通过重定向解决
System.out.println("oneServlet负责洗韭菜");
resp.sendRedirect("/myWeb/two");
请求转发解决
System.out.println("oneServlet负责洗韭菜");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/two");
requestDispatcher.forward(req,resp);
在请求转发过程中,浏览器只发送一个了个Http请求协议包。参与本次请求的所有servlet共享同一个请求协议包,因此
这些servlet接收的请求方式与浏览器发送的请求方式保持一致
数据共享
ServletContext接口
2.工作原理:
每一个网站都存在一个全局作用域对象。这个全局作用域对象【相当于】一个Map.在这个网站中oneservlet可以将一个数据存入到全局作用域对象,当前网站中其他servlet此时都可以从全局作用域对象得到这个数据进行使用
3.全局作用域对象生命周期:
1)在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
2))在Http服务器运行期间时,一个网站只有一个全局作用域对象3)在Http服务器运行期间,全局作用域对象一直处于存活状态4)在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理
全局作用域对象生命周期贯穿网站整个运行期间
package com.example.servlet_03.Controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.通过请求对象向tomcat索要当前网站(myWeb)中的全局作用域对象
ServletContext servletContext = req.getServletContext();
//2.将数据添加到全局作用域对象中作为共享数据。
servletContext.setAttribute("key1",2);
servletContext.setAttribute("key2",3.14);
servletContext.setAttribute("key3",'a');
servletContext.setAttribute("key4","Hello,World!");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("OneServlet doPost is Run...");
}
}
package com.example.servlet_03.Controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过请求对象向tomcat索要当前网站(myWeb)中的全局作用域对象
ServletContext servletContext = request.getServletContext();
//2.从全局作用域对象得到指定关键字对应数据
Integer value1 = (Integer)servletContext.getAttribute("key1");
Double value2 = (Double) servletContext.getAttribute("key2");
Character value3 = (Character)servletContext.getAttribute("key3");
String value4 = (String)servletContext.getAttribute("key4");
System.out.println("整型:"+value1);
System.out.println("浮点型:"+value2);
System.out.println("字符型:"+value3);
System.out.println("字符串型:"+value4);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Cookie
如果俩个servlet来自同一个网站,并且为同一个浏览器/用户提供服务,
此时借助于Cookie对象进行数据共享
Cookie存放当前用户的私人数据,在共享数据过程中提供服务质量
在现实生活场景中,Cookie相当于用户在服务器端得到会员卡
原理:
用户通过浏览器第一次向myWeb网站发送请求申请OneServlet
OneServlet在运行期间创建一个Cookie存储与当前用户相关数据
OneServlet工作完毕后,将Cookie写入响应头中交还给当前浏览器
浏览器收到响应包后,将cookie存储在浏览器的缓存
一段时间之后,用户通过同一个浏览器再次向myWeb网站发送请求申请TwoServlet
浏览器需要无条件的将myWeb网站之前推送过来的Cookie,写入请求头中
网站订餐
package com.example.servlet_07.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用请求对象,读取请求头参数信息
String userName = request.getParameter("userName");
String money = request.getParameter("money");
//2.开卡
Cookie card1 = new Cookie("userName",userName);
Cookie card2 = new Cookie("money",money);
//3.发卡
response.addCookie(card1);
response.addCookie(card2);
//通知浏览器,将点餐页面写入响应
request.getRequestDispatcher("/index_2.html").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package com.example.servlet_07.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int jiaozi_money = 30;
int miantiao_money = 20;
int gaifan_money = 15;
String userName = null;
int money = 0;
//1.读取请求头参数信息
String food = request.getParameter("food");
//2.读取请求头中的cookie
Cookie cookieArray[] = request.getCookies();
for (Cookie cookie : cookieArray) {
String key = cookie.getName();
String value = cookie.getValue();
if("userName".equals(key)){
userName = value;
}else if("money".equals(key)){
money = Integer.valueOf(value);
}
}
System.out.println("用户名:"+userName);
System.out.println("余额:"+money);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}