HttpSession对象的详解与实战操作

关于HttpSession耗用内存和有效地销毁HttpSession对象的问题 HttpSession对象很有用,但它们耗用的内存也委多, 因此当你不在需要用到某个HttpSession对象的时候,你应该尽早调用它的invalidate方法来销毁它。在这里大部分网站会向用户入境问俗一个用来退出登录的链接,但可惜的是点击这个链接的用户没有几个,大部分用户会直接关闭浏览器。等待HttpSession对象自然死亡意味着放任它们继续占用你宝贵的内存。下面说说在struts应用程序中如 阅读详情

HttpSession对象:


     HttpSession是当一个用户第一次访问某个网站通过HttoServletRequest中调用getSession方法创建的

     

  1.    getSession有俩个重载方法:

           getSession()

           getSession(boolean create)

getSession(false) 方法返回当前的HttpSession ,若没有,则返回null

getSession(true)方法返回当前的HttpSession,若没有,则创建一个并返回,getSession(true)与getSession()方法一致

  

2.

HttpSession的setAttribute方法将一个值放在HttpSession对象里

  void setAttribute(String name,Object value)

 注意:与网址重写,隐藏域不同,放在HttpSession中的值是保存在内存中的。会影响性能

 

value可以为任意java对象,只要他的类实现了java.io.Serializable接口即可,保存的对象可以序列化成一个文件保存到数据库中


 getAttribute方法可以用于获取属性

Object getAttribute(name)

getAttrubuteNames(),他返回一个Enumeration,迭代HttpSession对象的所有属性

3

通过HttpSession中调用getId方法,可以获取HttpSession的标识符

String getId()

4

在默认情况下,HttpSession对象是在用户静默一段时间之后过期,setMaxInactiveInterval方法可以为个别HttpSession对象的Session设置一个期限

void setMaxInactiveInterval(int seconds)

如果这个方法传入0,则改HttpSession将永远不会过期,直到应用程序卸载或者Servlet容器关闭为止



下面举个例子,这个类实现了一个小型的在线商城,里面有四种商品。它允许用户将商品添加到购物车中,并浏览其内容


//下面为产品类

package appShop;

public class Product {
	private int id;//产品id
	private String name;//产品名称
	private String description;//产品描述
	private float price;//产品价格
	public Product(int id,String name,String description,float price){
		this.setId(id);
		this.setName(name);
		this.setDescription(description);
		this.setPrice(price);
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}

}
//下面为商城购物车类
package appShop;

public class ShoppingItem {
	private Product product;
	private int quantity;
	
	public ShoppingItem(Product product,int quantity){
		this.setProduct(product);
		this.setQuantity(quantity);
	}

	public Product getProduct() {
		return product;
	}

	public void setProduct(Product product) {
		this.product = product;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

}

//下面为主类

package appShop;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

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;
@WebServlet(name="ShoppingCartServlet",urlPatterns={"/products","/viewProductDetails","/addToCart","/viewCart"})
public class ShoppingCartServlet extends HttpServlet {
	private static final long serialVersionUID=-20L;
	private static final String CART_ATTRIBUTE="cart";
	
	private List<Product> products=new ArrayList<Product>();
	private NumberFormat currencyFormat=NumberFormat.getCurrencyInstance(Locale.US);
	//初始化四种产品包括其细节
	@Override
	public void init() throws ServletException {
		products.add(new Product(1,"TV","LOW-cost from China",159.95F));
		products.add(new Product(2,"Player","High quality stylish player",99.95F));
		products.add(new Product(3,"System","5 speaker hifi system with ipod",129.95F));
		products.add(new Product(4,"iPod player","can paly multiple formats",39.95F));
	}
        //URL都要调用doGet方法,依据URL的后缀启动不同方法,产生不同页面
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String uri=req.getRequestURI();
		if(uri.endsWith("/products")){
			sendProductList(resp);
		}else if(uri.endsWith("/viewProductDetails")){
			sendProductDetails(req,resp);
		}else if(uri.endsWith("/viewCart")){
			showCart(req,resp);
		}
		
	}
	
