HTTP是基于请求/响应的无状态的通信协议。

使服务器记得此次请求与之后请求关系的方式,叫做会话管理。

隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息。仅适用于一些简单的状态 管理,如在线问卷。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by N3verL4nd on 2017/2/21.
*/
@WebServlet("/questionnaire")
public class HiddenFieldServlet extends HttpServlet {
private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
//response.setHeader("Content-Type", "text/html; charset=UTF-8");
//response.addHeader("Content-Type", "text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(
"<!DOCTYPE html>"
+ "<html>"
+"<head>"
+"<title>问卷调查</title>"
+"</head>"
+"<body>"
);
String page = request.getParameter("page");
out.println("<form action='questionnaire' method='post'>");
if (page == null){
out.println("问题一:<input type='text' name='p1q1' /><br />");
out.println("问题二:<input type='text' name='p1q2' /><br />");
out.println("<input type='submit' name='page' value='下一页' />");
}else if ("下一页".equals(page)){
String p1q1 = request.getParameter("p1q1");
String p1q2 = request.getParameter("p1q2");
out.println("问题三:<input type='text' name='p2q1' />");
out.println("<input type='hidden' name='p1q1' value='" + p1q1 + "' />");
out.println("<input type='hidden' name='p1q2' value='" + p1q2 + "' />");
out.println("<input type='submit' name='page' value='完成' />");
}else if ("完成".equals(page)){
out.println(request.getParameter("p1q1") + "<br />");
out.println(request.getParameter("p1q2") + "<br />");
out.println(request.getParameter("p2q1") + "<br />");
}
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
}

cookie:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by N3verL4nd on 2017/2/23.
*/
@WebServlet(name = "SetServlet", urlPatterns = {"/setcookies.do"})
public class SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
for (int i = 0; i < 5; i++){
Cookie cookie = new Cookie(String.valueOf(i), "xiya");
response.addCookie(cookie);
} response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("设置cookies" + "<br />");
out.println("<a href='showcookies.do'>showcookies</a>");
out.close();
}
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by N3verL4nd on 2017/2/23.
*/
@WebServlet(name = "ShowServlet", urlPatterns = {"/showcookies.do"})
public class ShowServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>显示Cookies</title>");
out.println("</head>");
out.println("<body>");
out.println("<body>");
out.println("<table>");
out.println("<tr>");
out.println("<th>Cookie Name</th>");
out.println("<th>Cookie Value</th>");
out.println("</tr>");
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies){
String key = cookie.getName();
String value = cookie.getValue();
out.println("<tr>");
out.println("<td>" + key + "</td>");
out.println("<td>" + value + "</td>");
out.println("</tr>");
}
} out.println("</table>");
out.println("</body>");
out.println("</html>");
}
}

url重写:其实就是GET请求参数的应用,当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中包含参数信息。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by N3verL4nd on 2017/2/22.
*/
@WebServlet(name = "SearchServlet", urlPatterns = {"/search.do"})
public class SearchServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>调查</title>");
out.println("</head>");
out.println("<body>");
String start = request.getParameter("start");
if (start == null){
start = "1";
}
int count = Integer.parseInt(start);
int begin = 10 * count - 9;
int end = 10 * count; out.println("第 " + begin + " 到 " + end + " 搜索结果<br />");
out.println("<ul>");
for (int i = begin; i <= end; i++){
out.println("<li>搜索结果" + i + "</li>");
}
out.println("</ul>");
for (int i = 1; i < 10; i++){
if (i == count){
out.println(i);
continue;
}
out.println("<a href='search.do?start=" + i + "'>" + i + "</a>");
}
out.println("</body>");
out.println("</html>");
}
}

在Servlet/JSP中可以使用HttpSession来进行会话管理。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by N3verL4nd on 2017/2/22.
*/
@WebServlet(name = "SessionServlet", urlPatterns = {"/session.do"})
public class SessionServlet extends HttpServlet { private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(
"<!DOCTYPE html>"
+ "<html>"
+"<head>"
+"<title>问卷调查</title>"
+"</head>"
+"<body>"
);
String page = request.getParameter("page");
out.println("<form action='session.do' method='post'>");
if (page == null){
out.println("问题一:<input type='text' name='p1q1' /><br />");
out.println("问题二:<input type='text' name='p1q2' /><br />");
out.println("<input type='submit' name='page' value='下一页' />");
}else if ("下一页".equals(page)){
String p1q1 = request.getParameter("p1q1");
String p1q2 = request.getParameter("p1q2");
HttpSession session = request.getSession();
System.out.println(session.getId());
session.setAttribute("p1q1", p1q1);
session.setAttribute("p1q2", p1q2);
out.println("问题三:<input type='text' name='p2q1' /><br />");
out.println("<input type='submit' name='page' value='完成' />");
}else if ("完成".equals(page)){
String p2q1 = request.getParameter("p2q1");
HttpSession session = request.getSession();
System.out.println(session.getId());
session.setAttribute("p2q1", p2q1); out.println(session.getAttribute("p1q1") + "<br />");
out.println(session.getAttribute("p1q2") + "<br />");
out.println(session.getAttribute("p2q1") + "<br />");
}
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
}

