1、Java Web
1.1、web 应用程序
web应用程序:可以提供浏览器访问的程序
- a.html 、b.thml 多个web资源,这些web资源可以被外界访问,对外界提供服务;
- 你能访问到的任何一个资源或页面,都存在在这个世界上的某一个角落的计算机上;
- URl
- 这个统一的web资源会被放在同一个文件夹下,web应用程序----------->tomcat服务器
- 一个web应用由多个部分组成
- html,css,js
- jsp/Servlet
- java程序
- jar包
- 配置文件(Properties)
1.2、静态web
-
*.htm, *.html 这些都是网页的后缀,如果服务器上一直=存在这些东西,我们就可以直接读取。通络:
-
静态web存在的缺点
-
web页面无法动态更新,所有用户看到的都是同一个页面
- 轮播图、点击特效:伪动态;
- javascript[实际开发中,用的最多]
- VBScript
-
他无法和数据库交互(数据无法持久化,用户无法交互)
-
1.2、 动态Web
缺点
- 加入服务器的动态web资源出现了错误,我们需要重新编写后台程序
优点
- 可以解决静态资源的缺点;
新手村:---------->魔鬼训练----->PK场
2、web服务器
2.1、技术讲解
ASP
- 微软:国内最早流行的就是ASP
- 在HTML中嵌入了VB,ASP+COM;
- 在ASP开发中,基本一个页面
- 维护成本高
- C#
- IIS
PHP
- PHP开发速度快,功能强大。跨平台,代码简单*(70% WP);
- 无法承载大访问量的情况
JSP/Servlet
B/S:浏览器和服务器
C/S:客户端和服务器
- sun公司主推的B/S架构
- 基于Java语言的(所有得到大公司,或者开源组件,几乎都用的Java写的)
- 可以承载三高问题所带来的影响
- 语法像ASP,ASP-->JSP/Servlet
2.2Web服务器
IIS
微软的:ASP.......Windows
tomcat
3、Tomcat
3.1、安装
3.2、启动
你可能遇到的问题:
- Java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问退:配置文件中设置
3.3、配置
可以配置的端进号:
- tomcat的默认端口为:8080;
- mysql :3360;
- http:80
- https:443;
可以配置的主机名;
-
默认主机名:localhost-->127.0.0.1
-
默认网站存放位置webapps
<host name="www.localhost.com" appbase="webapps" unpackWARs="true" autoDeploy="true"
高难度面试题
请你谈谈网站是如何进行访问的;
- 输入域名:回车
- 检查本机的配置文件有没有这个域名的映射
- 有就直接返回对应的ip
- 没有:去DNS服务器找
3.4、发布一个web项目
4、http
4.1、什么是http
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本: html、字符串.....
- 超文本:图片、音乐、视频
- 80
https:安全的
- 443
4.2、两个时代
-
http1.0
- http/1.0:客户端可以与web服务器连接后,只能获取一个web资源,断开链接;
-
http2.0
- http/1.1:客户端可以与web服务器连接后,keyi 获取多个web资源;
4.3、http请求
-
客户端-------->发送请求(Request)-------服务器
百度:
Request URL: https://sm.bdimg.com/static/wiseindex/img/favicon64.ico //请求地址
Request Method: GET //get/post方法
Status Code: 200 //状态码 200 代表ok
Remote (远程)Address: 123.52.189.49:443
Host:主机名
1、请求行
- 请求行的请求方式
- 请求方式:Get 、post
- get:请求能够携带的参数比较少,大小有限制,会在浏览器URL的地址栏显示数据内容,不安全但高效;
- post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器URL的地址栏显示数据内容,安全但不高效;
2、消息头
Accept :告诉浏览器,它所支持的数据类型
Accept-Encoding:支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accpet-language:告诉浏览器,他的语言环境
Cache-Control:缓存控制
Connection:告诉服务器,请求完成是断开还是保持链接
4.4、Http响应
- 服务器----响应-----客户端
百度:
cache-control: max-age=2592000 //缓存控制
content--Encoding:gzip // 编码
content-type: image/x-icon //类型
connection:keep-Alive //连接
响应头
Accept :告诉浏览器,它所支持的数据类型
Accept-Encoding:支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accpet-language:告诉浏览器,他的语言环境
Cache-Control:缓存控制
Connection:告诉服务器,请求完成是断开还是保持链接
HOST:主机。。。。/。。。
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位;
响应状态码
200:请求响应成功
3**:请求重定向
- :定位到新的位置
4xx:找不到资源 404
- 资源不存在;
5xx:服务器代码错误 500 502:网关错误
常见面试题:当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
5、Maven
我为什么要学习这个技术?
-
在JavaWeb开发中,需要使用大量Jar包,我们手动导入;
-
如何能够让jar包只自动导入和配置
5.1、架构管理工具
我们目前就是用来方便导入Jar包的
Maven的核心是思想:约定大于配置
- 有约束,不违反;
Maven会规定好你改如如何编写Java代码,必须按照这个规范;
5.2、下载安装Maven
下载后解压即可
5.3配置环境变量
5.4、阿里云镜像加速
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
5.5、本地仓库
在Maven安装目录创建maven-repo文件
并在配置文件中指向该文件;
<localRepository>E:\Maven\apache-maven-3.8.1\maven-repo</localRepository>
5.6、在IDEA走中使用Maven
Maven约定大与配置,我们之后可能会遇到我们写的配置文件,无法导出或者生效的问题,解决方案
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
Maven、的问题
- Maven3.62
- 解决方法:降级Maven版本
- Tomcat闪退
- Maven每次都要配置
- Maven默认版本tomcatT头文件版本更改
Maven仓库的使用
6、Servlet
6.1、Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- Sun在这些API中提供一个接口叫做:Servlet,如果要开发Servlet程序,只需两部:
- 编写一个类,实现Servlet接口
- 把开发的好的Java类部署到Web服务器中
把实现了Servlet接口的Java程序叫做Servlet
6.2、Hello Servlet
-
构建一个普通的Maven项目,删掉里面的src目,以后我们学习就在这个项目建立moudel;这个空的工程就是Maven的主工程
-
关于Maven父子工程的理解:
-
在父项目中有
<modules> <module>lession-1</module> </modules>
-
在子项目中有
<parent> <artifactId>JavaWebBilibili</artifactId> <groupId>com.cxp</groupId> <version>1.0-SNAPSHOT</version> </parent>
-
父项目中的java项目子项目可以直接使用
6.3、Servlet的原理
servlet是由web服务器调用,web服务器在收到浏览器请求后,会:
6.4、Mapping问题
-
一个servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个Servlet可以指定多个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>hello/*</url-pattern> </servlet-mapping>
-
一个Servlet可以指定通用映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
一个Servlet可以指定的前缀
注意
可以在自定义后缀实现请求映射
*的前面不能加项目映射的路径“/”
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.cxp</url-pattern> </servlet-mapping>
-
优先级问题
指定了固定的映射路径优先级最高,如果找不到就会走默认的处理请求
6.5、ServletContext
web容器在启动时,他会为每个web程序都创建一个 对应的ServletContext对象,它代表了当前的web应用
1、共享数据
我在这个Servlet中的数据可以在另一个servlet中使用
2、获取初始化参数
web.xml的配置
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/ssm</param-value>
</context-param>
servlet的内容
ServletContext context=this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().println(url);
3、请求转发
ServletContext context=this.getServletContext();
/*RequestDispatcher getinit = context.getRequestDispatcher("getinit");//转发的请求路径
getinit.forward(req,resp);//调用forward方法实现请求转发*/
context.getRequestDispatcher("getinit").forward(req,resp);
4、读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下常见properties
发现:都被打包在同一个路径下:calsses,我们俗称这个路径为classpath
思路:需要一个文件流
username=root
password=990901cxp..
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/aa.properties");
Properties props = new Properties();
props.load(is);
String username = props.getProperty("username");
String password = props.getProperty("password");
resp.getWriter().println(username);
resp.getWriter().println(password);
}
访问测试即可
6.6、HttpServletresponse
web服务器接受到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象。代表响应的httpServletresponse对象
- 如果要获取客户端请求过来的参数:HttpServletRequest
- 如果要客户端响应一些信息:HttpServletResponse
1、简单分类
- 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
- 负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long 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);
- 响应状态按码
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2 、常见应用
- 向浏览器输出消息
- 下载文件
- 要获取下载的文件路径
- 下载的文件名
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端!
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 1. 要获取下载的文件路径
String realPath ="E:\\IDE\\JavaWebBilibili\\Respinse\\target\\classes\\1.jpg";
System.out.println("下载文件的路径"+realPath);
// 2. 下载的文件名
String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 3. 设置想办法让浏览器(conrtext-Disposition)能够支持下载我们需要的东西
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
// 4. 获取下载文件的输入流
FileInputStream fileIn = new FileInputStream(realPath);
// 5. 创建缓冲区
int length=0;
byte[] buffer = new byte[1024];
//6. 获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 7. 将FileOutputStream流写入到buffer缓冲区, 8. 使用OutputStream将缓冲区中的数据输出到客户端!
while ((length=fileIn.read(buffer))>0){
out.write(buffer,0,length);
}
//关闭流
fileIn.close();
out.close();
}
-
验证码功能
验证码怎么来的
- 前端实现
- 后端实现,需要用到Java的图片类,生产一个图片
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器几秒刷新一次
resp.setHeader("refresh","5");
//在内存中创造一个图片
BufferedImage image = new BufferedImage(500,200,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D peng = (Graphics2D) image.getGraphics();// 笔
//设置图片颜色
peng.setColor(Color.white);
peng.fillRect(0,0,500,200);
//给图片写数据
peng.setColor(Color.black);
peng.setFont(new Font(null, Font.BOLD,30));
peng.drawString(makeNum(),200,50);
//告诉浏览器这个请求用图片打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.addDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片给浏览器
boolean write = ImageIO.write(image, "jpg",resp.getOutputStream());
}
//生成随机数
private String makeNum(){
Random random=new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
//判断数字是否为为7为不够用“0来拼接”
for (int i=0 ;i < 7-num.length();i++){
sb.append("0");
}
num = sb.toString() + num;
return num;
}
- 重定向
一个web资源收到客户端A请求后,B他会通知A客户端访问另外一个web资源C,这个过程叫重定向
常见场景:
-
用户登录
void sendRedirect(String var1) throws IOException;v
面试题:请你聊聊重定向和转发的区别?
相同点:
- 都能实现页面跳转
不同点:
- 请求转发的时候,url不会发生变化
- 重定向时候,url地址栏会发生变化