小题:
1.Response和request对象是什么
Response:浏览器请求服务器的时候:HTTPServletRequest(请求对象)
http协议规定规则:无论什么浏览器,请求服务的时候,请求信息中包含了请求头和请求行
请求头:提交方式 URi http协议版本
请求行:
请求头名称:请求头内容
服务器反馈给浏览器:将所有的响应信息都封装到HTTPServletResponse
无论什么服务器:服务器的响应给浏览器,响应信息包含了响应行+响应头
响应行:
http协议版本 响应状态:200:成功 302:进一步请求
响应头:
refresh:定时刷新
location:指定的页面地址
2.请求转发和重定向的区别
请求转发:
1)地址栏没有变化
2)请求转发:服务器行为:---request.getRequestDispatcher(“/xx”).forward(request,response)
3)请求转发的整个过程:两次的request对象是一样的,可以携带数据
4)请求转发只能访问当前工程下的资源文件/也可以访问WEB-INF下的资源文件
重定向:
1)地址栏明显变化
2)重定向:浏览器行为----原理:
location+302状态:response.sendRedirect(request.getContextPath()+“/xx.jsp/html”)
3)重定向的整个过程:两次request对象不一样,不能携带数据
4)重定向:既可以访问当前工程下的资源文件/也可以访问外部工程的资源文件
3.servlet的执行流程
1)用户请求地址
2)toncat服务器解析用户请求的地址信息
3)将信息进行展示
4.Servlet的生命周期
对象创建---初始化---服务方法---销毁
init service destroy
5.四个域对象分别是什么
PageContext page域 在当前jsp页面中有效
HttpServlect request域 在一次请求中有效
HTTPSession session域 在一次会话中有效
ServelectContext 全局对象 在整个web工厂工程有效
会话管理
Cookie:存储在浏览器
应用场景
可以记录用户访问过的商品id
记录用户上一次访问过的系统时间
Session:存储在服务器端
应用场景
前台::用户登录,需要将所有用户存储到session中
验证码:使用画布技术---画出线条--产生一些随机数
会话技术:
Cookie:
存储在浏览器
使用步骤:
1)在服务器端:创建Cookie对象 Cookie ck=new Cookie(String name,String value)
2)Cookie信息保留在浏览器端:public void addCookie(Cookie ck)
3)下一次:浏览器向服务器端发送请求
将上一次携带的cookie数据,来访问服务器
cookie和session进行对比
cookie特点:
1)存储在浏览器端
2)存储的内容都是String类型:存储中文(特殊符号:空格 必须使用URLEncoder/URLDecoder:进行加密解密)
3)cookie存储的数据量有限制:一个站点:20-30cookie左右
4)cookie相对:不太安全
session:
1)存储在服务器端
2)存储的内容可以是任意类型数据 因为它是一个域对象,可以进行数据共享
setAttribute(String name,Object obj);
3)存储的数据量没有上限
4)相对安全
JSP
JSP简介
什么是JSP:Java server Page:Java服务页面 能够写java代码的html页面
在当前jsp页面上,可以使用Java语言
本质:就是一个Servlet
JSP的使用
jsp脚本:
<%java代码%>
<%= jsp的输出表达式%>
三大指令
JSP三大指令:
@page
language属性:只支持Java语言
contentType:文本类型:html格式:utf-8
pageEncoding:当前jsp的默认编码格式utf-8
buffer:当前使用流的缓冲区大小 默认8kb
errorPage:当前jsp页面如果发生异常,就跳转到错误页面上
isELIgnored:是否启动el表达式:默认false
el表达式
就是为了书写简单:替代jsp表达式
通用写法:${}
session:是否启用session
@include
@taglib----需要结合:jstl(jsp核心标签库一块使用)
在jsp页面中引入jsp核心标签库
el表达式
${域对象.属性}----->{属性}
小题
1.什么是Jsp
JSP:Java server Page:Java服务页面 能够写java代码的html页面
在当前jsp页面上,可以使用Java语言
本质:就是一个Servlet
2.Jsp的执行流程
1)发送请求到服务器
2)服务器解析路径
3)然后对XXX.jsp翻译为Java文件
4)编译Java文件进行运行
3.Jsp中的四个域对象分别是什么
pageScope
requestScope
sessionScope
applicationScop
4.Servlet的结构体系
GenericServlet implements servlet
HttpServlet extends DenericServlet
复写:Service方法
自定义一个类,继承自HTTPServlet
业务中,通过自己的方法完成自己的业务
5.jsp的三大指令
<%@page%> 指定语言,编码格式等
<%可以导入jar包%>
<%@include%> 静态导入(file文件.jsp):不会将被导入的jsp文件进行翻译和编译
<%@taglib%>
6.Cookie和Session的区别
cookie和session进行对比
cookie特点:
1)存储在浏览器端
2)存储的内容都是String类型:存储中文(特殊符号:空格 必须使用URLEncoder/URLDecoder:进行加密解密)
3)cookie存储的数据量有限制:一个站点:20-30cookie左右
4)cookie相对:不太安全
session:
1)存储在服务器端
2)存储的内容可以是任意类型数据 因为它是一个域对象,可以进行数据共享
setAttribute(String name,Object obj);
3)存储的数据量没有上限
4)相对安全
jstl核心标签库
核心库:core
函数路:function
sql语句:sql库
c:if
c:if标签:jstl判断语句
属性:test 结合el表达式去使用${属性名称 判断表达式}
结果是true,执行c:if标签表达式
test=“$判断”
empty:是否为空
test=${not empty 属性名称}判断当前属性绑定的对象不为空
c:choose 类似于选择结构语句
<c:choose>
<c:when 判断>标签体1</c:when>
......
<c:otherwise>标签体n</c:otherwise>
</c:choose>
c:when test=“xxx” 相当于switch语句中的case语句
c:otherwise 相当于switch语句中的default语句
常用:遍历
c:foreach
属性
var:循环中的变量名
类型普通for循环
begin:开始循环中的数据
end:结束时候的数据
step:步长语句
index:索引
varStatus:循环中变量的状态
count:序号
<c:foreach var="i" begin="10" varStatus="status">
${status.cont} - ${i}<br />
</c:foreach>
c:foreach 另一种用法
items=“${属性名称}” 从域对象中获取的属性绑定的内容
<c:foreach items="${name}" var ="p">
${name.cont}-${p}<br />
</c:foreach>
MVC架构
Model:模型
业务数据
view:视图层
Controller:控制层
servlet:不应该输出页面
jsp:不应该写大量java代码
work
业务接口层
work.impl
业务接口实现层
dao
数据访问层
dao.impl
//具体包:
entity
实体类
utils
工具类
dao
dao.impl
实现dao接口
service
jsp文件,获取商品信息
service.impl
实现service接口
servlet
具体的操作,获取前台数据
web
druid.properties//这是页面布局,可以返回结果到sevlet
使用el获取上下文路劲:
<%
//pageContext.getRequest().getContextPath()
${pageContext.requst.contextPath}
%>
url-pattern
@WebFilter("/xx")
属性
String[] value() ;
String[] url-patterns() ;
配置方式
1)具体的路径 :只要当前请求到具体的jsp页面的时候,过滤器才会被执行!
/index.jsp
/xxx.jsp
2)指定目录 :当前请求"/user/updatServlet"的时候,过滤器才会被执行
/user/findAllServlet
/user/updateServlet
3)指定后缀名的方式: 只有当请求后缀名为.jsp的时候,过滤器的会被执行
*.jsp
4)通用方式: /* :
请求所有的地址,过滤器都会被执行 (全局的乱码操作!)
Filter里面过滤的方式
@WebFilter里面的属性
DispatcherType[] dispatcherTypes()
返回值DispatcherType 枚举类型
public enum DispatcherType {
REQUEST, ---默认: 直接请求的时候,过滤器作用
FORWARD, --- 请求转发页面跳转的时候,过滤器器起作用
INCLUDE, --- 某个页面被包含的时候,过滤器会被执行
ASYNC, --- 非同步请求的时候,过滤器会被执行
ERROR --- 错误页面跳转,过滤器会被执行
}
栅格系统
1.使用栅格系统之前或者任意页面布局之前
class属性
container:支持固定宽度以及响应格式
container-fluid:类似于100%宽度。占据全部窗口
2.栅格系统
boostrap:针对移动设备进行的流式布局
随着当前屏幕/视口的增加/减少,当前视图随着变化而变化
针对每一个页面布局
12列:一行12个格子
class属性:
row:行----都是用在页面布局容器中
.container
.container-fluid
针对不同的屏幕分辨率的尺寸
分辨率<768px 超小屏幕(手机) class属性 col-xs-当前所占份额
>=768px 小屏幕 clsaa属性 col-sm-当前所占份额
>=968px 中等屏幕 col-md-当前所占份额
>=1200px 大屏幕 col-lg-当前所占份额
小题:
1.Jsp的四个域对象分别是什么
1)pagScope
2)requestScope
3)sessionScope
4)applicationScope
2.c:foreach标签的常用属性
c:foreach
属性
var:循环中的变量名
类型普通for循环
begin:开始循环中的数据
end:结束时候的数据
step:步长语句
index:索引
varStatus:循环中变量的状态
count:序号
3.请求转发和重定向的区别
请求转发:属于服务器行为
地址栏没有变化
两次请求对象是一样的,能够携带数据
只能在当前工程下请求资源,或者转发到WEB-INF下的资源地址
应用场景在Controller控制层
如果有具体业务数据,使用请求转发
重定向:属于浏览器行为
地址栏明显变化
两次的请求对象不一样,只进行页面跳转,不会携带数据
页面跳转可以在当前站点下,也可以访问外部站点,不能直接重定向到当前WEB-INF
应用场景在Xontroller层
仅仅只是一个页面跳转
4.cookie和session的区别
cookie:
存储在浏览器端
存储的数据类型:只能String类型
cookie存储的数据有限制:一个站点20-30个
不安全,不适合存储隐私数据
session:
存储在服务器端
存储的数据类似是任意Java类型
存储的数据没有限制
相对cookie安全
5.线程的状态有几种,以及多线程的实现方式
线程状态:6种
NEW
RUNNABLE
WEATTING
TIMED_WATTING
BLOCK
TERMINTED
三种实现方式:
1)继承自Thread
2)实现Runable接口
3)多线程方式
ExecutorService--->Executors--->public static ExecutorService newFixedThreadPool(int nThread)
1.throw和throws的区别
throw:书写在方法内,后面跟异常对象,表示异常出现肯定性,异常的处理交给逻辑语句
throws:书写在方法声明上,后面可以跟多个异常类名,表示异常出现的可能性,异常的处理交给调用者
2.过滤器的生命周期
无参构造:创建对象
init():初始化方法
doFilter():过滤任务
destroy():销毁
3.TreeSet集合针对自定义对象排序,什么时候自然排序和选择排序
TreeSet集合里面的add方法,依赖TreeMap集合的put方法
如果使用无参构造方法TreeSet<>()---自然排序
自定义类型必须implements Comparable接口
重写compareTo(T t)
如果使用有参构造方法:比较器排序
new Comparator<>(){
//重写compare(T1 t1,T2,t2){
//比较器排序
}
}
4.mysql事务的隔离级别
四个隔离级别:
read uncommitted :读未提交 --安全性最差,会出现脏读现象,读取到未提交的数据
read coommitted:读已提交 --不可重复读,两次的读取数据不一样,能够看出变化
repeatable read:可重复读 --可以防止不可重复读,需要提交事务后,才能显示结果
serializeable :串行话---隔离级别最高
5.数据库的三大范式是什么
1NF:表中的每一列:不可再拆分:独立的
2NF:表中的每一列都完全依赖于主键
3NF:表中的每一个字段不能传递依赖
用户管理系统
1.登录过滤任务
loginFilter
路径:/*
将用户登录的相关资源,排除掉(放行)
/login.jsp
/loginServlet
/checkCodeServlet
/css
/js
/fonts
/img...
获取http://lcalhost:8080/Admin_Project/index.jsp
过滤器doFilter(ServletRequest/ res,ServletRespons resp,ChainFitler...)
//需要将ServletRequest/ServletResponse---->HttpServletRequest,HttpServletResponse
rquest.getURI ;-----String uri
//进行判断即可是否是上面的这些登录的相关资源
放行
如果不是登录相关的资源
判断,用户是否登录过,
从session中获取用户---->如果用户不为null,
登录过,放行
如果用户为null
设置登录页面提示"用户还没有登录过"
请求转发到登录页面login.jsp
通过id进行修改
修改用户:
两个步骤
1)首先的通过id 查询到用户
findUserServlet
接收参数
----->需要通过用户封装数据
如果查询servier--dao层:查询user
将用户对象存储request域中,请求转发update.jsp
----将用户的信息回显到upate.jsp上面
2)修改样用户的信息----->提交update.jsp----->UpdateUserServlet
封装业务数据
调用service
调用dao层
删除选中的条目---执行批量删除
1)前台:完成全选----反选
只要当前第一个复选框和每一个列的复选框保持的checked状态(选中:true,没有选中:false)
2)点击超链接----超链接失效----执行点击事件跳转
选中删除
a href="javascript:void(0)" id="delSelected"
//选中的条目----执行表单提交
3)后台业务
只需要接收这些用户id编号 String[] ids= request.getParamerterValues() ;
调用service----
delSelected(String[] ids)
遍历ids
为了防止:空指针
if(ids!=nulll && ids.length>0){
//遍历
for(String id:ids){
//调用dao层
dao.delete(Integer.parseInt(id));
}
}