首页
友链
关于
免责声明
Search
1
王者营地战绩数据王者荣耀查询网页源码
6,211 阅读
2
群晖Active Backup for Business套件备份Linux服务器教程
4,384 阅读
3
影视分享
4,313 阅读
4
(亲测)Jrebel激活破解方式2019-08-21
4,290 阅读
5
centos7 安装及卸载 jekenis
3,573 阅读
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
登录
Search
标签搜索
docker
springboot
Spring Boot
java
linux
Shiro
Graphics2D
图片
游戏账号交易
Mybatis
Spring Cloud
centos
脚本
Web Station
群辉
王者营地
战绩查询
平台对接
Spring Cloud Alibaba
nacos
绿林寻猫
累计撰写
249
篇文章
累计收到
26
条评论
首页
栏目
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
页面
友链
关于
免责声明
搜索到
249
篇与
绿林寻猫
的结果
2021-12-08
Maven中无法使用el表达式
如果在maven中访问项目页面使用EL表达式${999},显示出来的是${999}而不是999那么你该看看你的web.xml配置如果头部是 ↓ ↓ ↓ ↓<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >请把头部改成↓ ↓ ↓ ↓<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">在重启下项目,再次访问页面EL表达式${999}就可以显示为999
2021年12月08日
149 阅读
0 评论
0 点赞
2021-12-08
Maven导入本地jar
Maven导入本地jar注:我第一次使用时必须联网,会下载一些东西,后面就不需要了 <--mvn install:install-file-Dfile=D:\smartupload.jar 文件全路径-DgroupId=sm 对应 groupId-DartifactId=smartupload 对应artifactId-Dversion=1.0 对应version-Dpackaging=jar 后缀--> mvn install:install-file -Dfile=D:\smartupload.jar -DgroupId=ss -DartifactId=smartupload -Dversion=1.0 -Dpackaging=jar如下图然后在pom.xml 添加 ↓ 并保存<dependency> <groupId>sm</groupId> <artifactId>smartupload</artifactId> <version>1.0</version></dependency>至此就可以在项目里看到导入的jar包
2021年12月08日
109 阅读
0 评论
0 点赞
2021-12-08
关于服务器配置tomcat无法访问
开启防火墙(systemctl start firewalld)查看防火墙状态firewall-cmd --state//得到结果是running或者not runningrunning 时,添加需要开放的端口 firewall-cmd --permanent --zone=public --add-port=8080/tcp //永久的添加该端口。去掉--permanent则表示临时。//重新加载配置,使得修改有效。firewall-cmd --reload //查看开启的端口,出现8080/tcp这开启正确firewall-cmd --permanent --zone=public --list-ports 再次使用浏览器访问,这时会出现tomcat的欢迎界面。
2021年12月08日
231 阅读
0 评论
0 点赞
2021-12-08
Collection集合框架
什么是集合框架集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。数组、对象数组、集合框架的特点与区别数组:用于存放同一基本数据类型(值类型)元素的组合对象数组:用于存放同一对象类型元素的组合集合框架:动态的数组对象集合只能存储对象,经常犯的错误:集合可以存储整型之类的基本数据类型,其实那是通过自动装箱,拆箱机制,转为了Integer对象。区别:数组不能动态扩张,定义时必须指定长度,长度不可变;集合则无需指定长度,可动态扩张,长度可变。为什么需要集合框架?如果不知道程序运行时需要多少对象,或者需要更复杂方式存储对象,可以使用集合框架。Collection集合框架用来存储和操作不同类型的对象组。集合框架的体系 Collection接口 Collection主要有三个子接口:Set——表示不允许有重复元素的集合List——表示允许有重复元素的集合Queue——队列,JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。队列是一种特殊的线性表,先进后出。Stack——继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 List接口特点:(1)和数组类似,可以动态增长;(2)有序,对象可以重复;(3)查找元素效率高,插入删除元素效率低(会引起其他元素位置改变)。遍历方式:(1)下标(2)foreach(>=JDK 1.5)(3)迭代器Iterator优化:(1)默认长度为0,初始容量10,50%延长,相对节约空间。对应类有:ArrayList、LinkedList、Vector(1)ArrayList:动态数组,是线程不同步的,查询速度快,但是增删慢。优化:创建ArrayList的时候指定初始容量new ArrayList<>(50); //初始指定50长度增长方式:n*3/2+1(2)LinkedList:链表、队列、堆栈,查询慢,增删快。(3)Vector:是一种老的动态数组,是线程同步的,安全且效率很低,一般不赞成使用。长度为10,当超过10时,100%延长,变为20个(有点浪费空间)。Set接口特点:(1)无序,对象不可以重复(eqauls——eqauls从Object继承,默认比较的地址);(2)查找元素效率低,插入删除元素效率高(不会引起元素位置改变)。遍历方式:(1)foreach(2)迭代器对应类有:HashSet、TreeSet。(1)HashSet:以哈希表的形式存放元素,插入删除速度很快。(2)TreeSet:根据某种(规则)对里面的元素进行排序。规则1: java.lang.Comparable规则2: java.util.Comparator Map接口 特点:(1)无序、以键值对的形式添加元素,键不能重复,值可以重复遍历方式:(1)先取出保存所有键的Set,再遍历Set即可(2种)。(2)先取出保存所有Entry的Set,再遍历此Set即可。 快速遍历Map:遍历保存Entry,省略根据key取值 Map<String,String> map = new HashMap<String,String>(); Map.put.....; For(Map.Entry<String,String> entry : map.entrySet()){ System.out.println(entry.getKey()+” = ”+entry.getValue()); }对应类有:HashMap、TreeMap、Hashtable、LinkedHashMap(1)HashMap:根据键的HashCode值存储数据,查询快,最多允许一个键为NULL,多个值为NULL。线程不同步(2)Hashtable:与HashMap类似,但它不允许键或值为NULL。支持线程的同步(即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢)。(3)TreeMap:根据键排序(默认升序),也可指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。(4)LinkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历 的时候会比HashMap慢。 Map并不是一个真正意义上的集合,但是这个接口提供了三种“集合视角”,使得可以像操作集合一样操作。 定义、增加、删除、修改、查找 Collections类排序//sort方法进行简单排序,默认升序Collections.sort(集合名称);//复杂对象排序List<Student> li = new ArrayList<>();li.add(new Student("5张三", 1, "男"));li.add(new Student("1张三", 1, "男"));li.add(new Student("2张三", 1, "男"));li.add(new Student("3张三", 1, "男"));li.add(new Student("4张三", 1, "男")); Collections.sort(li);//得在实体类继承Comparable,重写@Overridepublic int compareTo(Student o) { // TODO Auto-generated method stubreturn this.getName().compareTo(o.getName()); //根据姓名排序}反转//Collections.reverse(li);交换//Collections.swap(li, 0, li.size()-1);取最大最小//Collections.max(lc);//Collections.min(lc);复制Collections.copy(新集合, li);//注意复制时新的集合长度必须大于等于要复制的集合长度,如果长度为0时报错其它 5.1 Iterator(迭代器):遍历集合List/Set hasNext next remove:在遍历集合,并同时需要删除集合中的元素时,建议使用 Iterator.remove 5.2 java.lang.Comparable:自然排序接口 5.3 java.util.Comparator:比较器接口 5.4 Collections:工具类,提供一组静态方法操作Collection集合 Arrays:工具类,提供了一组静态方法操作数组泛型以类型作为参数的类就叫泛型。作用:提高程序健壮性,简化代码泛型的默认值是Object装箱、拆箱值类型->引用类型 装箱引用类型->值类型 拆箱JDK1.5之后引入了自动装箱及自动拆箱功能
2021年12月08日
154 阅读
0 评论
0 点赞
2021-12-08
Map集合四种遍历方式
Map<Integer, String> map = new HashMap<Integer, String>();map.put(1, "a"); map.put(2, "b");map.put(3, "c");map.put(4, "d");map.put(4, "e");//第一种:通过Map.keySet遍历key和valuefor (Integer key : map.keySet()) {//根据键获得值String value = map.get(key);System.out.println(" key="+key+" value="+value);}//推荐 尤其容量大时//第二种:通过Map.entrySet遍历key和valuefor (Entry<Integer, String> s : map.entrySet()) {System.out.println("key="+s.getKey()+" value="+s.getValue());}//第三种:通过Map.values遍历所有valuefor (String s : map.values()) {System.out.println(s);}//第四种:通过Map.entrySet使用iterator遍历key和value//迭代器Iterator<Entry<Integer, String>> it = map.entrySet().iterator();while(it.hasNext()) {Entry<Integer, String> next = it.next();System.out.println("key="+next.getKey()+" value="+next.getValue());}
2021年12月08日
164 阅读
0 评论
0 点赞
2021-12-08
亲测,解决文件上传C:\fakepath问题(图片上传格式限制)
function ii(obj){//解决C:\fakepath问题 var oFReader = new FileReader(); var file =obj.files[0]; oFReader.readAsDataURL(file); oFReader.onloadend = function(oFRevent){ var src = oFRevent.target.result; $('#turn_img').attr('src',src); }//判断图片格式 var fileName=obj.value; var suffixIndex=fileName.lastIndexOf("."); var suffix=fileName.substring(suffixIndex+1).toUpperCase(); if(suffix!="BMP"&&suffix!="JPG"&&suffix!="JPEG"&&suffix!="PNG"&&suffix!="GIF"){ alert( "请上传图片(格式BMP、JPG、JPEG、PNG、GIF等)!"); } }HTML<img id="turn_img" src="" /><input type="file" id="file" name="file_name" class="input w300" οnchange="ii(this);"/>
2021年12月08日
404 阅读
0 评论
0 点赞
2021-12-08
List集合的三种遍历方式及优缺点
List<String> li = new ArrayList<String>();li.add("1");li.add("2");li.add("3");li.add("4");//1.for//优点:效率最高,遍历快,可以根据自定计数器操作元素//缺点:不适用所有集合,每次都需要在应用程序中手动强转和额外的获得list.size,还有一个缺点就是遍历过程中不允许删除元素for (int i = 0; i < li.size(); i++) {System.out.println(li.get(i));}//2.迭代器// 优点:迭代器提供了操作元素的方法 可以在遍历中相应地操作元素//缺点:运行复杂,性能稍差,效率相对其他两种遍历方式较低Iterator<String> it = li.iterator();while(it.hasNext()){System.out.println(it.next());}//3.Foreach//优点:代码简洁,不易出错。//缺点:只能做简单的遍历,不能在遍历过程中操作(删除、替换)数据集合。for (String s : li) {System.out.println(s);}
2021年12月08日
112 阅读
0 评论
0 点赞
2021-12-08
通用Dao
package com.ly.dao.util;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Map.Entry;/** * @ClassName: Dao * @Description: TODO(通用Dao) * @author Uncle liu * @date 2018年5月24日 下午7:31:57 * */@SuppressWarnings({"unchecked","rawtypes"})public class Dao<T> {private Connection conn = null;private PreparedStatement ps = null;private ResultSet rs = null;/** * @param conn 要设置的 Connection */public void setConn(Connection conn) {this.conn = conn;}/** * @return conn */private Connection getConn() {return conn;} /** * * @Title: queryList * @Description: TODO(通用查询方法) * @param sql SQL语句 * @param params SQL语句中占位符的参数 * @param t 接受数据的对象 * @param m 设置对象属性接受位置,key为属性名,value为获得数据位置 * @return List<T> */public List<T> queryList(String sql, Object[] params,T t,Map<String, Integer> m) {//获得类对象Class c=t.getClass();//接收对象数据的集合List<T> li = new ArrayList<>();try {this.conn = getConn();this.ps = this.conn.prepareStatement(sql);//读参数if(params != null) {for (int i = 0; i < params.length; i++) {this.ps.setObject(i+1, params[i]);}}this.rs = this.ps.executeQuery(); while(this.rs.next()){ //实例化对象 T temp=(T)c.newInstance(); //通过Map.entrySet遍历key和value for (Entry<String, Integer> s : m.entrySet()) { String name = s.getKey(); Field field=c.getDeclaredField(name); name = name.substring(0,1).toUpperCase()+name.substring(1); Method method = c.getMethod("set"+name, field.getType()); try {method.invoke(temp, rs.getObject(s.getValue()));}catch (Exception e) {//如果不是对应基本数据类型和引用数据类型,就设置为String类型method.invoke(temp, rs.getString(s.getValue()));}} //添加对象进集合 li.add(temp); } return li;} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {close(this.conn, this.ps, this.rs);}return null;}/** * * @Title: queryList * @Description: TODO(通用查询方法) * @param sql SQL语句 * @param params SQL语句中占位符的参数 * @param path 接受数据的对象完整路径名 * @param m 设置对象属性接受位置,key为属性名,value为获得数据位置 * @return * @throws ClassNotFoundException List<T> */public List<T> queryList(String sql, Object[] params,String path,Map<String, Integer> m) throws ClassNotFoundException {//获得类对象Class c=Class.forName(path); List<T> li = new ArrayList<>();try {this.conn = getConn();this.ps = this.conn.prepareStatement(sql);//读参数if(params != null) {for (int i = 0; i < params.length; i++) {this.ps.setObject(i+1, params[i]);}}this.rs = ps.executeQuery(); while(this.rs.next()){ //实例化对象 T temp=(T)c.newInstance(); //通过Map.entrySet遍历key和value for (Entry<String, Integer> s : m.entrySet()) { String name = s.getKey(); Field field=c.getDeclaredField(name); name = name.substring(0,1).toUpperCase()+name.substring(1); Method method = c.getMethod("set"+name, field.getType()); try {method.invoke(temp, rs.getObject(s.getValue()));}catch (Exception e) {//如果不是对应基本数据类型和引用数据类型,就设置为String类型method.invoke(temp, rs.getString(s.getValue()));}} //添加对象进集合 li.add(temp); } return li;} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {close(this.conn, this.ps, this.rs);}return null;}/** * * @Title: executeUpdate * @Description: TODO(增、删、改的通用方法) * @param SQL语句 * @param params SQL语句中占位符的参数 * @return int */public int executeUpdate(String sql, Object[] params) {int result = -1;try {this.conn = getConn();this.conn.setAutoCommit(false);this.ps = this.conn.prepareStatement(sql);//读参数if(params != null) {for (int i = 0; i < params.length; i++) {this.ps.setObject(i+1, params[i]);} }result = this.ps.executeUpdate();this.conn.commit();} catch (Exception e) {// TODO: handle exceptiontry {this.conn.rollback();System.out.println("失败");} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}//throw new RuntimeException(e);} finally {close(this.conn, this.ps);}return result;}/** * * @Title: close * @Description: TODO(查询关闭连接) * @param con * @param ps * @param rs void */private static void close(Connection con,PreparedStatement ps,ResultSet rs) {try {if(!con.isClosed()&&con!=null) {con.close();}if(ps!=null) {ps.close();}if(rs!=null) {rs.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * * @Title: close * @Description: TODO(增删改关闭连接) * @param con * @param ps void */private static void close(Connection con,PreparedStatement ps) {close(con,ps,null);}}//-----------------------------测试package com.ly.Book.util;import java.util.HashMap;import java.util.List;import java.util.Map;import com.ly.Book.entity.Book;import com.ly.dao.util.Dao;/** * @ClassName: TestBook * @Description: TODO(Book测试) * @author Uncle * @date 2018年5月23日 下午3:21:20 * */public class TestBook { public static void main(String[] args) throws Exception { Map<String, Integer> m = new HashMap<>();m.put("bid", 1);m.put("bname", 2);m.put("bauthor", 3);m.put("byear", 4);m.put("bprice", 5);Dao<Book> b = new Dao<>();b.setConn(DBHelper.getCon());//数据库连接List<Book> allBook = b.queryList("select * from tb_book ORDER BY byear DESC", null, new Book(), m);for (Book book : allBook) { System.out.println(book);}}}
2021年12月08日
108 阅读
0 评论
0 点赞
2021-12-08
String类
String类的常用方法字符串长度 length()字符串某角标字符 charAt()字符串中某内容第一次出现的位置 indexOf()反向索引内容位置 lastIndexOf()字符串某角标字符的ASCII codePointAt()字符串中是否包含 contains()字符串是否为空 isEmpty()字符串是否以指定内容开头或结束 startsWith()\endsWith()字符串内容是否相同 equals()字符串内容是否相同(不区分大小写) equalsIgnoreCase()将基本类型转换成字符串 valueOf()将基本类型数组转换在字符串 new String()将字符串转换成字符数组 toCharArray()将字符串转换成字节数组 getBytes()字符串替换 replace()切割字符串 split()截取子串 substring()转换大小写 toUpperCase()\toLowerCase()去除字符串空格 trim()字符串比较 compareTo()字符串连接 concat()获取字符串长度 int length(); //注意:长度是指个数,不是字节数。获取字符串位置上某个字符 char charAt(int index); //当int index的值大于字符串最大的角标时,会发生StringIndexOutOfBoundsException错误。根据字符获得该字符在字符串中的位置 int indexOf(int ch); //返回ch在字符串中第一次出现的位置 int indexOf(int ch, int fromIndex); //从fromIndex指定位置开始,获取ch在字符串中出现的位置 int indexOf(String str); //返回str在字符串中第一次出现的位置 int indexOf(String str, int fromIndex); //从fromIndex指定位置开始,获取str在字符串中出现的位置 /**如果在字符串中没有找到该ch或str,则返回-1**/反向索引一个字符出现位置(字符串存入内存时,就存在角标) int lastIndexOf(String str); //从字符串的后面找起指定字符串位置中的字符的ASCII码 int codePointAt(int index); //返回指定字符串位置中的字符的ASCII码值字符串中是否包含某一个字串 boolean contains(str); /** 特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1,表示str不在字符串中存在。所以,也可以用于指定判断是否包含。 if(str.indexOf("aa")!=-1) 该方法即可以判断是否包含,又可以获取出现在的位置。 如果只是要判断是否包含,就用contains() **/字符串中是否有内容 boolean isEmpty(); //原理:判断长度是否为0 字符串是否以指定的内容开头 boolean startsWith(str);字符串是否以指定的内容结尾 boolean endsWith(str); /** 实战案例:判断文件是否是Array开头,.java结尾,并且中文名中包含Demo的文件。**/判断字符串内容是否相同 boolean equals(str); 判断内容是否相同,并忽略大小写 boolean equalsIgnoreCase(str); 将字符数组转成字符串 构造方法:String(char[]); //将char数组转成字符串String(char[], offset, count); //将char数组中的一部分转成字符串,offset第几位开始,count往后几位 /** 案例1:char[] arr={'a','b','c','d','e','f','g'};String s =new String(arr);System.out.println("s="+s); //返回:s=abcdefg 案例2:char[] arr={'a','b','c','d','e','f','g'};String s =new String(arr,1,3);System.out.println("s="+s); //返回:s=bcd **/ 静态方法:static String copyValueOf(char[]);static String copyValueOf(char[] data, int offset, int count);static String valueOf(char[]); /** 案例:char[] arr={'a','b','c','d','e','f','g'};String a=String.copyValueOf(arr);//返回:abcdefg **/ 将字符串转成字符数组char[] toCharArray(); /** 案例:String str="abd dfsdof@43";char[] arrc=str.toCharArray();//遍历char[],在此省略。 **/将字节数组转成字符串 String(byte[]); String(byte[], offset, count); //将字节数组中的一部分转成字符串将字符串转成字节数组 byte[] getBytes();将基本数据类型转成字符串 static String valueOf(int); static String valueOf(double); /** 案例:转字符串3+"";String.valueOf(3);//2种相同,第一种常用,第二种专业 **/替换: String replace(oldchar, newchar); String replace(oldstr, newstr); /** 如果要替换的字符不存在,返回的还是原来的字符串 **/切割: String[] split(regex); 子串:(获取字符串中的一部分) String substring(begin); String substring(begin, end); /** 字符第一位是0; 包含头,不包含尾; 如果角标不存在,会出现字符串角标越界异常 **/ /** 案例1:获取整个字符串:String str="abcdefg";//方法一:String stra=str.substring(0, str.length()-1);//方法二:String strb=str.substring(0); **/将字符串转成大写或小写 String toUpperCase(); String toLowerCase(); 将字符串两端的空格去除 String trim(); //trim('倾慕)整齐,修剪对两个字符串进行自然顺序的比较 int compareTo(); /** 逐个比较ASCII码值:大于返回一个>=1的值;等于返回0;小于返回-1 **/对两个字符串进行连接 String concat(str);字符串格式占位符 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。 转换符 说明 示例 %s 字符串类型 "abc" %c 字符类型 'a' %b 布尔型 %d 十进制 %f 浮点型 %% 百分比 %n 换行符 %tx 日期与时间类型(x代表不同的日期与时间转换符) String str=String.format("Hi,%s:%s.%s", "王南","王力","王张"); System.out.println(str); 结果:Hi,王南:王力.王张 转换符说明示例 c 包括全部日期和时间信息 星期六 十月 27 14:21:20 CST 2007 F “年-月-日”格式 2007-10-27 D “月/日/年”格式 10/27/07 r “HH:MM:SS PM”格式(12时制)02:25:51 下午 T “HH:MM:SS”格式(24时制)14:28:16 R “HH:MM”格式(24时制) 14:28 Date date=new Date(); //c的使用 System.out.printf("全部日期和时间信息:%tc%n",date); //f的使用 System.out.printf("年-月-日格式:%tF%n",date); //d的使用 System.out.printf("月/日/年格式:%tD%n",date); //r的使用 System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date); //t的使用 System.out.printf("HH:MM:SS格式(24时制):%tT%n",date); //R的使用 System.out.printf("HH:MM格式(24时制):%tR",date); 全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012 年-月-日格式:2012-09-10 月/日/年格式:09/10/12 HH:MM:SS PM格式(12时制):10:43:36 上午 HH:MM:SS格式(24时制):10:43:36 HH:MM格式(24时制):10:43
2021年12月08日
151 阅读
0 评论
0 点赞
2021-12-08
Servlet 过滤器Filter
过滤器概念过滤器就是用来拦截客户端(浏览器)与目标资源的请求,对客户端的请求进行一定过滤处理,再发给目标资源(Servlet、JSP、html等)。在Web应用程序中,过滤器是介于Servlet之前,既可以拦截、过滤浏览器的请求,也可以改变对浏览器的响应。它在服务端与客户端起到一个中间组件的作用,对二者之间的数据信息进行过滤。一个Web应用程序中可以有多个过滤器,组成过滤器链。过滤器链中的每个过滤器都各司其职地处理并转发数据。在Web开发中,经常利用过滤器来实现如下功能: 对用户请求进行身份认证; 对用户发送的数据进行过滤或者替换; 转换图像的数据格式; 数据压缩; 数据加密; XML数据的转换; 修改请求数据的字符集。 Servlet过滤器的用途:用户认证与授权管理:我们开发一个web应用,肯定有不同权限的用户,有管理员,有普通用户。而管理员又可能分为一级管理员,二级管理员,三级管理员。每一级管理员可能又有不同的管理权限操作,访问不同的资源。过去我们可能都是在jsp页面,servlet中加以权限的控制。通过session,看他是否有这个权限,如果有,则让他操作某个资源。这些都是些共性。那么现在我们就可以把他提取出来。让他通过过滤器来实现;用户来访问一个资源,我们通过过滤器来过滤这个请求,在程序中判断是否有权限来访问这个资源;有,则让他去访问,没有,就让他转到另外一个页面。这样通过过滤器就实现了授权管理; 实现过滤器1.创建Class类,并实现Filter接口(javax.servlet.Filter)。2.重写Filter接口中的方法: Public void init(FilterConfig filterConfig){ // 该方法用来初始化过滤器,FilterConfig对象可以得到过滤器中初始化的配置参数信息} Public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ // 该方法主要实现过滤的方法。当客户端请求目标资源时会调用此方法,在该方法中,实现对请求(request)和响应(response)的数据处理,chain是过滤器链对象。在该方法中的特定操作完成后,可调用FilterChain对象的doFilter(request, response)将请求传递给下一个过滤器或目标资源。} Public void destroy(){ // 该方法用于释放过滤器中使用的资源。} 3.在web.xml中配置Filter <filter> <filter-name>filter1</filter-name> <filter-class>com.filter.ServletFilter</filter-class></filter><filter-mapping><filter-name>filter1</filter-name><!--当请求/manage/目录下的资源时执行过滤器--> <url-pattern>/manage/*</url-pattern></filter-mapping> 实现过滤器链在访问目标资源时执行多个过滤器。 例:访问/manage/下所有目标资源时会执行过滤器filter1和filter2 <!--第一个过滤器--><filter> <filter-name>filter1</filter-name> <filter-class>com.filter.SerlvetFilterA</filter-class></filter><filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/manage/*</url-pattern></filter-mapping><!--第二个过滤器--><filter> <filter-name>filter2</filter-name> <filter-class>com.filter.ServletFilterB</filter-class></filter><filter-mapping> <filter-name>filter2</filter-name> <url-pattern>/manage/*</url-pattern></filter-mapping> 注意事项:l 过滤链的执行顺序由 web.xml中定义的顺序决定。l 一旦形成过滤链的,请求的顺序以web.xml的顺序决定,响应的顺序则相返,先请求的后响应。l 在开发中,有可能只对某个或某几个目录过滤,此时可以明确的写出是哪个目录过滤,增加过滤的映射路径即可。执行Servlet时执行过滤器 <!-- Filter 配置--><filter> <filter-name>filter1</filter-name> <filter-class>com.filter.SerlvetFilterA</filter-class></filter><filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/user/*</url-pattern></filter-mapping><filter-mapping><filter-name>filter1</filter-name><!--当访问Servlet中aabb时,执行过滤器filter1--> <servlet-name>aabb</servlet-name></filter-mapping> <!-- Servlet 配置--><servlet><servlet-name>aabb</servlet-name><servlet-class>com.servlet.Servlet1</servlet-class></servlet><servlet-mapping><servlet-name>aabb</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
2021年12月08日
154 阅读
0 评论
0 点赞
1
...
21
22
23
...
25