Http请求相关

一:请求请求数据包

1)GET /servlet-day01/hello HTTP/1.1

2) Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-cn) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5
Cache-Control: no-cache
Accept-Encoding: gzip

3) 实体内容

二:响应数据包

1) HTTP/1.1 200 OK

2) Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 15

Date: Wed, 06 Sep 2017 16:28:31 GMT

3) 实体内容

get请求

(1)直接输地址
(2)表单请求。

post请求

(1)哪一些情况下,浏览器会发送post请求
设置表单的method=”post”
(2)特点
a.不会将请求参数显示在浏览器地址栏,相对安全
注:并不会对请求参数加密。
b.会将请求参数添加到实体内容里面,所以,可以
提交大量数据给服务器。
2.如何读取请求参数值?
(1)request提供的getParameter方法。
String getParameter(String paramName);
注:
a.如果请求参数名写错,会返回null值。
b.如果不填写任何数据,会获得空字符串。
(2)request提供的getParameterValues
String[] getParameterValues(String paramName);
注:
a.当有多个请求参数名相同时,用该方法。
b.多选框,如果不选择任何选项,浏览器不会发送
任何数据给服务器。
3. 处理表单中文参数乱码问题
(1)为什么会有乱码?
表单提交时,浏览器会对中文参数值进行编码。服务器端
默认会使用iso-8859-1来解码。
注:
会使用表单所在的页面打开时使用的字符集来编码。
(2)如何解决?
1)情形1 表单提交方式为post
request.setCharacterEncoding(“utf-8”);
注:要加到所有的request.getParameter方法前面。
2)情形2 表单提交方式为get
设置
注: 只针对get请求有效。
Servlet是一个java类可以通过DBUtil链接数据库。

[Employee [id=2, ename=小红, salary=6000.0, age=22],

Employee [id=3, ename=谢攀, salary=8000.0, age=27],
Employee [id=1, ename=夜华, salary=10000.0, age=20]
]

:常见的错误

(1)500
注:500是状态码,表示系统错误。
1)产生的原因:
a.web.xml文件配置错误。
比如将类名写错。
b.源代码写错。
比如,没有继承HttpServlet。
(2)404
注:404是状态码,表示依据请求路径找不到对应的资源。
1)产生的原因
a.没有部署应用
b.访问地址写错
(3)405
注:405是状态码,表示找不到处理方法。
1)产生的原因
a.service方法签名错误(方法名,参数类型,异常类型,返回类型写错)

1.重定向

(1)什么是重定向?
服务器通知浏览器,向一个新地址发送请求。
注:
服务器可以发送一个302状态码以及一个location消息头(
值是一个地址,称之为重定向地址)给浏览器,浏览器收到之
后,会立即向重定向地址发送请求。

