未使用filter前 方法一:在jsp页面中,检查用户是否有登录信息
有局限性---只能在jsp页面中过滤
Filter:
1. 创建filter类实现Filter ---------- 导包 Filter javax.servlet包下的
2. 重写doFilter方法-----获取session判断用户是否满足登录信息
3. 配置filter程序要拦截的路径
用户登录请求到admin下面的所有页面,都将经过filter过滤器---->进入到doFilter判断,不满足的请求拦截
此时,访问admin中的所有文件都不会执行,需要先判断请求的信息是否满足
注意:缓存没清理,会导致,直接访问浏览器中的缓存文件
对比servlet
再添加登录成功后的代码
---------login.jsp通过servlet跳转
--------判断登陆成功后,用户名赋值给user传入到session中
1. 登录前,访问a.jsp,会请求转发会登录界面
当从表单提交正确的用户信息--登录后,访问拦截中的文件(a.jsp)
通过chain.doFilter(request,response),退出拦截,就可以访问admin下的文件了
2. 登陆成功后,浏览器再次访问a.jsp
1.获取web.xml中filter-name
2.获取web.xml中init-param
3.获取ServletContext对象
Filter1
Filter2
target.jsp
执行顺序:
取消掉Filter2的chain.doFilter()方法和后置代码
程序会在执行完Filter2的前置代码2后,返回Filter1,继续执行后置代码1
结果:
取消掉Filter1的chain.doFilter()方法和后置代码
程序会在执行完Filter1的前置代码1后,直接返回
结果:
多个Filter组成的FilterChain过滤链的执行顺序
Filter1 和 Filter2 的执行顺序是web.xml中的两个filter 的顺序
多个Filter过滤器执行的特点:
1. 都在同一线程中
filter1中 获取线程名
filter2中 获取线程名
target中 获取线程名
2. 都使用同一个request对象
甚至filter1在域中设置的值,在filter2或者target.jsp中能读取
-------不能以 / 开头
后缀名匹配的后缀名,可以是任意字符串,只要请求时,输入相匹配的后缀名,就能访问到
---------因此Filter过滤器只关心请求的地址匹配,不关心请求资源存在
json就是一个对象,其中的 key就相当于属性
访问
当json1中key的值为json2时,访问时直接 .json2的key
值为json数组
1.
2.
json对象《==》json字符串
JSON.stringify( jsonObj ) json对象 ==》json字符串
JSPN.parse( jsonstring ) json对象《== json字符串
JSON.stringify( jsonObj)
JSON.parse( jsonObjString)
需要导包使用谷歌的gson.jar
1.2.1、javaBean 和 json的互转 gson.toJson() gson.fromJson()
json字符串转回对象时,fromJson的第二参数,可以使用Class来转一个JavaBean对象
1.2.2、list 和json的互转
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
json字符串数组转换回List集合时,fromJson()的第二个参数,需要用带反射的类TypeToken<ArrayList(Person)>的Type
使用继承TypeToken类的子类对象,的getType方法做参数
继承TypeToken时,规定好泛型的类型--ArrayList<Person>
1.2.3、map 和json的互转
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
json字符串数组转换回Map集合时,fromJson()的第二个参数,用带反射的类TypeToken<HashMap(Integer,Person)>的Type
并指明TypeToken子类继承的的泛型
使用继承TypeToken类的子类对象,的getType方法做参数
继承TypeToken时,规定好泛型的类型--HashMap(Integer,Person)
优化:
json字符串转回 List、Map时,fromJson()的第二参数私用匿名内部类
使用jackson的jar包 来序列化list为 json
1.创建XMLHttpRequest对象
2.项服务器发送请求open("get/post","url",true)+send()
3.绑定响应事件onreadystatuchange=function(){if(readstate statu)}
问题一:
url处使用相对路径
同步、异步执行
异步执行
响应服务器
请求发送代码
异步执行,先执行请求(除了响应代码)的所有代码
响应代码:服务器什么时候响应,什么时候执行
同步执行
响应代码之后的代码,必须等服务器响应后,才能执行
异步请求:提升用户体验------页面的请求和服务器响应异步执行
$.ajac方法
$.ajax ( { url: "地址" , data: "参数" , type: "GET/POST" , success: function(data){}, dataType: "数据类型" } )
$.get 和 $.post 方法 -----在$.ajax方法基础上
$.get ( "地址" , "参数" , "响应函数" , "数据类型" )
$.getJSON方法 ------比$.ajax() 少 数据类型、请求类型 参数
表单序列化serialize()
$("#form01").serialize()----------获取表单的全部信息,拼装成键值对方式:username=xxx&password=xxx
将serialize()获取的全部表单参数,连接到请求参数后,需要加上&
注意:getJSON方法的参数,url和callback之间的都是 请求参数
导包、编译、单元测试、打包
jar包放到jar包仓库,项目中只有jar包坐标
传统的项目,需要放到tomcat目录下的webapps中,再startup启动项目
Maven项目,只需使用mvn tomcat:run 就能使用Maven自带的tomcat运行项目
IDEA 自带 maven setttings.xml C:\Users\Administrator\.m2\repository
本地仓库路径: C:\Users\Administrator\.m2\repository
Maven 安装
需要解压到一个英文路径,并添加环境变量 MAVEN_HOME 为 安装路径,添加Path 新建%MAVEN_HONE%\bin
cmd中输入 mvn -v
mvn 构建项目的
boot 类加载器
仓库
一般公司就使用私服
本地仓库jar包修改路径----------项目通过该路径寻找jar包
Maven标准目录结构
mvn clean 删除编译文件
mvn compile 编译 --- 生成target目录
mvn test 编译了test目录下的文件,并且编译了src下的文件
mvn package 将项目打包,并编译src+test文件,打包类型在pom.xml中<packing>中定义了
mvn install 打包项目,并编译src+test文件,打包类型,最后再将包添加到本地仓库
Maven生命周期
IDEA集成maven插件
在本地未连网的情况下,配置后,只要之前下载过相关功能的插件,未连网的情况也能配置好
-DarchetypeCatalog=internal
创建Maven工程时,使用提供的骨架创建,就需要自动下载,创建好后,需要自己创建资源文件夹resource,并设置为资源类文件夹,手动补齐
创建骨架时,配置conf下的setting.xml中mirrors为aliyun的镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
idea web小技巧,想要在java文件夹中也创建jsp页面,需要添加java文件夹为web资源结构
添加servlet和jsp依赖
作用域
添加依赖时,添加包的作用域,防止冲突(导入的包和Maven自带的包冲突)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
配置另一个tomcat
插件模板一键配置
最简短的连接数据库
@Override
public List<Items> findAll() throws Exception{
List<Items> list = null;
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/eesy_mybatis?characterEncoding=utf-8&serverTimezone = GMT","root","123456");
pst = conn.prepareCall("select * from user ");
rs = pst.executeQuery();
list = new ArrayList<>();
while (rs.next()){
Items items = new Items();
items.setId(rs.getInt("id"));
items.setName(rs.getString("username"));
list.add(items);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
conn.close();
pst.close();
rs.close();
}
return list;
直接通过连接对象执行SQL语句,返回一个preparedStatement对象