Servlet与JSP进阶

请求的结构(上)

1、HTTP请求包含三部分:请求行,请求头、请求体;
1)请求行:1、请求方法,2、请求URL ,3、HTTP协议及版本;
2)请求头:Accept-Language:zh-CN :代表的是中文;
User-Agent:说明自己使用的操作系统以及浏览器环境;
Content-Length:内容的长度;
3)请求体:name=xixi&password=123&realName=xixi

请求的结构(下)

三部分:请求行 请求头 请求体
请求行:请求方法、请求URL、HTTP协议及版本
请求头:Accept-Language User-Agent:浏览器的环境 Content-Length:内容的长度 Cache Cookie
请求体(只有post请求才会有,get放在了url中): name=imocc&password=12345678&realName=imooc

F12 开发人员工具
network标签很重要
(重新提交后,会出现Name)
1、Get请求:
Gereral: Request URL:请求的地址 Request Method:请求的方法 Status Code:响应返回的结果是否正确 Remote Address:端口号
Request Headers: Accept:浏览器能处理哪些内容(text/html) Accept-language(语言环境)User-Agent:操作环境
Query String Parameter:查询字符串参数 (重要)
2、Post请求
保存在请求体中
F12
最小面From Data中 查看请求体中存储的Data

get请求把请求放在url中
post请求把请求放在请求体(requset中) 他们存贮数据的格式是完全相同的

利用请求头开发多端应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package me.feihong.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class UserAgentServlet
*/
@WebServlet("/ua")
public class UserAgentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public UserAgentServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userAgent=request.getHeader("User-Agent");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(userAgent);
String output="";
if(userAgent.indexOf("Windows NT")!=-1) {
output="<h1>这是PC端</h1>";
}else if(userAgent.indexOf("iPhone")!=-1||userAgent.indexOf("Android")!=-1) {
output="<h1>这是移动端</h1>";
}
response.getWriter().println(output);
}

}

响应的结构

1、HTTP响应包含三部分:响应行、响应头、响应体;
响应行:1、报文协议及版本;2、状态码及状态描述;
响应头:Content-Type:text/html;

HTTP常见状态码:
200 : 服务器处理成功;
404 :无法找到文件;
500 :内部服务器错误;
403 : 服务器拒绝访问;
301,302:请求重定向;
400 :无法请求;
401 :未经过授权;
503 :服务器超负载或正停机维护,无法处理请求;

源代码和响应体的内容是完全一致的,通过相应头的content-type将源代码转为为对应的格式(例如html格式)

ContentType的作用

ContentType决定浏览器采用何种方式对响应体进行处理

请求转发与响应重定向的使用

1
2
3
4
5
6
// 转发请求 浏览器地址栏不会改变
// (服务器内部将请求转发给另一个资源)
request.getRequestDispatcher(url).forward(request,response)
// 响应重定向,url需要加contextPath
// 地址栏会变成最后的url (处理完成第一个请求之后返回一个特殊的响应给浏览器由浏览器重新发起另一个请求到新的资源)
response.sendRedirect(url);

请求转发与响应重定向的原理

请求转发与响应重定向的原理:
1、 请求转发是服务器跳转,只会产生一次请求;
2、请求转发的语句是:request.getRequestDispatcher().foeward();

请求转发的流程:
启动浏览器,输入URL以后,浏览器会产生一个请求,发送到Tomcat上,在Tomcat里面会有对应的Servlet对这个请求进行处理,当Servlet1在处理完之后调用了请求转发语句的时候,它就会把这个请求原封不动的发送给Servlet2,注Servlet1与Servlet2的内容是完全相同的,它不会做任何的修改,然后,Servlet2处理完后,Servler2进行响应,把响应的结果返回给浏览器。

响应重定向:
1、重定向是浏览器端跳转,会产生两次请求;
2、响应重定向的语句是:response.sendRedirect();