(2)如何重定向?
response.sendRedirect(String url);
注:url就是重定向地址。
注: 重定向之前,容器会清空response对象上存放的所有数据。
也就是说,实体内容里面是没有任何数据的。
(3)特点
a.重定向地址是任意的。
b.重定向之后浏览器地址会发生变化。
2.Servlet容器如何处理请求资源路径?
比如 http://ip:port/servlet-day03/abc.html
“/servlet-day03/abc.html”
step1. 容器默认会认为访问的是一个servlet
即查找和”/abc.html”匹配的servlet。
注:
匹配规则:
a.精确匹配:
/abc.html
b.通配符匹配:
/*
/demo/*
*:匹配零个或者多个任意的字符。
c.后缀匹配:
*.do
*.do 匹配所有以.do结尾的请求。
step2.如果找不到匹配的servlet,则访问对应的文件。
找到了就返回该文件。如果找不到,返回404。
3.如何让一个servlet处理多种请求?
step1. 采用后缀匹配。
step2. 分析请求资源路径,依据分析结果,来调用
不同的分支来处理。

4.转发

(1)什么是转发?
一个web组件将未完成的任务交给另外一个web组件继续做。
转发的本质: 一个web组件通知容器去调用另外一个web组件。
注:
a.web组件,指的是servlet或者jsp。
b.一个servlet将数据转发给一个jsp,由jsp将数据以合适的
方式展现出来。

(2)如何转发?
step1.将数据绑订到request。
request.setAttribute(String name,Object obj);
注:
Object request.getAttribute(String name);
step2.获得转发器。
RequestDispatcher rd =
request.getRequestDispatcher(String url);
注: url转发的目的地。
step3.转发
rd.forward(request,response);
(3)特点
a. 转发之后,浏览器地址栏的地址是不变的。
b. 转发目的地有限制(要求是同一个应用)。
1,状态管理
(1)什么是状态管理?
将浏览器与服务器之间多次交互当做一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
(2)如何进行状态管理。
1)将状态保存在客户端(浏览器);
cookie
2)将状态保存在服务器端;
session
(3)Cookie
1)什么是Cookie
服务器临时存放在浏览器端的少量的数据
2)工作原理
当浏览器访问服务器时,服务器会将少量数据发送给浏览器(使用set-cookie消头),
浏览器会将这些数据临时保存下来;
当浏览器再次访问服务器时,会将之前保存的数据发送给服务器(使用cookie消息头)
3)添加cookie
Cookie c=new Cookie(String name,String value);
response.addCookie(c);
4)读取cookei
Cookie[] request.getCookei();
注:有可能返回null。
String cookie.getName();
String cookie.getValue();
5)编码问题
a,cookie只能保存合法的ascii字符,如果是中文,需要将中文转换成合法的ascii字符串
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
b,建议添加cookie时,都统一编码。
6)生存时间问题
a,默认情况下,浏览器会将cookie保存在内存里面。
只要浏览器不关闭,cookie就会一直保存,浏览器一关闭
cookie就会被删除。
b,cookie.setMaxAge(int seconds)
注:
b1. seconds单位是秒。
b2. 当seconds > 0时,浏览器会将cookie保存在硬盘上
(文件的形式存放),超过指定时间,浏览器会销毁该cookie。
当seconds < 0时,默认值(即保存在内存里面)。
当seconds = 0时,删除cookie。
比如,要删除一个名称为username的cookie:
Cookie c = new Cookie(“username”,”“);
c.setMaxAge(0);
response.addCookie(c);
7) cookie的路径问题
a.浏览器访问服务器时,会比较cookie的路径是否与
要访问的路径匹配,只有匹配的cookie才会被发送。
b.cookie的默认路径
默认等于添加该cookie的web组件的路径。
比如 /servlet-day06/biz01/addCookie.jsp添加了
一个cookie,则该cookie的默认路径就是
/servlet-day06/biz01
c.匹配规则
要访问的路径必须等于cookie的路径或者是其子路径,
符合该要求的cookie才会被发送出去。
比如,cookie的路径是 /servlet-day06/biz01,
则:
/servlet-day06/findCookie1.jsp 不会
/servlet-day06/biz01/findCookie2.jsp 会
/servlet-day06/biz01/sub/findCookie3.jsp 会
d.cookie.setPath(String path)
注:该方法用于设置cookie的路径
8) cookie的限制
a.可以被用户禁止。
b.只能保存少量的数据(大约4k左右)。
c.保存的数量也有限制(大约几百个)。
d.只能保存字符串,对于中文,需要编码。
e.不安全。

2,Session
(1)什么是Session?
服务器端为保存状态而创建的一个特殊的对象。
(2)工作原理
浏览器访问服务器时,服务器会创造一个session对象(该对象有一个唯一的id,
一般称为sessionId),服务器会将这个sessionId发送给浏览器(默认以Cookie
的方式发送),浏览器会将sessionId保存下来(保存在内存);当浏览器在次
访问服务器时,会将sessionId发送给服务器,服务器根据sessionId找到对应的
sessionId对象。
(3)获取session对象
1)HttpSession s=request.getSession(boolean flag);
a,当flag为true时
先查看请求中有没有sessionId,如果没有,则创建session对象;
如果有sessionId,则依据该sessionId去查找对应的session对象,
(如果找到了,则返回该对象,如果找不到,则创建一个新的
session对象)。
b,当flag为false时
先查看请求当中有没有sessionId,如果没有,返回null;
如果有sessionId,则依据该sessionId去查找对应的session对象
(如果找到了,则返回该对象,找不到,返回null)
2)HttpSession s=request.getSession();等价与request.getSession(true);
(4)绑定数据相关的几个方法
session.setAttribute(String name,Object obj)
Object session.getAttribute(String name);
removeAttribute(String name);
(5)session超时
1)什么是session超时?

    2)session.setMaxInactiveInterval(int seconds);
(6)删除session
    session.invalidate();       

3,session验证
step1.登录成功之后,在session对象上绑订一些数据,比如
session.setAttribute(“user”,user);
step2.当用户访问需要保护的资源的时候(只有登录成功才能访问的资源) Object obj = session.getAttribute(“user”);
if(obj == null){
//没有登录
response.sendRedirect(“login.jsp”);
}

过滤器

(1)什么是过滤器
    servlet规范当中定义的一种组建,用来拦截容器的调用过程。
    注:
        容器收到请求之后,如果有过滤器,则先调用过滤,然后在调用servlet。
(2)如何写过滤器?
    step1,写一个java类,实现Filter接口。
    step2,在接口方法当中实现拦截处理逻辑。
    step3,配置过滤器
(3)初始化参数
    step1,配置初始化参数
    step2,调用FilterConfig提供的getInitParameter方法读取初始化参数
(4)过滤器的优先级
    当有多个过滤器都满足过滤条件时,则容器依据<filter-mapping>配置的先后顺序来执行。
(5)优点
    1)在不修改源代码的基础上,为程序添加新的功能
    2)将多个模块相同的代码集中写在一个类里面,方便代码的维护。

(2),监听器
(1),什么是监听器?
servlet规范当中定义的一种特殊的组件,用来监听容器产生的事件并进行响应的处理。
注:容器会产生量大类事件
1)生命周期相关事件
容器产生或销毁request,session,sevlet上下文产生的事件。
2)绑定数据相关的事件
调用了request,session,sevlet上下文的setAttribute,removeAttributer产生的事件。
(2)如何写监听器?
step1,写一个java类,依据监听的时间类型实现响应的接口。
比如,要监听session对象的创建和销毁,可以实现HttpSessionListener接口。
step2,在监听接口方法中实现监听处理逻辑。
step3,配置监听器
(3)Servlet上下文
1)什么是servlet上下文?
容器启动之后,会为每一个web应用创建一个实现了ServletContext接口要求的对象,
该对象可以称之为Servlet上下文。
特点:
a,唯一性;一个web应用对应一个servlet上下文。
b,一直存在;只要容器没有关闭,应用没有被卸载,Servlet上下文就会一直存在。
2)如何获取Servlet上下文?
GenericServlet,ServletConfig.Httpsession,FilterConfig都提供了一个方法
(getServletContext)来获得servler上下文。
3)作用
a,绑定数据
setAttribute,removeAttribute,getAttribute
在满足使用条件的情况下,优先使用生命周期短的。
(request

servlet线程安全问题

(1)为什么说Servlet会有线程安全问题?
    a,容器默认情况下,对于某个Servlet,只会创建一个实例。
    b,容器收到请求,就会启动一个线程来处理,就有可能有多个线程同时访问一个servlet实例。
        (比如,这些线程去修改servlet的属性值),就有可能产生线程安全问题。
(2)如何解决?
    a,枷锁
        使用synchronized对有线程安全问题的代码枷锁。
    b,尽量避免修改属性值。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值