	//当点击buy时,则获取其请求,将产品及其数量放入购物车
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		int quantity=0;
		int productId=0;
		try{
			productId=Integer.parseInt(req.getParameter("id"));
			quantity=Integer.parseInt(req.getParameter("quantity"));
		}catch(NumberFormatException e){}
		
		
		Product product=getProduct(productId);
		if(product!=null&&quantity>0){
			ShoppingItem shoppingItem=new ShoppingItem(product, quantity);
			HttpSession session=req.getSession();
			List<ShoppingItem> cart=(List<ShoppingItem>) session.getAttribute(CART_ATTRIBUTE);
			if(cart==null){
				cart=new ArrayList<ShoppingItem>();
				session.setAttribute(CART_ATTRIBUTE, cart);
			}
			cart.add(shoppingItem);
		}
		//若产品为空,则启动产品列表
		sendProductList(resp);
	}
        //发送产品的列表
	private void sendProductList(HttpServletResponse response) throws IOException{
		response.setContentType("text/html");
		PrintWriter write=response.getWriter();
		write.println("<html><head><title>Products</title>"+
		"</head><body><h2>Products</h2>");
		write.println("<ul>");
		//列出product列表
		for(Product product:products){
			write.println("<li>"+product.getName()+"("+currencyFormat.format(product.getPrice())
					+") ("+"<a href='viewProductDetails?id="+product.getId()+"'>Details</a>)");
		}
		write.println("</ul>");
		write.println("<a href='viewCart'>View Cart</a>");
		write.println("</body></html>");
				
	}
	private Product getProduct(int productId) {
		for(Product product:products){
			if(product.getId()==productId){
				return product;
			}
		}
		return null;
	}
        //发送产品描述
	private void sendProductDetails(HttpServletRequest req,
			HttpServletResponse resp) throws IOException {
		resp.setContentType("text/html");
		PrintWriter write=resp.getWriter();
		int productId=0;
		try{
			productId=Integer.parseInt(req.getParameter("id"));
			
		}catch(NumberFormatException e){}
		
		Product product =getProduct(productId);
		
		if(product!=null){
			write.println("<html><head>"
					+"<title>Product Details</title></head>"
					+"<body><h2>Product Details</h2>"
					+"<form method='post' action='addToCart'>");
			write.println("<input type='hidden' name='id' "
					+"value=' "+productId+" '/>");
			write.println("<table>");
			write.println("<tr><td>Name:</td><td>"
					+product.getName()+"</td></tr>");
			write.println("<tr><td>Description:</td><td>"
					+product.getDescription()+"</td></tr>");
			write.println("<tr>"+"<tr>"
					+"<td><input name='quantity' ></td>"
					+"<td><input type='submit' value='buy'></td>"
					+"</tr>");
			write.println("<tr><td colspan='2'>"
					+"<a href='products'>Product List</a>"
					+"</td></tr>");
			write.println("</table>");
			write.println("</form></body>");
			
		}else{
			write.println("No product found");
		}
		
		
		
	}
       //展示购物车
	private void showCart(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	     resp.setContentType("text/html");
	     PrintWriter writer=resp.getWriter();
	     writer.println("<html><head><title>Shopping Cart</title></head>");
	     writer.println("<body><a href='products'>Product List</a>");
	     HttpSession session=req.getSession();
	     List<ShoppingItem> cart=(List<ShoppingItem>) 
	    		 session.getAttribute(CART_ATTRIBUTE);
	     if(cart!=null){
	    	 writer.println("<table>");
	    	 writer.println("<tr>"
	    	 		 +"<td style='width:150px'>Quantity</td>"
	    			 +"<td style='width:150px'>Product</td> "
	    			 +"<td style='width:150px'>Price</td>"
	    			 +"<td>Amount</td></tr>");
	    	 double total=0.0;
	    	 for(ShoppingItem shoppingItem:cart){
	    		 Product product=shoppingItem.getProduct();
	    		 int quantity=shoppingItem.getQuantity();
	    		 if(quantity!=0){
	    			 float price=product.getPrice();
	    			 writer.println("<tr>"
	    					 +"<td>"+quantity+"</td>"
	    					 +"<td>"+product.getName()+"</td>"
	    					 +"<td>"+currencyFormat.format(price)+"</td>");
	    			 double subtotal=price*quantity;
	    			 writer.println("<td>"+currencyFormat.format(subtotal));
	    			 total+=subtotal;
	    			 writer.println("</tr>");
	    		 }
	    	 }
	    	 writer.println("<tr><td colspan='4'>"
	    			 +"style='text-align:right'>"
	    			 +"Total:"
	    			 +currencyFormat.format(total)
	    			 +"</td></tr>");
	    	 writer.println("</table>");
	    	 
	     }
		writer.println("</table></body></html>");
	}
	
	

}

