Servlet

自动生成web.xml中的welcome-file-list

<welcome-file-list><!-- 这个是欢迎页面 从上往下一个个找 从根目录上 -->
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

四大域对象

//四大域对象  page(页面有效)  request(请求有效) session(会话有效) application(所有的客户端访问同一个application有效) 
	//application包含很多session  session包含很多request request包含一到多个page
	//域对象依次增大 page<reqeust<session<application
	
// 	//pageContext内置对象 很少使用
// 	pageContext.getRequest()
// 	pageContext.getResponse()
// 	pageContext.getServletContext()//application
// 	pageContext.getSession()//httpSession
	
// 	pageContext.setAttribute("属性名", "属性值", "存放的域")

在jsp页面中设置utf-8编码格式

<% request.setCharacterEncoding("utf-8"); %>

jsp:include标签的使用

在页面开发中,有很多页面使用相同的头部和尾部格式,所以我们只需维护一份头部和尾部页面代码就可以了

<jsp:include page="head.jsp"></jsp:include>

<jsp:include page="footer.jsp"></jsp:include>

相对路径与绝对路径

<link rel="stylesheet" href="<%=request.getContextPath() %>/css/style.css" type="text/css">
<!--  本jsp路径 http://localhost:8080/web04/path.jsp
   相对路径  href="css/style.css"
   http://localhost:8080/web04/css/style.css  从与path同级的目录下寻找
   
   绝对路径  在css/style.css前再添加一个斜杠  如/css/style.css  是从根目录(http://localhost:8080)下寻找
 但是http://localhost:8080/css/style.css是找不到的  
 所以绝对路径是需要跟上项目名的 如http://localhost:8080/web04/css/style.css  
  但是一个问题是像绝对路径这样直接跟上项目名就写死了
  为了防止这样的情况我们可以使用  request.getContextPath();来获取地址
  <%=request.getContextPath() %>/css/style.css  这个才是正确的绝对路径书写方式 
    
  总结 :在客户端路径中我们一般使用绝对路径 虽然麻烦但是能找到
  如果使用相对路径的话  在WebContent/product/list.jsp文件访问WebContent文件下path.jsp文件时,
  虽然在list.jsp中这样写request.getRequestDispatcher("../path.jsp").forward(request, response);
  但是如果去掉../   此时的相对路径是http://localhost:8080/web04/product  
  在product下没有path.jsp  除此之外相对路径总会有几种情况导致无法找到合适的路径 
    -->

服务器端路径和客服端路径

<jsp:include page="/footer.jsp"></jsp:include>
<% //这个jsp:include是服务器端路径
	//相对路径  footer.jsp  绝对路径加个/就可以了 ,服务器端绝对路径不需要带项目名
	/*
	客户端绝对路径 http://localhost:8080/ 
	服务端绝对路径 http://localhost:8080/web04/   服务端绝对路径的话如果出错会直接提示报错
	*/
%>

客户端绝对路径针对的是域名的根目录,服务器端路径针对的是域名和项目名的根目录

单例模式

package web04;

public class JDBCUtil {
	public static JDBCUtil instance =new JDBCUtil();
	/*
	 * 单例模式  两个核心 
	 * 	1.构造方法私有化
	 * 	2.设置一个静态实例
	 */
	
	private JDBCUtil() {
		//把构造方法私有  在其他类中就不能再创建一个了  
		//防止我们忘记这是一个单例模式而又实例化一个新对象而导致代码增多和影响程序运行速度
	}
	public void GetConnection() {
		System.out.println("得到一个数据库连接");
	}
	
	public static void main(String[] args) {
		JDBCUtil.instance.GetConnection();
	}
}

mvc分层架构

在这里插入图片描述

JavaEE分层架构

在这里插入图片描述

Servlet与jsp的跳转

下面只展示一些关键的文件,dao,service,model,util用文字大致说明内容

login.jsp通过login来登录管理员和用户账号

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	if(request.getAttribute("msg")!=null){
		out.println(request.getAttribute("msg")+"<br/>");
	}
%>

登录
<form action="<%=request.getContextPath() %>/login_do" method="post">
用户名: <input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>

LoginServlet.java用来处理login_do(这里说明了jsp跳转到servlet中),此Servlet判断接收数据是否管理员数据,若是则重定向到下一个Servlet(Servlet是可以跳转到Servlet的,但是doPost和doGet要一一对应)

package com.sikiedu.controller;

import java.io.IOException;
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 com.sikiedu.model.User;
import com.sikiedu.service.UserService;


@WebServlet("/login_do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    @Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		UserService service=new UserService();
		User user=service.login(username, password);
		if(user!=null) {
			request.getSession().setAttribute("user", user);
			//TooD
			if(user.isAdmin()) {
//				request.getRequestDispatcher("/admin/goods_list").forward(request, response);
				response.sendRedirect(request.getContextPath()+"/admin/goods_list");//重定向不需要传输数据
				
			}else {
				request.getRequestDispatcher("/").forward(request, response);		
			}
		}else {
			request.setAttribute("msg", "<font color='red'>用户名或密码错误请重新登录</font>");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}
    
    }

}

