JSP九大内置对象及其使用教程

第十章 JSP简介

1. Session

//拿取专门用来封装权限信息的第三范围

HttpSession(中文翻译:会话)

Servlet中两种会话跟踪机制之一,另外一种是Cookie

HttpSession被翻译为会话,用来表示与用户交互的一段时间,HttpSession通过request.getSession()来创建,可以封装权限信息.用来证明用户的身份,从而避免不必要的一些身份验证工作

request.getSession()可以创建一个新的session或者在当前存在session的前提下,直接拿取已经存在的session

默认情况下用户与服务器交互,只可能存在一个session

创建session之后可以在session中封装信息,这个信息只要能证明用户的身份 资格等就统称为权限信息

session被创建之后默认最大不活动周期为1800s,在1800s以内用户封装的权限信息可以在不同的Servlet中拿取

通过

session.setAttribute(String,Object) 来封装信息

通过

session.getAttribute(String),来拿取信息

支持中文
创建之后从1800s开始倒计时,如果没有请求提交,则倒计时一直在消耗,倒计时结束,session销毁
内部的信息无法拿取
当用户再次提交请求时,倒计时重置。所以理论上用户如果一直在操作,则session一直存在

如果用户关闭浏览器,或者调用session.invalidate()则session立刻销毁

范围对象解释
第一范围PageContext一般不用来传递值,跳转立刻失效,通过技术手段
可以使第一范围读取其它范围得值
第二范围HttpServletRequest一般用来进行一次性的值的传递,A~~》B一锤子买卖,用来封装时效性数据,比如从数据库中查询的批量数据,如果跳转为重定向,则立刻失效,应为重定向不是同一次请求,无法取出
第三范围HttpSession一般用来封装权限信息,不局限任何跳转方式,只要在session没销毁前就可以, 一直读取或者封装.
第四范围ServletContext一般用来封装共享信息,全文只有一份,只要tomcat不关闭,永远有效

造成session失效的三种状况

  1. 超过最大不活动周期 默认1800s可以更改,存在40s左右的误差
  2. session.invalidate()立刻销毁
  3. 关闭浏览器

2. jsp指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jMKDZEuq-1594441116057)(D:\Study\Yitu\前端\Jsp\JspDaysOfficial\JspDay1\attachment\JSP语法图.jpg)]

1. include指令

使用include指令元素引入一个外部页面到本页,本页称之为主页
而引入的页面称之为辅页
file:表示引入页面的路径
注意 主页引入辅页,但是辅页不能再去引入主页,会导致无穷死循环

<%@ include file="data2.jsp"%>

2.page指令

  • page 指令元素共有12中写法,有血必须书写,又是否书写不重要
序号标签作用
1language当前页面的语言类型,默认java
2contentType页面软编码的一部分,在指令元素外书写request.setCharacterEncoding(“编码”)可以补全软编码
3pageEncoding设置页面的转换编码,jsp~~》servlet,注意默认是iso-8859-1不能书写任何中文,保存报错,要更改为utf-8或者gbk
4import表示本页面导包,多个包用逗号隔开,注意最精简不要少于三级包
5session当前页面是否支持session会话跟踪机制,默认支持,底层存在pageContext.getSession()源码,当我们打开jsp页面时session自动创建,这与html不同,html不会自动创建session
6info用来设置页面的一段信息,嵌套在页面中,一般是作者的签名等,通过getServletInfo()可以取出
7buffer当前页面的缓存,多大的文件保存在本地,默认8kb
8autoFlush可以设置当前页面自动刷新
9isELIgnored是否忽略EL表达式,不忽略
10errorPage当前页面如果出现异常自动跳转到哪个页面
11isErrorPage当前页面是否可以直接使用exception内置对象,默认不可以
12isThreadSafe当前线程是否安全,注意默认是true,单实例多线程,不安全!!

3.jsp九个内置对象