下面URL时调用应用程序的主页面:

http://localhost:8080/appShop/products     (appShop为web项目名称)



XS5018A TX ISP芯片同轴高清模拟输出图像处理芯片用户指南 当看门狗开启且系统异常,看门狗模块得不到喂狗信号时,自动产生看门狗复位信号,复位​​​​​​​。分量上与人眼对光谱的响应通常是有偏差的,通常通过一个色彩校正矩阵校正光谱响应的交叉效。但实际上由于电路的作用,复位模块对整个芯片及各个功能模块的复位进行统一管理,负责产生各个模块的软复位信。每个区域前景色可以在 16 个色表中查找,单个区域的前景色统一,各个区域的前。较弱的坏点被放大成刺眼的白点和明显的黑点,强烈推荐开启动态坏点校正功能。四种制式,通过寄存器配置,可以很方便的实现四种制式的切换、且可以对截止。 阅读详情

相关推荐

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 859

session.setAttribute用法详解

是Java Servlet中用于在HTTP会话中存储数据的方法。通过这个方法,我们可以将数据以键值对的形式存储在用户的会话中,实现不同页面之间的数据传递和状态保持。

技术研究中心 3591

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3288

HttpSession详解

HttpSession 服务端的技术 服务器会为每一个用户 创建一个独立的HttpSession HttpSession原理 当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session 并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中 当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问 服务器会根据这个SessionID去查看是否有对应的Session对象 有就拿出来使用;没有就创建

李鲤驴的博客 3700

DC算法竞赛——北京PM2.5浓度回归分析

北京PM2.5浓度回归分析 比赛结果(118/1150) 一. 概述 1、项目来源:https://www.dcjingsai.com/static_page/cmpList.html 2、给定数据字段如下: 3、使用方法:回归算法 4、目的:预测北京pm2.5值,使平均预测误差越小越好。 二、分析过程 setwd("E:/R数据源") #读入数据 data <- read.csv('p...

玻璃球的博客 3475

SMETANA 安装使用教程

关于SMETANA的安装和简单使用信息

qq_44940977的博客 1169

HttpSession的创建及使用

本文将介绍有关HttpSession的创建及使用,并概括性讲解了其与Cookie的区别,具体想了解其中区别请看上一篇文章

阿土不土的博客 2809

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3720

HttpSession的创建

问题一、session在何时被创建       问过很多人,大家对session创建的时机有一个常见的误解就认为session在有客户端访问时就被创建,但想了好久也没有想明白既然request.getSession(false)是在没有session的时候返回null,但既然一旦浏览器访问了应用就创建session,则request.getSession(false)就永远不会返回null,

每天进步一点点 1万+

从仿真曲线到电路状态:用Cadence Virtuoso深度剖析CS放大器各个工作区(以电流源负载为例)

本文通过Cadence Virtuoso平台,深入剖析电流源负载CS放大器在不同工作区的表现,从仿真曲线解读电路状态。详细介绍了如何通过Vout-Vin直流扫描曲线判断MOS管工作区域(截止区、饱和区、线性区),并验证理论与仿真的一致性,提升模拟IC设计调试效率。

weixin_30940783的博客 442

【数字IC刷题】华为海思数字IC笔试题(3)详细解析版

【数字IC刷题】华为海思数字IC笔试题(3)详细解析版

MoorePlus的博客 2370

session(参数传递)

1. 传统方法HttpServletSession2. HttpSession 直接放置在参数上。

weixin_73882343的博客 1117

RK3568平台开发系列讲解(DMA篇)DMA engine使用

DMA传输属于异步传输,在启动传输之前,slave driver需要将此次传输的一些信息(例如src/dst的buffer、传输的方向等)提交给dma engine(本质上是dma controller driver),dma engine确认okay后,返回一个描述符(由struct dma_async_tx_descriptor抽象)。DMA_PREP_PQ_DISABLE_P、DMA_PREP_PQ_DISABLE_Q、DMA_PREP_CONTINUE,PQ有关的操作,TODO。

内核笔记 1723

HttpSession详解(简称session)