GoodsListServlet.java此servlet接受login_do的doPost方式重定向,所以接受也应在doPost方法里。然后通过本servlet转发到admin/goods_list.jsp(把数据库的数据转发到jsp上)

package com.sikiedu.controller;

import java.io.IOException;
import java.util.List;

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 com.sikiedu.model.Goods;
import com.sikiedu.service.GoodsService;


@WebServlet("/admin/goods_list")
public class GoodsListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<Goods> list=new GoodsService().selectAllGoods();
		request.setAttribute("list", list);
		request.getRequestDispatcher("/admin/goods_list.jsp").forward(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);//login.jsp通过LoginServlet的doPost的管理员账号判断来跳转到"/admin/goods_list"(本servlet)
		//所以这里需要在doPost里面调用doGet方法处理LoginServlet的doPost请求
	}//post方式需要传递参数

}

admin/goods_list.jsp这个jsp页面接受来自admin/good_list的servlet的数据,并显示在页面上

<%@page import="com.sikiedu.model.Goods"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><!--  admin文件夹下放着登陆后的页面 -->

<style type="text/css">
*{
font-size:14px;
}
</style>
<h1>商品管理</h1>
<hr/>
<a href="">添加</a>
<table border="1" >
	<tr>
		<td>舰船名</td><td>类型</td><td>等级</td><td>操作</td>
	</tr>
	<%
		List<Goods> list=(List<Goods>)request.getAttribute("list");
		for(Goods goods:list){
			%>
	<tr>
		<td><%=goods.getName() %></td><td><%=goods.getType() %></td><td><%=goods.getLevel() %></td><td><%=goods.getInventory() %></td><td>删除 修改</td>
	</tr>
			
			<% 
		}
	%>
	
	
</table>
</body>
</html>

Jsp

el表达式

(从域对象中取数据,取数据的地方全部通过el表达式)

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="com.sikiedu.model.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
page request session application
<%//el表达式
request.setAttribute("name", "xuefeng");
session.setAttribute("games", "AZURLANE");
application.setAttribute("count", "100");
%>
<!-- <br/> -->
<%-- 角色名称:${requestScope.name} --%>
<%-- 游戏名称:${session.games} --%>
<!-- <br/> -->
<%-- xp:${application.count} --%>
<%
User u=new User("雪风","123",12,"女",false);
request.setAttribute("user", u);
%>
${user.username }<!-- 这俩个的效果是一样的 -->
${user.getUsername() }



<%//el表达式从map集合和对象里面取得数据
Map<String,String> map=new HashMap<String,String>();
map.put("name","雪风");
map.put("age","12");
request.setAttribute("map", map);
%>
${map.name }
${map.age }



<%  //el表达式从list集合取值和项目名取值
List<User> list=new ArrayList<User>();
list.add(new User("雪风","123",12,"女",false));
list.add(new User("天津风","123",12,"女",false));
list.add(new User("矶风","123",12,"女",false));
list.add(new User("岛风","123",12,"女",false));
list.add(new User("时津风","123",12,"女",false));
request.setAttribute("list", list);
%>
${list[2].username }

