Java Web基本概念
1 基本概念
1.1 静态Web
-
如果服务器上有资源我们就可以直接读取
-
每个人看到的网页是一样的
1.2 动态Web
- 页面展示效果会因人而异人
- 可以和数据库交互(数据库持久化)
2 Web服务器
2.1 技术
ASP
-
微软:国内最早流行
-
Html+VB
-
一个基本页面都用几千行代码,业务混乱,维护成本高
-
C#
-
IIS
PHP
- 开发速度快,跨平台,代码简单
- 无法承载大访问量
JSP/Servlet
- sun公司退出的B/S架构
- 基于Java语言
- 可以承载高并发、高可用、高性能
- 语法像ASP
2.2 服务器
处理用户请求,响应用户信息
IIS
- 微软的,windos自带
Tomcat(熟悉后尝试手写)
- 技术先进、开源、免费,是调试和开发JSP/Servlet程序的首选
网站是如何进行访问的
-
输入一个域名;回车
-
检查本机的C:\WindowslSystem32ldriversletc\hosts配置文件下有没有这个域名映射;
- 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1 www.baidu.com
- 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;
3 Http协议
3.1 什么是Http
-
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
-
文本: html,字符串,~-……
-
超文本:图片,音乐,视频,定位,地图…
-
端口号:80
-
-
Https:安全的. 443
3.2、两个时代
- http1.0
- HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接.
- http2.0
- HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
3.3、Http请求
-
客户端—发请求(Request)—服务器
- 百度
Request URL:https://www. baidu .com/ 请求地址 Request Method :GET get方法/post方法 Status code : 200 oK 状态码: 200 Remote(远程)Address : 14.215.177.39:443
Accept:text/html 类型 Accept-Encoding:gzip, deflate, br 编码 Accept-Language:zh-CN , zh;q=0.9 语言 cache-control :max-age=o 缓存控制 connection :keep-alive 链接保持
请求行
-
请求行中的请求方式:GET
-
请求方式: Get,Post,HEAD,DELETE,PUT,TRACT…
-
get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
-
post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
-
消息头
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式GBK UTF-8G82312 Iso8859-1Accept-Language:告诉浏览器,它的语言环境
cache-contro1:缓存控制
connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
3.4、Http响应
-
服务器—响应—客户端
-
百度
Accept:text/html 类型 Accept-Encoding:gzip, deflate, br 编码 Accept-Language:zh-CN , zh;q=0.9 语言 cache-control :max-age=o 缓存控制 connection :keep-alive 链接保持
-
响应体
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式GBK UTF-8G82312 Iso8859-1Accept-Language:告诉浏览器,它的语言环境
cache-contro1:缓存控制
connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
Refresh:告诉客户端,多久刷新一次
Location: 让网页重新定位
响应状态码
200:请求响应成功
3xx:请求重定向
- 重定向:你重新到我给你新位置去;
4xx:找不到资源 404
- 资源不存在;
5xx:服务器代码错误 500 502网关错误
<mirror>
<id>nexus-aliyun</id>
<mirrorof>* , !jeecg, !jeecg-snapshots</mirrorof>
<name>Nexus aliyun</name>
<ur1>http://maven.aliyun.com/nexus/content/groups/pub1ic</ur1>
</mirror>
4 HttpServlet
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
4.1 HttpServletResPonse
对方法的简单分类
负责向浏览器发送数据的方法
servletoutputstream getoutputstream() throws IOException;
Printwriter getwriter() throws IOException;
负责向浏览器发送响应头方法
void setcharacterEncoding(string var1);
void setcontentLength(int var1);
void setcontentLengthLong(long var1);
void setcontentType(string var1);
void setDateHeader(string var1,1ong var2);
void addDateHeader(string var1,1ong var2);
void setHeader(string var1,string var2);
void addHeader(string var1,string var2);
void setIntHeader(string var1,int var2);
void addIntHeader(string var1,int var2);
常见应用
-
向浏览器输出消息
-
下载文件
public class Fileservlet extends HttpServlet { @override protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { //1.要获取下战文件的路径 string realPath = this.getServletContext().getRealPath("/1.png"); system.out.println("下载文件的路径:"+realPath); // 2.下教的文件名是啥? string fileName = realPath.substring(realPath.lastIndexOf("\\")+ 1); // 3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西中文文件名URLEncoder.encode编码,否则有可能乱码 resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8")); //4.获取下戟文件的输入流 FileInputStream in = new FileInputstream(realPath); // 5.创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; //6.获取Outputstream对象 ServletOutputStream out = resp.getOutputStream(); // 7、将FiLeoutputStream流写入到buffer缓冲区,使月outputStream将缓冲区中的数据输出到客户端! while ( ( len=in.read(buffer))>0){ out.write(buffer, off: 0,len); } in.close(); out.close(); } }
-
重定向
/* * resp.setHeader("Location" , " / r /img"); * resp.setstatus (302); */ resp. sendRedirect("/");
4.2 HttpServletRequest
常见应用
-
获取前端传递的参数
-
请求转发
-
重定向和转发的区别?相同点
-
页面都会实现跳转不同点
-
请求转发的时候,url不会产生变化·重定向时候,url地址栏会发生变化;
-
5 Cookie、Session
-
会话:从浏览器打开到关闭是一次会话
-
有状态会话:标记是否登陆过
一个网站,怎么证明你来过?
-
服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了(cookie)
-
服务器登记你来过了,下次你来的时候我来匹配你(seesion)
5.1 保存会话的两种技术
Cookie
客户端技术(请求、响应) (C:user\{user}\AppData\…)
-
从请求中拿到cookie信息
-
服务器响应给客户端cookie
cookie[] cookies = req.getcookies();//获得cookie
cookie.getName();//获得cookie打的key
cookie.getvalue();//获得cookie中的v1aue
new cookie("name",string);//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addcookie(cookie);//响应给客户端一个cookie
-
缺点
-
一个Cookie只能保存一个信息;
-
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;. Cookie大小有限制4kb;
-
300个cookie浏览器上限
-
Session
服务器技术
什么是Session
- 服务器会给每一个用户(浏览器)创建一个Seesion对象;
- 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–>保存用户的信息;保存购物车的信息…
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name" , "value");
//d得到Session中存东西
session.getAttribute("name" , "value");
//删除Session中存东西
session.removeAttribute("name" , "value");
//获取Session的ID
string sessionId = session.getId();
//判朗session是不是新创建
session.isNew( )
Session和cookie的区别
-
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
-
Session把用户的数据写到用户独占Session中用户只保存SessionId,服务器保存数据(保存重要的信息,减少服务器资源的浪费)
-
Session对象由服务创建
6 Filter过滤器
重写Filter的方法
//初始化: web服务器启动,就以及初始化了,随时等待过滤对象出现!
public void init( FilterConfig filterConfig) throws ServletException {
system.out.print1n("CharacterEncodingFilter初始化");
}
//Chain :链
/*
* 1.过滤中的所有代码,在过滤特定请求的时候都会执行
* 2.必须要让过滤器继续同行,chain.doFilter ( request, response)
*/
public void doFilter(ServletRequest rnequest,ServletResponse response,FilterChain chain) throws TOException,ServletExcept{
request.setCharacterEncoding( "utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
system.out.print1n("CharacterEncodingFilter执行前....");
//让我们的请求继续走,如果不写,程序到这里就被拦截停止!
chain.doFilter(request,response);
system.out.println( "CharacterEncodingFilter执行后....");
}
//销毁: web服务器关闭的时候,过滤会销毁
public void destroy() {
system.out.print1n("CharacterEncodingFilter销毁");
}
7 Listen监听器
//HttpSessionListenerj
public class Listener implements HttpSessionListener {
//创建session监听
//一旦销创建Session就会触发一次这个事件!
public void sessionCreated(HttpsessionEvent se) {
}
//销毁session监听
//一旦销数Session就会触发一次这个事件!
public void sessionDestroyed(HttpsessionEvent se) {
}
}