session概述 Session表示会话,不止是在javaweb中存在,只要是web开发,都有会话这种机制。 在java中会话对应的类型是:javax.servlet.http.HttpSession,简称session/会话 在java web中session是一个存储在WEB服务器端的java对象,该对象代表用户和WEB服务器的一次会话。 那什么才叫一次会话呢? 一般多数情况下,是这样描述的:用户打开浏览器,在浏览器上进行一些操作,然后将浏览器关闭,表示一次会话结束。 本质上的描述:从sess

hcz666的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HttpSession对象

HttpSession对象 1、Session 的作用 Session 的作用就是为了标识一次会话,或者说确认一个用户; 并且在一次会话(一个用户的多次请求)期间共享数据。 可以通过 req.getSession()方法,来获取当前会话的 session 对象。 2、JSESSIONID SessionId 是为了标识一次会话的唯一标志。 每当一次请求到达...

ZHYTHT的博客 703

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Servlet技术之Cookie对象与HttpSession对象

在博客应用程序中,用户的登录状态、偏好设置等信息需要在多个页面之间进行传递和共享。在 Servlet 技术中,我们可以使用 Cookie 对象和 HttpSession 对象来实现这一目标。Cookie 对象是一种在客户端存储少量数据的机制,它将数据以键值对的形式存储在用户的浏览器中。通过设置和获取 Cookie 对象,我们可以在客户端和服务器之间传递一些简单的状态信息。

liubopro666的博客 1542

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

HttpSession对象详解

HttpSession 对象是 javax . servlet . http . HttpSession 的实例,该接口并不像HttpServletRequest 或HttpServletResponse 还存在一个父接口,该接口只是一个纯粹的接口。这因为 session 本身就属于 HTTP 协议的范畴。对于服务器而言,每一个连接到它的客户端都是一个 session , servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。

weixin_67630324的博客 2284

内置对象session与httpSession对象是同一 个东西么?

内置对象session与httpSession对象是同一 个东西么? session和HttpSession是不同的概念。 session: HttpSession:

m0_51073424的博客 536

Cookie 和 Session(HttpSession) 对象详解

前言 ------- 每天都忙忙碌碌,感觉自己过得很充实很有意义,加油!加班终于完成! Cookie对象 cookie饼干的意思,其实是一份小数据,是服务器发送给客户端,并保存在客户端的一份小数据,cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。 为什么使用Cookie 因为http请求是无状态的,当客户端第一次访问服务器的时候,服务器处理完之后响应给...

weixin_44142032的博客 1222

内置对象session与httpSession对象

一、内置对象session (1)概念 Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。 (2)Session对象 session对象是一个JSP内置对象。 session对象在第一个JSP页面被装载时自动创建,完成会话期管理。 从一个客户打

cjf2544518628的博客 485

HttpSession对象的详解与实战

HttpSession对象:      HttpSession是当一个用户第一次访问某个网站通过HttoServletRequest中调用getSession方法创建的         1.    getSession有俩个重载方法:            getSession()            getSession(boolean create)

eeeeee123456fdsafds的博客 544

Spring MVC中HttpSession的详解

本文深入探讨了HttpSession在Spring MVC中的应用与管理。文章首先介绍了HttpSession的核心概念,包括其与Cookie的协同机制和典型应用场景(用户登录、购物车等)。随后详细解析了Spring MVC中的Session管理方式,包括原生操作、Spring Security集成和Flash属性原理。在源码层面,分析了DispatcherServlet处理流程、HandlerAdapter与Session的交互机制。针对分布式环境,提出了Session共享方案

持续输出Java相关知识 1516

HTTPSession对象知识总结

HTTPSession对象 HTTPSession对象的特点; 1.HTTPSession对象是保存在服务器端的; 2.HTTPSession允许存储任何数据类型; 3.HTTPSession存储数据大小无限制; 4.HTTPSession对象存储数据结构为key:value HTTPSession对象的使用 创建HTTPSession对象; 在HttpSession对象的创建是通过request.getSession();方法创建的,这个方法会判断请求中是否有sessionID,如果有则返

葵花田 636

内置对象session与httpSession

内置对象session与httpSession是一个东西吗? 文章目录内置对象session与httpSession是一个东西吗?一、内置对象session1.概念2.Session对象的ID3.Session对象的常用方法二、httpSession1.概念2.原理3.httpSession生命周期 一、内置对象session 1.概念 Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结

w_1106的博客 386
上一篇: java中栈的应用-带括号的算术表达式
下一篇: JSP详解与实例
oldbig_lin
博客等级 码龄10年 78粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值