1. request对象

  • 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例

    序号方法说明
    1object getAttribute(String name)返回指定属性的属性值
    2Enumeration getAttributeNames()返回所有可用属性名的枚举
    3String getCharacterEncoding()返回字符编码方式
    4int getContentLength()返回请求体的长度(以字节数)
    5String getContentType()得到请求体的MIME类型
    6ServletInputStream getInputStream()得到请求体中一行的二进制流
    7String getParameter(String name)返回name指定参数的参数值
    8Enumeration getParameterNames()返回可用参数名的枚举
    9String[] getParameterValues(String name)返回包含参数name的所有值的数组
    10String getProtocol()返回请求用的协议类型及版本号
    11String getScheme()返回请求用的计划名,如:http.https及ftp等
    12String getServerName()返回接受请求的服务器主机名
    13int getServerPort()返回服务器接受此请求所用的端口号
    14BufferedReader getReader()返回解码过了的请求体
    15String getRemoteAddr()返回发送此请求的客户端IP地址
    16String getRemoteHost()返回发送此请求的客户端主机名
    17void setAttribute(String key,Object obj)设置属性的属性值
    18String getRealPath(String path)返回一虚拟路径的真实路径
    19String getContextPath()拿取/工程名

4.EL表达式

1.基本运算

${"3+2"}=${3+2} // 3+2=5
${3>2}   		//true
${3>2 ? true:false} //true

2.范围取值

EL表达式的四范围为pageScope,requestScope,sessionScope,applicationScope,当没有一样的键的时候,范围可以省略,当省略时,有多个范围的,省略范围的取值拿取现存范围中范围最小的。

 <%
    pageContext.setAttribute("elena", "elenaPage");
    request.setAttribute("elena", "elenaRequest");
    session.setAttribute("elena","elenaSession");
    application.setAttribute("elena", "elenaApplication");
%>
<!--java代码-->
<%=pageContext.getAttribute("elena") %>
<%=request.getAttribute("elena") %>
<%=session.getAttribute("elena") %>
<%=application.getAttribute("elena") %>
<br />
<!--El表达式-->
${pageScope.elena }  <br />
${requestScope.elena }  <br />
${sessionScope.elena }  <br />
${applicationScope.elena }
${elena}   //page

3. 判断是否为空

是空返回true,不是返回false

${empty sessionScope.zhangsan}

4. 接收值

  1. 接收链接或者表单传递过来的值

    接收值(java):<%=request.getParameter("etoak") %>
    <br />
    <!--param必须写-->
    接收值(el表达式):${param.etoak}
    
  2. 从web.xml中取值

    <h3>从web.xml取值</h3>
    java取值:<%=application.getInitParameter("罗永浩") %> <br />
    El:${initParam.罗永浩 }
    

5. 拿取自定义数据类型的值

可以省略范围直接通过 key.value来取值,有点类似 js

public class Game{
    private Integer id;
    private String name;
    private Integer price;
    private String seller;
    //全参构造器和getset方法
}
<%
	Game game = new Game(1,"动物之森",500,"任天堂");
	request.setAttribute("mygame", game);
 	//这里不能使用重定向,否则范围失效
	request.getRequestDispatcher("show4.jsp").forward(request, response);
	
%>
<h3>拿取自定义数据类型中的属性值</h3>
		使用java:
		游戏ID<%=((Game)request.getAttribute("mygame")).getId() %>
		游戏名<%=((Game)request.getAttribute("mygame")).getName() %>
		游戏售价<%=((Game)request.getAttribute("mygame")).getPrice() %>
		发行商<%=((Game)request.getAttribute("mygame")).getSeller() %>
		<hr />
		
		游戏ID:${requestScope.mygame.id }
		游戏名:${requestScope.mygame.name}
		售价:${mygame.price }
		发行商:${mygame.seller}

6. EL注意点

<% int i = 3%>
java:<%=i%>   //3
EL:${i}   //什么都不显示
EL是通过键来拿取值的,上边的i是值,想要拿取到i
需要添加范围随便写
request.setAttribute("i",i);

5. JSTl

  • 全称Jsp Standard Tag Lib ,jsp第二代标签库,需要导入jar包

    <!-- 通常用c来表示JSTL-->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

1. 赋值 <c:set>

属性含义
var
value
scope范围
  • 存在种范围page,request,session,application
<c:set var="elena" value="elenaPage" scope="page"></c:set>