响应重定向的执行流程:
启动浏览器,输入URL以后,浏览器会产生一个请求,发送到Tomcat上,在Tomcat被接收转发给了Servlet1,Servlet1处理完以后就会调用响应重定向的语句,Servlet1会马上返回一个特殊的响应,送回给浏览器,它会不显示HTML页面,而是这个响应会要浏览器重新生成一个请求跳转到新的地址上,然后浏览器会生成一个请求2,在由Tomcat把这个新的请求2转发给Servlet2,Servlet2处理完后就会将这个响应2再次返回给浏览器,然后浏览器就会显示新的地址了。

设置请求自定义属性:
1、请求是允许创建自定义属性的;
2、设置请求属性:request.setAttribute(属性名,属性值); //属性名必须是字符串,属性值则可以是任何有效的Java对象;
3、获取请求属性:
Object attr = request.getAttribute(属性名);

注意注意:响应重定向因为获得的request是接受的服务器不同的指令,故二个Servlet中的request的attribute并不会共享

浏览器Cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Cookie 对象 方法 getName,就是key值 getValue() 是value值
setMaxAge() 设置cookie存在时间
注意的是: 什么时候用request,什么时候用response.去调用实例对象




//获取cookie列表
String s = null;
Cookie[] cookies = request.getCookies();
//当原来的cookie保存到期了,Cookie就是null.所以要防止
if ( cookies == null ) {
response.getWriter().println("用户未登录");
return;
}
Cookie cookie = new Cookie(String key, String value); //创建Cookie对象并实例化
cookie.setMaxAge(60*60*24); //设置cookie的存在时
response.addCookie(cookie);//将实例化的对象添加到??
上面一般在一个servlet中完成。如用户登录页面

Cookie [] cookies = request.getCookies(); //request.getCookies();
会得到一个Cookie的数组
遍历并判断是否存在用户名
for (Cookie c : cookies) {
if (c.getName().equals("user")) {
s = c.getValue();
break;
}
}
if (s!=null) {
response.getWriter().println("success");

}else {
response.getWriter().println("用户未登录");

}
}

用户会话Session对象

Session(用户会话)用于保存于“浏览器窗口”对应的数据。它于Cookie的不同是:Cookie保存的数据在客户端,二Session保存的数据在服务器。
session是与窗口绑定的,保存在tomcat服务器的数据是30分钟.
Session通过浏览器Cookie的SessionId提取对应用户的数据

Session的实现原理

浏览器1第一次向Tomcat发送请求时,会在Tomcat的内存中开辟一块存储用于本次会话的空间,并给它一个ID号(SessionId)返回给浏览器。然后如果浏览器传输值过来的话会把值放到那块Tomcat开辟的空间中然后保存,当Servlet处理完之后,然后Tomcat就会把刚刚生成的SessionId随着响应返回给浏览器,然后浏览器会把这个值存储到Cookie中。当第二次浏览器发送请求之后,就会有把存储到Cookie里面的SessionId取出来发送给Tomcat,当看到传过来的SessionId 就会根据Id 查找相应的值,然后响应。

ServletContext与三大作用域对象

ServletContext与三大作用域:
1、ServletContext (Servlet上下文对象),是Web应用全局对象;
2、一个Web应用只会创建一个ServletContext对象;
3、ServletContext 随着Web应用启动而自动创建;

Java Web 三大作用域对象:
1、HttpServletRequest -请求对象 生命周期最短 request是瞬时对象;
当一个请求送往Tomcat之后,这个请求就会被创建,当Servlet处理完成之后,产生了响应,并且返回给浏览器,则当前的请求对象就会被销毁;
2、HttpSession - 用户会话对象 生命周期比request长一点 ;
Session是被用户第一次发来请求的时候创建的,默认情况下Session在30分钟内没有被访问就会被销毁, 把浏览器关掉其实是将存储在cookie中的sessionid抛弃,并没有被销毁;
3、ServletContext - web应用全局对象 作用范围最大 生命周期最长;
ServletContext在Web应用程序启动的时候创建的,Web应用程序重启或
关闭后才会被销毁;
注:在工作中如果能用作用域小的来实现功能就别用大的作用域来实现功能;

-------------本文结束感谢您的阅读-------------