${90+90 }<!-- 180 -->
${90>80}
${empty list }<!--结果true    empty是判断对象在域中是否存在 -->
${pageContext.request.contextPath }<!-- 这个用来获取项目名 -->

</body>
</html>

jstl表达式

可以向域对象中存数据和输出数据但是很少用,主要用于循环

先加入jar包然后记着在jsp文件开头加入下面一段代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page import="java.util.ArrayList"%>
<%@page import="com.sikiedu.model.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- <%request.setAttribute("username", "xuefeng") %> 下面代码相当于这段--%>
<c:set var="username" value="xuefeng" scope="request"></c:set>
<!-- 用jstl存数据很少用 -->

${username }<!-- 相当于下面c:out代码  但是c:out很少这样用,相对本段代码麻烦 -->
<c:remove var="username"/>
<c:out value="${username }"></c:out> 

<!-- 条件语句 -->
<c:set var="age" value="12" scope="request"></c:set>
<c:if test="${age>18 }"><font color="green">成年了</font></c:if>

<c:choose>
	<c:when test="${age>18 }">成年人</c:when>
	<c:otherwise><font color="red">未成年</font></c:otherwise>
</c:choose>
<br/>

<!-- 循环标签 -->
<c:forEach var="i" begin="1" end="10">
${i }<!-- i 为索引 -->
AzurLane<br/>
</c:forEach>
<hr/>
<%  //el表达式从list集合取值和项目名取值
List<User> list=new ArrayList<User>();
list.add(new User("雪风","123",12,"女",false));
list.add(new User("天津风","123",12,"女",false));
list.add(new User("矶风","123",12,"女",false));
list.add(new User("岛风","123",12,"女",false));
list.add(new User("时津风","123",12,"女",false));
request.setAttribute("list", list);
%>
<c:forEach items="${list }" var="u">
${u.username}:${u.password }:${u.age }<br/>
</c:forEach>
</body>
</html>

JSON

序列化和反序列化

JsonTest.java,

package com.sikiedu.util;

import java.util.List;

import com.alibaba.fastjson.JSON;
import com.sikiedu.model.Goods;

public class JsonTest {
	
	public static void main(String[] args) {
		
		// 序列化 持久化
//		Goods goods = new Goods("香蕉","夏威夷香蕉",100,400);
//		String json = JSON.toJSONString(goods);
//		System.out.println(json);
		//反序列化  json解析
//		String s = "{\"des\":\"夏威夷香蕉\",\"inventory\":400,\"name\":\"香蕉\",\"price\":100}";
//		Goods goods = JSON.parseObject(s, Goods.class);
//		System.out.println(goods.getName());
//		System.out.println(goods.getDes());
//		System.out.println(goods.getPrice());
//		System.out.println(goods.getInventory());
		
		String s = "[{" + 
				"	\"name\":\"Midheal\"," + 
				"	\"age\":20," + 
				"	\"sex\":\"男\"" + 
				"}," + 
				"{" + 
				"	\"name\":\"Micsdfheal\"," + 
				"	\"age\":21," + 
				"	\"sex\":\"男\"" + 
				"}," + 
				"{" + 
				"	\"name\":\"Micsdfsdfeal\"," + 
				"	\"age\":22," + 
				"	\"sex\":\"男\"" + 
				"}" + 
				"]";
		List<UserTest> list = JSON.parseArray(s, UserTest.class);
		for(UserTest ut : list) {
			System.out.println(ut);
		}
	}
}

ajax

在本机上不知为何出现错误,一直没办法调试成功

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.3.1.min.js"></script>

<script type="text/javascript">


setInterval("callAjaxByjQuery()", 2000);
function callAjaxByjQuery() {
	$.ajax({
		url:encodeURI("${pageContext.request.contextPath }/ajaxrequest?data=我是客户端发送的数据"),
		type:"get",
		cache:false,
		success:function(msg){
			$("#msg").append(msg);
		}
	});
}
function callAjaxByJs(){
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("GET",encodeURI("${pageContext.request.contextPath }/ajaxrequest?data=我是客户端发送的数据&"+Math.random()),true);
	xmlhttp.send();
	xmlhttp.onreadystatechange = function(){
		if( xmlhttp.readyState==4 && xmlhttp.status==200 ){
			//得到了服务器端的响应
			$("#msg").append(xmlhttp.responseText);
			
		}
	}
}
//出现bug这两种发起请求的方式都用不成  
//报错Failed to load resource: the server responded with a status of 404 ()
</script>