2. 取值<c:out>

属性描述
value要输出的信息,支持字符串直接输出,Java代码以及EL表达式
default如果value输出失败,默认显示的值
<c:out value="这里直接通过value输出的值"></c:out>
		
<c:out value="<%=str %>"></c:out>
		
<c:out value="${pageScope.elena}"></c:out>
<c:out value="${requestScope.elena}"></c:out>
<c:out value="${sessionScope.elena}"></c:out>
<c:out value="${applicationScope.elena}"></c:out>
<!--不知名范围的拿取现存范围中最小的-->
<c:out value="${elena}"></c:out>   //page

<c:out value="${requestScope.elena}" default="删除成功!"></c:out>

3.删除<c:remove>

属性描述
var要删除的键
scope要删除的键值对的范围,注意如果不指明范围,则只要符合全部删除
<c:remove var="elena" scope="request" />

4.循环遍历 <c:forEach>

属性描述
items表示被遍历的循环体,可以书写Java代码,也可以从el表达式中拿取
var表示每个被遍历的对象的key值,可以随意书写,范围默认是pageContext最小范围
begin起始下标
end结束下标
//<c:forEach>相当于
for(Game ge:(List)request.getAttribute("mylist")){
    //此处pageContext范围是标签固定范围
    pageContext.setAttribute("suibianxie",ga);
}
<%
    List<Game> list = new ArrayList<Game>();
    list.add(new Game(1,"动物森友会",530,"任天堂"));
    list.add(new Game(2,"生化危机3",440,"卡普空"));
    list.add(new Game(3,"FF7Re",500,"SE"));
    list.add(new Game(4,"骑马与砍杀2",300,"MB"));
    list.add(new Game(5,"仁王2",390,"光荣"));
    list.add(new Game(6,"十三机兵防卫圈",400,"香草社"));
    request.setAttribute("mylist", list);
%>

<c:forEach items="${requestScope.mylist}" var="suibianxie" begin="1" end="3">
    <tr>
        <td><c:out value="${pageScope.suibianxie.id}"></c:out></td>
        <td><c:out value="${suibianxie.name}"></c:out></td>
        <td><c:out value="${suibianxie.price}"></c:out></td>
        <td><c:out value="${suibianxie.seller}"></c:out></td>
    </tr>	
</c:forEach>

注意:items后边写El表达式一定要写完整,不然会找不到属性,切记切记

5.流程控制<c:choose>

相当于Java中的if else,可以不书写otherwise,但是不能不书写when.

如果互相嵌套,则c:choose必须和c:when在一起

<c:choose>
			<c:when test="${3>10}">
				<c:out value="输出这里了吗?"></c:out>
			</c:when>
			<c:otherwise>
				<c:out value="最终输出了这里!!!!!"></c:out>
			</c:otherwise>
		</c:choose>
		
		<c:choose>
			<c:when test="${3>10}">
				<c:out value="输出这里了吗?"></c:out>
			</c:when>
			<c:otherwise>
				<c:choose>
					<c:when test="${2>1}">
						<c:out value="最终输出了这里!!!!!~~~~~~"></c:out>
					</c:when>
				</c:choose>
			</c:otherwise>
		</c:choose>

6.Jsp同步分页

所谓分页就是从数据库中拿取一部分的数据

1.分页的类型

  1. 假分页

一次将所有数据从数据库中取出,用户需要哪几条就显示哪几条

  1. 真分页

用户需要哪几条就从数据库中取出哪几条

2. 分页公式

select 字段 from 表 limit x,y
## x:起始索引值
## y:一共显示条

3. 分页四要素

步骤要素结果建议变量名
1总记录数dao层获取allRecord
2每页记录数自己设置pageRecord
3总页数(allRecord + pageRecord - 1) / pageRecordallOage
4当前页默认1currentPage

