Day03
1、Request
含义:
ServletRequst(请求对象,封装了请求信息的方法)
HttpServletRequest
常用功能:
一、获取请求参数
二、获取请求头信息
三、获取其它信息
2、防盗链
场景:防止资源被其它网站引用。
实现:
3、URLEncoder & URLDecoder
URLEncoder:对URL字符串编码,如在浏览器上输入链接携带中文参数时会出现明文,这是因为浏览器对中文进行编码导致的。
URLDecoder:对URL字符串进行解码。
案例:
4、乱码
来源:由于编码和解码不一致导致
案例1:html文件乱码
若html的文件编码是utf-8,浏览器要正常打开html,浏览器必须采用utf-8去解。
或者简写:
案例2:get请求方式乱码
原因:req.getParameter(参数名) //默认是采用ISO8859-1去解码
方案:
1>如果浏览器是通过utf-8编码后提交数据的。
String name =req.getParameter("userName");
name = newString(name.getBytes("ISO8859-1"), "UTF-8");
2>如果浏览器是通过gbk编码后提交数据的。
String name =req.getParameter("userName");
name = newString(name.getBytes("ISO8859-1"), "gbk");
案例3:post请求方式乱码
原因:req.getParameter(参数名) //默认是采用ISO8859-1去解码的
方案:覆盖 req的默认解码的码,设置为浏览器的编码方式。
1>浏览器是通过utf-8编码后提交数据的。
//在获取参数前添加
req.setCharacterEncoding("utf-8");
String name =req.getParameter("userName");
2>浏览器是通过gbk编码后提交数据的。
req.setCharacterEncoding("utf-8");
String name =req.getParameter("userName");
注意:req.setCharacterEncoding("utf-8");//这句话对get请求无效的。
5、包含
含义:将当前的资源和下一个资源合并一起响应给客户端。
用法:req.getRequestDispatcher("下一个资源").include(req,resp);
案例:
第一个资源:
第二个资源:
6、MVC设计模式
含义:是一种将业务逻辑、数据与界面分离,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
M:表示model(模型):表示应用程序核心,即一个项目中业务逻辑的那部分。
V:表示view(视图):显示数据
C:表示controller(控制器):接收请求。
用户注册案例:
RegisterController.java RegisterService.java User.java register.html
7、会话
含义:当用户打开浏览器A,在该浏览器A多次点击链接,最后关闭整个浏览器A的过程,叫做一次会话。
问题:因为http协议是无状态的(意思是说服务器不会保存之前浏览器访问的记录),也就是说一次会话中多个请求数据不能共享。
场景1:假设一次会话中,用户多次购买了多个商品,如何保证调到购买页面还能将之前添加的商品一块结算?
场景2:假设一次会话中,用户多次购买了多个商品,用户关闭浏览器,然后打开同一个浏览器,如何保证新的会话可以拿到之前添加的商品?
场景3:京东购物车实现原理(思考四种情况,购物车是否还存在)
实现方案:
1、保存cookie【浏览器技术】
2、保存session【服务器技术】
3、持久化到数据库
8、cookie
含义:cookie是由服务器创建,位于浏览器中,每次请求都会将cookie携带到浏览器
用法:
案例:使用cookie实现自动登录功能
1、第一次请求时,判断账号密码是否正确,如果正确则判断是否自动登录,若允许自动登录,则将账号密码保存cookie
2、非第一次请求时,则从cookie中获取账号密码,判断账号密码是否正确
9、session
含义:服务器技术,服务器会为用户的浏览器分配一个session对象,当下次如果要用户的数据就从用户的浏览器对应的session中获取。
存活期:
Session对象在服务器中默认是30分钟有效(从最后一次访问开始计时),可在web.xml配置
或通过代码setMaxInactiveInterval(秒) (注:通过代码优先级高于配置)
api详解:
req.getSession()等价req.getSession(true) //之前没有session对象,则创建,否则返回
req.getSession(false) //若之前没有则返回null,若有则返回[不建议]
getId() //获取session对象的唯一表示id
setMaxInactiveInterval(秒); //设置session存活期(优先于web.xml的session配置)
invalidate() //清空session的数据并使当前session无效(用于退出系统)
setAttribute(key,value) //往session添加数据
getAtrribute(key) //从session取数据
10、Servlet三大域对象
ServletContext域
Session域
Request域
11、禁用cookie
服务器能找到浏览器对应的session,是根据Cookie技术+名JSESSIONID的cookie
总结:Session 依赖于Cookie + JSESSIONID
解决方案:URL重写
|--手动在URL后面添加;jsessionid=xxx 比如:http://localhost:8081/Day03/context2;JSESSIONID=7F6CC306F2DB17BC389A0D70EFA06308
|--通过Response自带方法
|--resp.encodeRedirectURL(url)
|--resp.encodeURL(url)
12、购物车案例
13、jsp
设置jsp的配置信息
include
taglib
page
语法:<%@ page 属性=属性值%>
language="java" //代表脚本的语言java
contentType="text/html; charset=utf-8" //告诉浏览器mine ,解码,jsp的编码
pageEncoding="utf-8" //跟上面一样
session="true" true | false //要不要为jsp创建session对象【如果之前有就不创建】
isThreadSafe="true" true|false
autoFlush="true" true | false true :自动刷新缓存 false:不自动刷新缓存【建议手动flush,不然可能造成缓存溢出】
buffer="8kb" none|xxkb 缓存大小【jsp缓存】
buffer = none不能和autoFlush=false同时使用
autoFlush = false buffer =具体kb ,可能会造成缓存溢出
import="" 导包
errorPage="" 当当前的jsp报错的时候转发那个页面来显示 【转发】
isErrorPage="false" true | false表示当前jsp是不是专门用于处理异常的
false 没有excpetion对象,并且响应码是200
true 有excpetion对象,并且响应码是500
isELIgnored="false" true | false是不是要忽略EL表达式