</head>
<body>
登录
<form action="${pageContext.request.contextPath }/login_do" method="post">
用户名: <input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
<div id="msg"></div>
</body>
</html>

发起校验用户名的ajax请求

register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function(){
	$("input[name='username']").blur(verifyUsername);
});
function verifyUsername(){
// 	$("input[name='username']").val()
	$.ajax({
		url:encodeURI("${pageContext.request.contextPath }/verifyusername"),
		type:"post",
		data:{
			username:$("input[name='username']").val()
		},
		dataType:"json",
		success:function(msg){
// 			$("#msg").append(msg);
			if(msg.isSuccess){
				$("#msg").html("<font color='green'>用户名可以用!</font>");
			}else{
				$("#msg").html("<font color='red'>用户名重复!</font>");
			}
			
		}
	});
}
</script>

</head>
<body>


<%
// 	if(request.getAttribute("msg")!=null){
// 		out.println(request.getAttribute("msg")+"<br/>");
// 	}
%>
${msg}<br/>

	<form action="${pageContext.request.contextPath }/register_do" method="post">
	用户名:<input type="text"  name="username"/><br/>
	密码:<input type="password" name="password"/><br/>
	年龄:<input type="text" name="age"/><br/>
	性别:男<input type="radio" name="sex" value="男" checked="checked"/> 
	女<input type="radio" name="sex" value="女"/>
	<input type="submit" value="注册"/>
	</form>
</body>
</html>

VerifyUsernameServlet

package com.sikiedu.controller;

import java.io.IOException;
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 com.sikiedu.service.UserService;


@WebServlet("/verifyusername")
public class VerifyUsernameServlet extends HttpServlet {
	


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("VerifyUsernameServlet");
		String username=request.getParameter("username");
		UserService service=new UserService();
		boolean isExist=service.isExist(username);
		response.getWriter().append("{\"isSuccess\":"+!isExist+"}");
	}

}

UserService

package com.sikiedu.service;

import com.sikiedu.dao.UserDao;
import com.sikiedu.model.User;

public class UserService {
	public boolean register(String username,String password,int age,String sex) {
		UserDao userDao=new UserDao();
		boolean isExist=userDao.isExist(username);
		if(isExist) { 
			return false;
		}else {
			userDao.addUser(username, password, age, sex);
			return true;
		}
	}
	
	public User login(String username,String password) {
		return new UserDao().getUserByUP(username, password);
	}
	
	public boolean isExist(String username) {
		return new UserDao().isExist(username);
	}
}

UserDao

package com.sikiedu.dao;

import com.sikiedu.util.DBUtil;
import com.sikiedu.model.*;

public class UserDao {
	public boolean isExist(String username) {
		return DBUtil.userMap.containsKey(username);
	}
	
	public boolean addUser(String username,String password,int age,String sex) {
		if(isExist(username)) return false;
		User u=new User(username,password,age,sex,false);
		DBUtil.userMap.put(u.getUsername(), u);
		return true;
		
	}
	
	public User getUserByUP(String username,String password) {
		if(isExist(username)==false) return null;//

		User u=DBUtil.userMap.get(username);
		if(u.getPassword().equals(password)) return u;//���벻��ȷ
		else return null;
	}
}

Filter

在web.xml中的filter顺序即为调用filter的顺序,filter中的chain.doFilter()方法是调用下一个filter

在这里插入图片描述

通过配置文件配置编码格式

<filter>
    <filter-name>EncodeFilter</filter-name>
    <filter-class>com.sikiedu.filter.EncodeFilter</filter-class>
    <init-param>
      <param-name>Encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
 <filter>
    <filter-name>AdminFilter</filter-name>
    <filter-class>com.sikiedu.filter.AdminFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AdminFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
  </filter-mapping>
 <filter>
    <filter-name>DispatcherFilter</filter-name>
    <filter-class>com.sikiedu.filter.DispatcherFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DispatcherFilter</filter-name>
    <url-pattern>/dispatcher1.jsp</url-pattern>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>