分页完成后要进行下边的操作

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.etoak.dao.ComputerDaoIf,com.etoak.dao.ComputerDaoImpl,com.etoak.po.*,java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Jsp同步分页</title>
		<style>
			body{
				background-color:silver;
			}
			div#container{
				width:900px;
				margin:0 auto;
				text-align:center;
			}
			table,tr,th,td{
				border:solid 2px gray;
			}
			table{
				width:100%;
				text-align:center;
				border-collapse:collapse;
				box-shadow:15px 15px 15px silver;
			}
			thead{
				background-color:coral;	
			}
			tbody{
				background-color:whitesmoke;
				color:navy;
			}
			input[type=button]{
				border-radius:15px;
				width:60px;
				background-color:pink;
			}
			
			a:hover{
				cursor:pointer;
				color:deeppink;
				text-decoration:underline;
			}
			a{
				color:navy;
				text-decoration:none;
			}
		</style>
	</head>
	<body>
		<%--
			在对数据库的最基本操作中 增删查改 是基础的四门功课
			分页:拿取一部分数据
			~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			分页的类型:
				假分页
					一次将所有的数据从数据库取出,用户需要哪几条就显示哪几条
				真分页
					用户需要哪几条就从数据库中取出哪几条
			~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
			分页公式
				select 字段 from 表 limit x,y;
				
				x:表示起始索引值
				y:表示一共显示几条记录
			~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			分页四要素
				不管使用何种分页方式,何种技术,只要拿取了以下四个数据,则分页可得
				
				1:总记录数				dao
				2:每页记录数				自己订
				3:总页数					(总记录数+每页记录数-1)/每页记录数
				
				4:当前页					默认值是1,随着用户的操作不断的更改,是一个变量
			~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			分页公式结合分页四要素
				select 字段 from 表 limit (当前页-1)*每页记录数,每页记录数;	
				
			List<Computer> list = dao.queryPage((当前页-1)*每页记录数,每页记录数);		
		--%>
		<%--
		<c:choose>
			
				判断session范围中是否存在权限信息
			
			<c:when test="${!empty u}">
			--%>
				<%
					ComputerDaoIf dao = new ComputerDaoImpl();
					//1:拿取总记录数
					Integer allRecord = dao.queryCount();
				
					//2:设置每页记录数
					Integer pageRecord = 5;
				
					//3:拿取总页数
					Integer allPage = (allRecord+pageRecord-1)/pageRecord;
				
					//4:设置当前页默认值
					Integer currentPage = 1;
				
					//接受表单提交的值
					String value = request.getParameter("cup");
				
					/*
						第一次打开本页面肯定为null,从上往下执行,表单还未提交
					*/
					if(value!=null){
						currentPage = Integer.parseInt(value);
					}
				
					List<Computer> list = dao.queryPage((currentPage-1)*pageRecord,pageRecord);
					pageContext.setAttribute("mylist",list);
				%>
				<div id="container">
					<table>
						<caption>计算机售价明细</caption>
						<thead>
							<tr>
								<th>ID</th>
								<th>品名</th>
								<th>售价</th>
								<th>生产商</th>
								<th>CPU型号</th>
								<th>GPU型号</th>
								<th>硬盘容量</th>
								<th>内存容量</th>
								<th>产地</th>
								<th>发售时间</th>
								<%--
									只要不是平民登录
								--%>
								<c:if test="${u.level!='0'}">
									<th colspan="3">操作</th>
								</c:if>
							</tr>
						</thead>
						<tbody>
							<c:forEach items="${mylist}" var="co">
								<tr>
									<td><c:out value="${co.id}"></c:out></td>
									<td><c:out value="${co.name}"></c:out></td>
									<td><c:out value="${co.total}"></c:out></td>
									<td><c:out value="${co.production}"></c:out></td>
									<td><c:out value="${co.cputype}"></c:out></td>
									<td><c:out value="${co.gputype}"></c:out></td>
									<td><c:out value="${co.disktype}"></c:out></td>
									<td><c:out value="${co.ramtype}"></c:out></td>
									<td><c:out value="${co.location}"></c:out></td>
									<td><c:out value="${co.sellertime}"></c:out></td>
									<c:if test="${u.level!='0'}">
										<td><a href="delcomputer?id=${co.id}&info=fake">假删除</a></td>
										<td><a href="delcomputer?id=${co.id}&info=true">真删除</a></td>
										<td><a href="computer_update.jsp?id=${co.id}">编辑</a></td>	
									</c:if>
								</tr>
							</c:forEach>
						</tbody>
					</table>
					<br />
					<form action="computer_show.jsp">
						<input type="hidden" name="cup" />
		
						<input type="button" value="首页" οnclick="change(1)" 
						<%=currentPage==1?"disabled":"" %> />
						
						<input type="button" value="上一页" οnclick="change(<%=currentPage-1 %>)" 
						<%=currentPage==1?"disabled":"" %> />
						
						<input type="button" value="下一页" οnclick="change(<%=currentPage+1 %>)"
						<%=currentPage==allPage?"disabled":"" %> />
						
						<input type="button" value="末页" οnclick="change(<%=allPage %>)" 
						<%=currentPage==allPage?"disabled":"" %> />
					</form>
					<a href="computerquit">用户登出</a>
					<%--
						1)普通用户只能看到用户登出链接
						
						2)管理员可以看到查看全部普通用户资料链接,点击之后
						跳转到computer_usershow.jsp页面,此页面存在一个表格,内部是所有
						普通用户资料。实现分页功能,实现真删除,假删除,编辑功能,
						提升权限(普通用户=》管理员)
						
						3)超级管理员可以看到查看全部管理员用户资料链接,点击之后
						跳转到computer_adminshow.jsp页面,此页面存在一个表格,内部是所有
						管理员资料。实现分页,假删除,编辑功能,降低权限(管理员=》普通用户)
						
						要求:Jsp页面使用EL表达式和JSTL标签,尽量使用Servlet调用dao层
						(分页页面可以直接在Jsp页面调用dao层)
						所有页面必须使用权限控制,非登录人员登入直接跳转到登录页
						dao层谨慎书写,如果之前已经写过,可以不再书写,工厂,实体类等不需要再次
						书写
					--%>
				</div>
				<script>
					/*
						此处传递过来的形参就是点击按钮之后当前页的值
					*/
					function change(cr){
						/*
							document.forms:表示拿取全文中所有的表单,由于这里只有一个表单
							所以添加[0]表示拿取的就是全文中的唯一表单
							.cup.value=cr
							表示将隐藏域的值赋值成cr也就是当前页的值
						*/
						document.forms[0].cup.value = cr
						//使用js提交表单
						document.forms[0].submit()
					}
				</script>
			<%-- </c:when> --%>
			<%-- <c:otherwise> --%>
				<%--
					此处是放置不经过登录直接在浏览器地址栏输入此页面,逃避登录步骤
					由于没有从session中无法获得权限信息,所以进显示以下内容
				--%>
				<!-- <p>您还没有登录,请您先登录</p><hr /> -->
			<%-- </c:otherwise> --%>
		<%-- </c:choose> --%>
	</body>
