JavaWeb进阶笔记
Servlet自动生成web.xml中的welcome-file-list<welcome-file-list><!-- 这个是欢迎页面 从上往下一个个找 从根目录上 --><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file>
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");
}
}
更多推荐
所有评论(0)