如上所示,HttpSession是通过HttpServletRequest获得的,但是该实例存在于Web容器内。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date; /**
* Created by N3verL4nd on 2017/2/23.
*/
@WebServlet(name = "SessionInfoServlet", urlPatterns = {"/SessionInfoServlet"})
public class SessionInfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
HttpSession session = request.getSession();
//session.setMaxInactiveInterval(10);//多少秒失效
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>SessionInfoServlet</title>");
out.println("</head>");
out.println("<body>"); out.println("New Session:" + session.isNew() + "<br />");
out.println("Session ID:" + session.getId() + "<br />");
out.println("getCreationTime:" + new Date(session.getCreationTime()) + "<br />");
out.println("getLastAccessedTime:" + new Date(session.getLastAccessedTime()) + "<br />");
out.println("getRequestedSessionId:" + request.getRequestedSessionId() + "<br />");
out.println("isRequestedSessionIdFromURL:" + request.isRequestedSessionIdFromURL() + "<br />");
out.println("isRequestedSessionIdFromCookie:" + request.isRequestedSessionIdFromCookie() + "<br />");
out.println("isRequestedSessionIdValid:" + request.isRequestedSessionIdValid() + "<br />");
out.println("<br /><a href='" + response.encodeURL("SessionInfoServlet") + "'>刷新</a><br />");
}
}

对于以上程序,我们使用Fiddler抓包观察下:

第一次调用该Servlet会返回Set-Cookie,第二次调用我们会向HTTP服务器发送该cookie来获取Web容器内对应的HttpSession。

JSP&Servlet学习笔记----第4章的更多相关文章

  1. JSP&Servlet学习笔记----第3章

    Web容器是JSP/Servlet唯一认识的HTTP服务器. HTTP是基于请求/响应的无状态通信协议. 流程: 1.请求来到HTTP服务器 2.HTTP服务器将请求转交给Web容器 3.Web容器创 ...

  2. JSP&Servlet学习笔记----第6章

    JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...

  3. JSP&Servlet学习笔记----第5章

    Servlet进阶API 每个Servlet都必须由web容器读取Servlet设置信息(标注或者web.xml).初始化. 对于每个Servlet的设置信息,web容器会为其生成一个ServletC ...

  4. JSP&Servlet学习笔记----第1/2章

    HTML(HyperText Markup Language):超文本标记语言 HTTP(HyperText Transfer Protocol):超文本传输协议 URL(Uniform Resour ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. 【JSP&Servlet学习笔记】5.Servlet进阶AIP、过滤器与监听器

    Servlet接口上,与生命周期及请求服务相关的三个方法是init().service()与destory()方法.当Web容器加载Servlet类并实例化之后,会生成ServletConfig对象并 ...

  7. JSP Servlet学习笔记——使用fileupload上传文件

    关键代码如下: index.jsp <body> <center> <h3>文件上传</h3> <font color="red&quo ...

  8. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  9. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

随机推荐

  1. 一次 kafka 消息堆积问题排查

    收到某业务组的小伙伴发来的反馈,具体问题如下: 项目中某 kafka 消息组消费特别慢,有时候在 kafka-manager 控制台看到有些消费者已被踢出消费组. 从服务端日志看到如下信息: 该消费组 ...

  2. 使用tushare 库查阅交易日历

    资料参考:https://tushare.pro/ 交易日历 接口:trade_cal描述:获取各大交易所交易日历数据,默认提取的是上交所 tushare的版本和更新: 执行命令: pip insta ...

  3. kubernetes-dashboard部署

    参考资料: kubernetes官方文档 官方GitHub 创建访问用户 解决chrome无法访问dashboard 官方部署方法如下: kubectl apply -f https://raw.gi ...

  4. Celery 收下这捆芹菜!

    目录 Celery简介 Celery构成 Task Broker Worker Backend Celery使用 安装 基本使用 异步任务: delay 延迟任务: apply_async 周期任务: ...

  5. Thinkpad S440 I/O接口配置

    HDMI 视频接口 SS USB3.0接口 电源接口 音频接口 网络接口 没有com口可以用USB口,然后安装一个USB转com口的驱动.

  6. P2756 飞行员配对方案问题 二分图匹配 匈牙利算法

    题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...

  7. HttpClient工具类的使用

    package com.hourui.gmall.util; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; ...

  8. 类选择器练习:Google 案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. Scrapy定制命令开启爬虫

    一.单爬虫运行 每次运行scrapy都要在终端输入命令太麻烦了 在项目的目录下创建manager.py(任意名称) from scrapy.cmdline import execute if __na ...

  10. 字典 pop

    1.pop(key) 删除键值对,返回value2.若字典中没有这个key,则返回None,也可以自定义3.可用作if条件判断 来源: rest framework 框架 Serializer que ...