</html>

7. 过滤器[filter]

Servlet
> Filter在Servlet中可以设置一个或者多个过滤器,这些过滤器起到过滤的作用,在Servlet执行doGet()或者执行doPost()
> 之前过滤器会挡在之前首先执行过滤工作,例如可以设置编码,可以查看权限
> init():在打开tomcat时,整个工程中所有的过滤器全部启动,仅仅执行一次
> doFilter():当拦截的Servlet要执行之前支持过滤器的doFilter(),注意在doFilter()中存在
> 一个chain.doFilter()方法,如果过滤器过滤结束,则支持此方法之后继续执行Servlet实例
> 而如果过滤失败,不支持chain.doFilter()则后面的Servlet不再执行了
> destroy():关闭tomcat时执行
>
> 多个过滤器:
> 打开tomcat时:
> Servlet的init()
> 过滤器1的init()
> 过滤器2的init()

请求发送时:
	
	过滤器1的doFilter()执行到chain.doFilter(request,response)时
	开始执行
	过滤器2的doFilter()执行到chain.doFilter(request,response)时
	开始执行
	Servlet的doGet()||doPost()
	之后执行
	过滤器2的chain.doFilter(request,response)之后的代码
	过滤器1的chain.doFilter(request,response)之后的代码
	
这叫做过滤链
	过滤器可以配置在web.xml中
	或者使用Servlet3.0中注解直接配置在Filter类中	
	<filter>
	  	<filter-name>suibianxie</filter-name>
	  	<filter-class>监听器的类的地址</filter-class>
	  	<init-param>
	  		<param-name>私有参数名</param-name>
	  		<param-value>私有参数值</param-value>
	  	</init-param>
	 </filter>
     <filter-mapping>
     	<filter-name>suibianxie</filter-name>
    	 <url-pattern>拦截的Servlet或者jsp路径</url-pattern>
     </filter-mapping>


