javaWEB的复习
程序员文章站
2022-06-14 23:02:00
...
1.http协议
<!--
HTTP协议:
浏览器和服务器之间数据传递的协议
浏览器向服务器通过url地址发送请求 浏览器会将用户端的信息封装为请求报文(服务器会根据请求报文找浏览器要的资源文件)
服务器给浏览器响应 服务器将响应的数据封装为响应报文(服务器将资源文件响应给浏览器,浏览器解析显示)
http协议 数据在传输中必须按照报文格式进行传递
》报文首行
》报文头
》空行
》报文体
浏览器===服务器 发送请求
》请求报文
》请求首行
》请求头
》请求空行
》请求体
请求方式:get(默认),post
get方式请求的请求报文
1、请求首行 (请求方式 请求的资源路径,端口号后面的 get请求参数会在地址后面拼接 url?参数名1=值1&参数2=值2 http协议版本)
提交参数:参数名就是表单项name的属性值, 值就是表单项的value属性值
GET /06_web_HTTP/success.html?username=123213&password=123213 HTTP/1.1
2、请求头(里面都是键值对的形式,保存请求时的系统和浏览器信息)
Host: localhost:8080 主机地址
Connection: keep-alive 保持连接
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36
(用户的系统和浏览器信息,我们通常根据值判断用户使用的浏览器型号和版本)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 告诉服务器当前浏览器支持的数据类型 */*可以支持所有类型的数据
Referer: http://localhost:8080/06_web_HTTP/login.html 如果当前页面从其他页面点击跳转过来的就有referer[广告推广计费,防盗链]
Accept-Encoding: gzip, deflate, sdch, br 服务器在响应数据时可能返回一个压缩过的文件,此请求头告诉服务器浏览器支持哪些压缩格式
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 当前系统支持的语言
get请求没有请求空行和请求体: 请求体是用来携带请求参数,get请求参数在url地址后面拼接了
post请求的请求报文
1、请求首行(请求方式 请求项目路径 http协议版本)
POST /06_web_HTTP/success.html HTTP/1.1
2、请求头
Host: localhost:8080
Connection: keep-alive
Content-Length: 30 请求体中数据的长度(请求参数)
Cache-Control: max-age=0 不缓存
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36
Content-Type: application/x-www-form-urlencoded 内容的类型(请求参数的编码格式)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost:8080/06_web_HTTP/login.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8
3、空行
4、请求体(请求参数 多个参数之间使用&连接)
username=admin&password=123213
post请求和get请求的区别
1、get请求没有空行和请求体,因为提交的参数在url地址后面拼接
2、post请求有请求体和请求空行 post请求参数在请求体中携带
3、get请求相对不安全,post相对安全
4、get请求参数在地址栏后面携带,url地址栏数据大小限制为255个字符,所以get参数大小有限制
5、post参数大小没有限制(只要是上传文件只能使用post请求 )
6、post请求头中多了和参数相关的内容
响应报文
1、响应首行(协议版本 响应状态码[200代表响应成功,404资源找不到,500服务器内部错误,302重定向] 响应状态 )
HTTP/1.1 200 OK
2、响应头
Server: Apache-Coyote/1.1 (服务器内核版本)
Accept-Ranges: bytes (数据单位)
ETag: W/"157-1504593208325"
Last-Modified: Tue, 05 Sep 2017 06:33:28 GMT (访问资源文件的最后修改时间)
Content-Type: text/html (响应文件的类型,浏览器会根据此类型解析文件)
Content-Length: 157 (响应体内容大小)
Date: Tue, 05 Sep 2017 07:01:23 GMT (成功响应的时间)
3、空行
4、响应体(服务器给浏览器的响应体中的内容才是浏览器解析显示在页面中的内容)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
恭喜你,登录成功!!
</body>
</html>
-->
2.servlet
/**
* 所有的Servlet对象是由tomcat服务器创建,不需要手动创建,service()方法也是有服务器在特定情况下调用,对象销毁也是由服务器执行
* Servlet的生命周期
* 对象的创建到销毁的过程就是生命周期
* 对象存在时由服务器自动调用的方法(不是我们手动调用的方法)就是生命周期方法
* 生命周期方法调用
* 构造器:第一次访问Servlet时,服务器会调用构造器创建对象[在一次生命周期中只会调用一次]
* init:构造器调用后,服务器会立即调用init方法[服务器会传入一个对象,可以在此方法中完成一些初始化操作,只会在创建对象后调用一次]
* service:每次请求访问此servlet时服务器都会调用此方法处理用户的请求[接收用户请求,处理请求,给用户响应]
* destroy:正常关闭服务器时,服务器调用此方法销毁servlet对象[对象销毁之前调用,为了释放资源]
*
* 创建Servlet问题
* 1、有些方法没有必要实现,基本不使用
* 2、创建Servlet自己需要在web.xml中配置
* 3、不能直接右键访问
* eclipse提供了一个模板,可以直接创建一个Servlet文件
* --------------------------------------------------------------------------------------
*
* 服务器在调用init方法时会传入一个ServletConfig
* 获取:服务器创建传入,可以直接使用
* 代表:servlet的配置信息,每个Servlet都有唯一的一个ServletConfig对象
* 作用:
* 1、获取Servlet的别名
* 2、获取Servlet中配置的初始化参数[数据库的配置信息可以写在这里]
* 3、获取全局上下文[服务器在启动时会为每个项目创建唯一一个对象代表这个项目],所有的Servlet获取的都是同一个全局上下文对象
*
* ---------------------------------------------------------------------------------------s
* ServletContext:
* 获取:config.getServletContext();
* 代表:服务器在启动时,会为每个部署的项目创建唯一的一个对象,代表整个应用的web.xml配置文件
* 所有的Servlet获取到的都是同一个全局上下文对象
* 作用:
* 1、获取上下文路径 context.getContextPath()
* 2、获取文件的真实路径
* 虚拟路径:http://localhost:8080/07_web_servlet/1.html
* 真实路径(物理): context.getRealPath("2.html")
* D:\workspace\javaweb_0706\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\07_web_servlet\1.html
* 不管资源文件的路径存不存在,都可以获取到它在映射服务器中项目根目录下的真实路径
* 文件上传下载时使用:虚拟路径不能用来保存文件,文件只能通过真实存在的物理路径写入到服务器硬盘中
* 3、可以作为整个web应用的最大的域对象,在项目*享数据
* context.getAttribute
* context.setAttribute
* 4、获取整个web.xml中的配置的初始化参数
*/
3.request,response, 转发和重定向
/**
* HttpServletRequest: 请求报文
* 代表:浏览器请求时的请求报文,请求到达服务器服务器将报文解析封装为这个对象
* 获取:请求到服务器时,服务器直接创建然后传入到service方法中,最终传入到doGet中
* 作用:获取请求报文中的所有数据
* 1、获取请求参数[input表单项提交的数据]
* 2、获取url地址中的所有内容
* 3、获取请求转发器转发请求
* 转发的特点:
* 》通过request对象发起的
* 》转发后地址栏地址没有改变
* 》浏览器只发起了一次请求,最终显示的是转发后的界面
* 》浏览器不知道转发的发生
* 》服务器内部有两个资源文件处理了请求
* 案例:
* 用户在login.html携带账号密码提交登录请求,请求交给LoginServlet处理
* 如果账号密码正确,转发到登录成功页面
* HttpServletResponse: 响应报文 响应首行,响应头,空行,响应体
* 代表:服务器给浏览器的响应报文,请求到服务器时,服务器将服务器的信息封装起来创建为此对象
* 获取:请求到达服务器,服务器创建此对象传入到service中最终传入到doGet中
* 作用:
* 1、向页面响应一个字符串或者html页面片段或者完整的html页面
* response.getWriter().write("页面片段");
* 2、请求的重定向
* response.sendRedirect(location);
* 重定向和转发的区别
* 转发 重定向
* 使用的对象 request response
* 发起者(执行者) 服务器 浏览器
* 浏览器请求次数 1 2
* 浏览器是否感知 不知道 知道
* 浏览器获取响应的次数 1 2
* 地址栏改变 不改变 改变
*
*
*
*
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("hehe");
// response.getWriter().append("Served at: ").append(request.getContextPath());
//根据参数名获取请求参数值
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name+"---"+age);
//主机地址
String serverName = request.getServerName();
int port = request.getServerPort();
String path = request.getContextPath();
String queryString = request.getQueryString();//获取请求参数字符串
System.out.println(serverName+"--"+port+"--"+path+"--"+queryString);
//转发 获取转发器时需要参数:请求转发给哪个资源文件处理
RequestDispatcher dispatcher = request.getRequestDispatcher("1.html");
//发起转发
dispatcher.forward(request, response);
}
/*重定向时,第一次请求时的响应头
* 当访问Servlet时,服务器给了浏览器一个特殊的响应,响应状态码为302,响应头中多了location(值是response.sendRedirect("1.html")设置的参数)
* 浏览器接收到这个特殊响应时,找到响应头中的location对应的地址,然后再次向服务器发起请求
* HTTP/1.1 302 Found
Location: 1.html
* 重定向的特点:
* 1、重定向时浏览器发起了两次请求
* 2、浏览器地址栏地址发生了改变
* 3、一共有两个响应,第一个的响应状态码为302,最终显示的是第二次响应的内容
* 4、重定向是由浏览器来执行
*/
4.乱码问题
/**
* 乱码问题:
* 浏览器的编码格式由当前打开的页面决定,如果页面中设置了编码格式那么浏览器就使用这个,如果没有,浏览器使用系统默认的编码
* 服务器编码格式和解码格式默认就是ISO-8859-1
* 浏览器的解码格式由当前打开的页面决定
*
* 浏览器(编码)-请求--->服务器(解码)
* 服务器(编码)-响应--->浏览器(解码)
* 统一编码和解码就可以解决乱码问题
* 1、get请求乱码 针对整个工作空间的所有项目,解决了所有的get请求乱码
* 浏览器是UTF-8,服务器也要使用UTF-8解码
* 解决:修改服务器的配置文件,告诉他读取请求参数时使用UTF-8解码
* 只解决了get请求乱码(告诉服务器在解析请求首行时使用UTF-8解析数据)
* 在servers项目中server.xml的第65行 给connector标签添加属性 URIEncoding="UTF-8"
* 2、post请求乱码 只针对当前的servlet,每个需要解决post请求乱码的servlet中都需要设置解码格式
* 解决:在使用request对象之前设置解码格式 request.setCharacterEncoding("UTF-8")
*
* 3、响应乱码
* response直接使用ISO-8859-1编码然后交给浏览器
* 3.1 在使用response对象之前设置编码格式
* (不用)response.setCharacterEncoding("UTF-8");只能让字符串不乱吗,浏览器还是不知道如何解析页面字符串
* 3.2 在使用response对象之前设置一个响应头,告诉浏览器如何解析页面,告诉response对象如何读取字符串
* response.setHeader("Content-Type", "text/html;charset=Utf-8");
* response.setContentType("text/html;charset=Utf-8");
*/
5.jsp原理
<body>
<!--
jsp页面和html页面相比就是第一行多了一个声明,文件后缀是.jsp
jsp页面中可以有:
1、html标签[在页面中直接书写html标签]
2、jsp 脚本片段[一段段的java代码]
3、jsp表达式[直接向页面上输出一段文本,写到响应体中]
jsp运行原理:
jsp的本质就是一个servlet
jsp页面只能在服务器上运行
jsp页面在访问时
》服务器会将hello.jsp页面翻译为一个servlet.java文件
》服务器会编译servlet.java为servlet.class文件
》服务器创建servlet.class的对象
》调用servlet.class的service()方法处理用户的请求
我们学习jsp语法规范就是学习服务器如何将jsp页面翻译为一个servlet.java文件
翻译后的jsp对应的java类保存在映射服务器的work文件夹中
》翻译后的java类
-继承HttpJspBase,HttpJspBase extends javax.servlet.http.HttpServlet
-所以翻译后的java文件就是一个Servlet
-_jspService 处理用户请求的方法
-页面中所有的内容都是在service方法中进行转换了
转换规则:
》html标签+html注释:标签内容都作为out.write()的参数写到响应体中
》jsp脚本片段:直接放到service方法中,所以jsp脚本片段必须要符合java语法规范,一个页面中可以有多个脚本片段
》jsp表达式:可以向页面输出一个对象或变量或字符串,相当于作为 out.print()的参数输出+-
-->
<h2>hello jsp</h2>
<%
//java代码
System.out.println("hello , jsp");
int i = 100;
%>
<%="<h2>天王刘德华</h2>" %>
<%
System.out.println(i);
%>
</body>
上一篇: 获取cookie值解决方法
下一篇: MySQL修改用户密码,新手必看