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. 编辑软件->"Notepad++"

    编辑软件->"Notepad++" Notepad++是什么? Notepad++功能比 Windows 中的Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文 ...

  2. Python for Data Analysis 学习心得(二) - pandas介绍

    一.pandas介绍 本篇程序上篇内容,在numpy下面继续介绍pandas,本书的作者是pandas的作者之一.pandas是非常好用的数据预处理工具,pandas下面有两个数据结构,分别为Seri ...

  3. Excel获取当前日期和时间

    在Excel中获取当前时间 1.第一种在空的单元格内输入函数“NOW()”回车即可获取当前时间如图 2.第二种选中空单元格“按住CTRL+:”回车即可获取当前时间 3.第一种在空的单元格内输入函数“t ...

  4. Serv_U FTP服务端使用教程

    Serv-U FTP Server是一种被广泛运用的FTP服务器端软件,可以设定多个FTP服务器.限定登录用户的权限.登录主目录及空间大小等,功能非常完备.具有非常完备的安全特性,支持SSl FTP传 ...

  5. C# 中 ConfigureAwait 相关答疑FAQ

    C# 中 ConfigureAwait 相关答疑FAQ 在前段时间经常看到园子里有一些文章讨论到 ConfigureAwait,刚好今天在微软官方博客看到了 Stephen Toub 前不久的一篇答疑 ...

  6. 区间dp - 不连续的回文串

    Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon, they plann ...

  7. CAS是什么

    CAS是什么? 比较并交换 例子1: public class ABADemo1 { public static void main(String[] args) { AtomicInteger at ...

  8. crawler碎碎念4 关于python requests、Beautiful Soup库、SQLlite的基本操作

    Requests import requests from PIL import Image from io improt BytesTO import jason url = "..... ...

  9. python 进程管道

    数据不安全,不常用 import time from multiprocessing import Pipe, Process def producer(prod, cons, name, food) ...

  10. Linux下搭建Jmeter+Ant+Jenkins自动化测试框架

    前言 在之前的文章中,我们学习了通过Ant调用Jmeter脚本生成HTML测试报告,但未实现自动执行脚本生成报告,同时生成的报告是在Linux下,查看报告很不方便.因此,我们将结合Jenkins来进一 ...