​ 过滤顺序:
​ 如果配置在web.xml中
​ 注意过滤顺序是web.xml中从上到下过滤
​ 注意servlet一定放置在最后

​ 如果使用Servlet3.0注解
​ 官方至今没有提供任何设置顺序的解决方案,API文档中没有任何方法可以设置顺序
​ 非官方提出的说法按照过滤器字符排列顺序,例如
​ A.java肯定在B.java之前执行
​ FilterA.java肯定在FilterB.java之前执行
​ Filter0Etoak.java肯定在Filter1Etoak.java之前执行
​ 未经过官方认定

1. 设置编码的

package com.etoak.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.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

/*
 * 	urlPatterns="这里表示要拦截的请求"
 *  注意如果设置为 /* 则表示拦截所有请求
 *  initParams={
 *  	@WebInitParam(name="表示这个过滤器的键",value="表示这个过滤器的值"),
 *  	@WebInitParam(name="表示这个过滤器的键",value="表示这个过滤器的值"),
 *  }
 *  在WebInitParam中部署的私有参数只有本类可以拿取
 *  	可以通过以下几种手段拿取
 *  	ServletConfig config = this.getServletConfig();
 *  	String value = config.getInitParameter("键");
 * 
 * 		或者通过过滤器中的参数FilterConfig来拿取
 * 		
 * */
@WebFilter(urlPatterns="/*",initParams={
		@WebInitParam(name="encode",value="utf-8"),
		@WebInitParam(name="thisiskey", value="thisisvalue")
})
//urlPatterns={"/UserManagerServlet","/index.jsp"}

public class Filter1Encoding implements Filter {

	private String code;
    
    public void destroy() {
    	System.out.println("编码过滤器的destroy~~~");
    }

    /*
     * 	ServletRequest和ServletResponse是
     *  HttpServletRequest与HttpServletResponse的父接口
     * 
     *  注意部分方法无法直接调用
     *  	重定向和请求转发无法直接使用,需要通过多态等进行转换
     * */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("编码过滤器开始过滤啦!!~~~");
		request.setCharacterEncoding(code);
		chain.doFilter(request, response);
		
	}

	//当打开tomcat时直接执行此方法
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("编码过滤器启动啦!");
		code = fConfig.getInitParameter("encode");
		System.out.println(code);
	}

}

2. 设置权限的

package com.etoak.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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.etoak.po.User;


@WebFilter(urlPatterns= {"/delcomputer","/computerquit","/computerupdate","/computer_show.jsp","/computer_update.jsp"})
public class Filter2Authority implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("权限过滤器开始过滤啦!!~~~");
		HttpServletRequest req = (HttpServletRequest)request;
		HttpSession session = req.getSession();
		User u = (User)session.getAttribute("u");
		if(u==null) {
			HttpServletResponse res = (HttpServletResponse)response;
			res.sendRedirect(req.getContextPath()+"/computer_log.jsp");
			return;
		}
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("权限过滤器启动啦!");
	}

}

3. 注意点

  • urlPatterns=“这里表示要拦截的请求”
  • 注意如果设置为 /* 则表示拦截所有请求
  • initParams={
  • @WebInitParam(name=“表示这个过滤器的键”,value=“表示这个过滤器的值”),
  • @WebInitParam(name=“表示这个过滤器的键”,value=“表示这个过滤器的值”),
  • }
  • 在WebInitParam中部署的私有参数只有本类可以拿取
  • 可以通过以下几种手段拿取
  • ServletConfig config = this.getServletConfig();
  • String value = config.getInitParameter(“键”);
  •    或者通过过滤器中的参数FilterConfig来拿取
    
  • */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值