权限管理的过滤器

package com.sikiedu.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sikiedu.model.User;

public class AdminFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest httpReq = (HttpServletRequest) req;
		HttpServletResponse httpResp = (HttpServletResponse) resp;
		Object o = httpReq.getSession().getAttribute("user");
		if(o==null) {
			httpResp.sendRedirect(httpReq.getContextPath()+"/index.jsp");
		}else {
			User u = (User) o;
			if(u.isAdmin()) {
				chain.doFilter(req, resp);//放行
			}else {
				httpResp.sendRedirect(httpReq.getContextPath()+"/index.jsp");
			}
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

设置过滤的请求的类型

<filter>
    <filter-name>DispatcherFilter</filter-name>
    <filter-class>com.sikiedu.filter.DispatcherFilter</filter-class>
  </filter>
<filter-mapping>
    <filter-name>DispatcherFilter</filter-name>
    <url-pattern>/dispatcher1.jsp</url-pattern>
    <dispatcher>ERROR</dispatcher>  
    <!--  四种类型  REQUEST(请求) INCLUDE(包含) FORWARD(转发) ERROR(错误)  设置什么类型的参数就只能跳转此类型的页面-->
  </filter-mapping>
  <error-page>
    <error-code>404</error-code>
    <location>/dispatcher1.jsp</location>
  </error-page>

监听器

用来监听request session和 application的创建和销毁以及里面的属性
request ->HttpServletRequest

session -> HttpSession

application -> ServletContext

应用

统计在线人数 web应用启动起来的时候做一些初始化的工作

监听器实现的接口

监听对象创建和销毁需要实现的接口

javax.servlet.ServletContextListener
HttpSessionListener
ServletRequestListener

监听属性创建、替换和移除需要实现的接口

ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

配置

	<listener>
	  <listener-class></listener-class> 
	  </listener>

​ 或者注解方式
​ @WebListener

多个监听器的执行顺序

init按照配置的顺序
销毁的时候相反

session销毁时间配置

 <session-config>
  <session-timeout>1</session-timeout>
  </session-config>

HttpSessionBindListener

监听某个对象被添加到session里面或者被移除
session.setAttribute(“user”,user);
session.removeAttribute(“user”);

单点登录

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import com.sikiedu.model.User;
import com.sikiedu.util.SessionManager;

/**
 * Application Lifecycle Listener implementation class SessionAttributeListener
 *
 */
@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener {

    /**
     * Default constructor. 
     */
    public SessionAttributeListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
     */
    public void attributeAdded(HttpSessionBindingEvent arg0)  {
    	if(arg0.getName().equals("user")) {
    		User u = (User) arg0.getValue();
    		//判断是否有其他客户端已经登录
    		if(SessionManager.sessionMap.containsKey(u.getUsername())) {
    			//获得另外一个客户端的session
    			HttpSession session = SessionManager.sessionMap.get(u.getUsername());
    			//把登录信息从这个客户端抹除
    			session.removeAttribute("user");
    			//从session集合里面移除对应的用户名
    			SessionManager.sessionMap.remove(u.getUsername());
    		}
    		
    		SessionManager.sessionMap.put(u.getUsername(), arg0.getSession());
    	}
    }

	/**
     * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
     */
    public void attributeRemoved(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    	System.out.println("attributeRemoved");
    }

	/**
     * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
     */
    public void attributeReplaced(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    	System.out.println("sessionattributeReplaced");
    }
	
}
	//获得另外一个客户端的session
    			HttpSession session = SessionManager.sessionMap.get(u.getUsername());
    			//把登录信息从这个客户端抹除
    			session.removeAttribute("user");
    			//从session集合里面移除对应的用户名
    			SessionManager.sessionMap.remove(u.getUsername());
    		}
    		
    		SessionManager.sessionMap.put(u.getUsername(), arg0.getSession());
    	}
    }

	/**
     * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
     */
    public void attributeRemoved(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    	System.out.println("attributeRemoved");
    }

	/**
     * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
     */
    public void attributeReplaced(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    	System.out.println("sessionattributeReplaced");
    	}
    }
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