JAVA运行机制

不怕比如相同块橡皮泥,

发送文书

Yii提供这些点子支持各种文件之出殡需求:

yii\web\Response::sendFile(): 发送一个既是的文件及客户端
yii\web\Response::sendContentAsFile():
发送一个文本字符串作为文件及客户端
yii\web\Response::sendStreamAsFile():
发送一个业已在的文书流作为文件及客户端

2.别样平台要出jvm(JAVA运行环境)就好说是class文件

图片 1

顾:编译就是咱眼前用到之 javac
命令

起步引导

每当应用起来解析并处理接受请求之前,要先准备条件。启动引导会于少数只地方执行,入口脚本和行使核心。在输入脚本里,需要注册各个类库的近乎公事自动加载器,加载配置文件,实例化应用中心。

实例化应用核心,会履下核心的构造函数,在构造函数中做这些事:
1、调用
yii\base\Application::preInit()方法,配置高优先级的使性能。
2、注册errorHandler函数
3、调用init方法,运行引导组件。init方法做的从事:1、加载vendor/yiisoft/extensions.php扩展清单文件,创建运行各个扩展的引组件,创建并运行各个零部件和于运之bootstrap属性中声明的各个模块组件。

盖带工作得在拍卖每一次告之前都进展同样不折不扣,因此尽量不要注册太多带组件。

那么咱们怎么运行为?

浏览器跳转

浏览器跳转依赖让发送一个Location
HTTP 头,Yii是如此支持之:可以调用yii\web\Response::redirect()
方法将用户浏览器跳反到一个URL地址,在action中,可以调用缩写版的redirect,栗子:

return
$this->redirect(‘http://example.com/new’,
301);

即时行代码会返回一个响应对象发送给终端用户,除了这个,还足以在redirect()之后再度一直调用send()方法来担保无任何情节增加到应中。栗子:

\Yii::$app->response->redirect(‘http://example.com/new’,
301)->send();

yii\web\Response::redirect()
方法默认会设置响应状态码为302,该状态码会告诉浏览器请求的资源 临时
放在另一样地方及,可传递一个301状态码告知浏览器请求的资源已 永久
重定向到新的地方。

倘手上求是ajax请求,这样发送location是免见面跳转的,解决办法:yii\web\Response::redirect()
方法设置一个价为使跳转的URL的X-Redirect 头,在浏览器用JavaScript
代码读取该头部值然后吃浏览器跳转对应的URL。

1.编写程序

yii处理http请求时,执行的流水线是这样的:

因 JAVA及大多数语言同样是同样栽尖端语言

响应

当用得处理一个请求后,
会生成一个yii\web\Response响应对象并发送给客户端,响应对象涵盖的信息有HTTP状态码,HTTP头和主导内容等,
web应用开发的末尾目的本质上虽是根据不同之乞求构建这些应对象。

HTTP状态码设置方法

Yii::$app->response->statusCode = 200;

HTTP头部设置方法

$headers = Yii::$app->response->headers;
// 增加一个 Pragma 头,已是的Pragma 头不见面给埋。
$headers->add(‘Pragma’, ‘no-cache’);
// 设置一个Pragma 头. 任何已是的Pragma 头都见面叫废除
$headers->set(‘Pragma’, ‘no-cache’);
// 删除Pragma 头并回到去的Pragma 头的值到数组
$values = $headers->remove(‘Pragma’);

一呼百应中心设置方式

Yii::$app->response->content = ‘hello world!’;
而在发送给终端用户之前用格式化,应装 yii\web\Response::format 和
yii\web\Response::data 属性,yii\web\Response::format
属性指定yii\web\Response::data中数量格式化后底样式,栗子:
<pre>
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON;
$response->data = [‘message’ => ‘hello world’];
</pre>

Yii支持以下但直接使用的格式

yii\web\Response::FORMAT_HTML
yii\web\Response::FORMAT_XML
yii\web\Response::FORMAT_JSON
yii\web\Response::FORMAT_JSONP

只要不点名,在action中调用render方法渲染视图默认yii\web\Response::FORMAT_HTML,

方介绍的这些办法可以叫显式地安装,但是大部分情形下通过操作方法的返回值隐式设置,如果想用其他格式,只待以返数据之前设置$response->format即可。

2.编译程序

脚是yii官方文档中的示意图。

2.编译程序

Sessions

session可以通过session 应用组件访问sessions,它是
yii\web\Session 的实例。session组件提供了这些性和艺术:
<pre>
$session = Yii::$app->session;
if ($session->isActive) …// 检查session是否打开
$session->open(); // 开启session
$session->close(); //
关闭session,多次调整用open和close不会见发生错误,因为方法中会优先检查session是否曾经开。
$session->destroy(); // 销毁session中具备已注册之数码

// 获取session中之变量值,这些用法是同样的:

$language = $session->get(‘language’);
$language = $session[‘language’];
$language = isset($_SESSION[‘language’]) ? $_SESSION[‘language’] :
null;

// 设置一个session变量,这些用法是一样的:
$session->set(‘language’, ‘en-US’);
$session[‘language’] = ‘en-US’;
$_SESSION[‘language’] = ‘en-US’;

// 删除一个session变量,这些用法是同等之:
$session->remove(‘language’);
unset($session[‘language’]);
unset($_SESSION[‘language’]);

// 检查session变量是否曾是,这些用法是平的:

if ($session->has(‘language’)) …
if (isset($session[‘language’])) …
if (isset($_SESSION[‘language’])) …

// 遍历所有session变量,这些用法是千篇一律的:

foreach ($session as $name => $value) …
foreach ($_SESSION as $name => $value) …
</pre>
tips:使用session组件访问session数据的时刻,如果session没有机关开启,和透过$_SESSION不同,使用$_SESSION之前需要先实行session_start().

当session数据是数组时,session组件只同意修改第一层数的价,但是好读取第二交汇下的数,栗子:
<pre>
$session = Yii::$app->session;
// 如下代码不见面收效

$session[‘captcha’][‘number’] = 5;
$session[‘captcha’][‘lifetime’] = 3600;

// 如下代码会收效:

$session[‘captcha’] = [
‘number’ => 5,
‘lifetime’ => 3600,
];

// 如下代码也会见生效

echo $session[‘captcha’][‘lifetime’];
</pre>

那么咱们的jvm是哪些运行的也

请求

一个运用的请求是因此yii\web\Request
对象来代表的,该对象提供了请求参数、HTTP头、cookies等信息,可以经request组件获得相应的要对象。

本条组件提供了有些计可以获有关信息:

博请求的参数与章程
yii\web\Request::get()
yii\web\Request::post()
yii\web\Request::getBodyParam()
Yii::$app->request->method,

获取Url信息
倘为请的URL是
http://example.com/admin/index.php/product?id=100,
可以像下描述的那样得到URL的逐条组成部分:

yii\web\Request::url:返回 /admin/index.php/product?id=100,
此URL不包括host info部分。
yii\web\Request::absoluteUrl:返回
http://example.com/admin/index.php/product?id=100,
包含host info的整个URL。
yii\web\Request::hostInfo:返回
http://example.com,
只有host info部分。
yii\web\Request::pathInfo:返回 /product,
这个是进口脚本后,问号之前(查询字符串)的一对。
yii\web\Request::queryString:返回 id=100,问号之后的组成部分。
yii\web\Request::baseUrl:返回 /admin, host info之后,
入口脚本之前的有些。
yii\web\Request::scriptUrl:返回 /admin/index.php, 没有path
info和询问字符串部分。
yii\web\Request::serverName:返回 example.com, URL中的host name。
yii\web\Request::serverPort:返回 80, 这是web服务着运用的端口。

获取HTTP头信息
Yii::$app->request->header: 返回yii\web\HeaderCollection 对象
yii\web\Request::userAgent:返回 User-Agent 头。
yii\web\Request::contentType:返回 Content-Type 头的价值, Content-Type
是请求体中MIME类型数据。
yii\web\Request::acceptableContentTypes:返回用户可承受的始末MIME类型。
返回的花色是以他们的品质得分来排序的,得分最高的种将吃首回到。
yii\web\Request::acceptableLanguages:返回用户可领之言语。
返回的语言是依照他们之偏好层次来排序的。第一单参数代表最优先的言语。

博客户端音
yii\web\Request::userHost 获取host name
yii\web\Request::userIP 获取客户机的IP地址

 

1、服务器收到至来自客户端(比如浏览器)的恳求,服务器(比如nginx)根据部分转化规则把要转发让入口脚本web/index.php
2、入口加班加载配置文件,实例化一个使用。
3、应用通过request应用组件解析路由。
4、应用创建controller实例处理要。
5、controller创建action实例并也这个action执行相关的filter操作。
6、如果其他一个filter验证失败,就未实施之动作,如果一切之filter通过认证,就会继续执行
7、动作会加载数据模型,一般由数据库中读取
8、加载了数据渲染一个view,并且把要的多寡并填充到者view中。
9、渲染得到的结果碰头回到给response组件。
10、response组件把渲染结果回到给浏览器。

先是会见在内存中开创一个jvm

catchAll路由

如果你的web服务整在保护,不思让用户访问,这个时刻可安装catchAll属性,它可以将所有的恳求都分析到跟一个路由。

当即就算假设讲话到一个事物jvm(JAVA虚拟机)

Cookies

Yii使用
yii\web\Cookie对象来表示每个cookie,yii\web\Request(维护请求提交的cookies)
和 yii\web\Response(维护返回给用户之cookies)
通过叫吧’cookies’的性质维护一个cookie集合。

读取cookies,栗子:
<pre>
$cookies = Yii::$app->request->cookies;

// 获取名为 “language” cookie 的价值,如果非设有,返回默认值”en”
$language = $cookies->getValue(‘language’, ‘en’);

// 另一样栽方式取名吧 “language” cookie 的价值
if (($cookie = $cookies->get(‘language’)) !== null) {
$language = $cookie->value;
}

// 可将 $cookies当作数组使用
if (isset($cookies[‘language’])) {
$language = $cookies[‘language’]->value;
}

// 判断是否存在叫也”language” 的 cookie
if ($cookies->has(‘language’)) …
if (isset($cookies[‘language’])) …
</pre>
发送cookies,栗子:
<pre>
$cookies = Yii::$app->response->cookies;
// 于苟发送的应中添加一个初的cookie
$cookies->add(new \yii\web\Cookie([
‘name’ => ‘language’,
‘value’ => ‘zh-CN’,
]));

// 删除一个cookie
$cookies->remove(‘language’);

// 等同于以下删除代码
unset($cookies[‘language’]);
</pre>

3.运转程序

创建action

如若请求路由叫确定了,紧接着就设创造action对象,用来响应者路由。

路由可据此斜线分割成多独做部分,栗子:site/index可以说明为site和index,它们凭借为某一个module、controller或action。

自从路由的首先独片开始,按下的流程同样不良创module、controller或action,如果这些步骤有外不当有,就见面抛出yii\web\NotFoundHttpException。

先找到site对应的controller。

在controller里面找到index的action,如果搜索的到,就创造一个action对象,如果搜索不交,controller会尝试创建一个action和它们相对应

下jvm去说这些class文件

缺省路由

一旦要没有提供切实的路由,这个时节便会见启用yii\web\Application::defaultRoute
属性所指定的缺省路由。该属性之默认值为 site/index,它对 site 控制器的
actionIndex,可以在部署文件中装置该属性。

然后拿硬盘里的class文件加载进来

自定义Session存储

yii\web\Session默认把session数据保存也文件,Yii提供下面这些看似可以保存也不同的款型:

yii\web\DbSession: 保存至数据库
yii\web\CacheSession: 保存到缓存,需要以配置文件被配备相关的休息存组件
yii\redis\Session: 保存到redis

这些session类都支持相同的api,因此切换不同之session类非欲修改以session的代码。

tips:如果通过$_SESSION访问使从定义存储介质的session,需要确保session已经为此yii\web\Session::open()
开启, 因为只有以斯方式中见面登记于定义session存储处理器。

顿时无异篇我们来大概明了一下JAVA的运行机制

路由引导

以入口下部论被调用yii\web\Application::run()
方法时,首先要分析输入的乞求,用request组件的
yii\web\Request::resolve()
方法实现,确定该用谁controller处理要,然后实例化对应之controller处理要,如果要实在不可知给确定拖欠由哪位controller处理,request组件会抛出yii\web\NotFoundHttpException
异常。

他是jdk中一个比较特别的函数

出殡响应###\

用yii\web\Response::send()
方法发送响应,在是办法调用前应的情不见面返回给客户端,默认在yii\base\Application::run()
结尾自动调用,也得手动调用这个艺术强制立刻发送。这个方式以这些步骤发送响应:

触发 yii\web\Response::EVENT_BEFORE_SEND 事件.
调用 yii\web\Response::prepare() 来格式化 yii\web\Response::data 为
yii\web\Response::content.
触发 yii\web\Response::EVENT_AFTER_PREPARE 事件.
调用 yii\web\Response::sendHeaders() 来发送注册之HTTP头
调用 yii\web\Response::sendContent() 来发送响应中心内容
触发 yii\web\Response::EVENT_AFTER_SEND 事件.

一旦yii\web\Response::send()
方法吃实施后,在外地方调用这个方式就见面于忽略,
就是说一旦响应发出后,就无克更追加另外情节。

它为不可直接运行

她好用我们的class文件说明成计算机可以运作的二进制

因而他们话说就是是:一涂鸦编译,到处运行

面前说过class文件是同一种与平台无关的文件

 

次第的兑现是由于源代码来即决定的

3.无论呀平台解释以及一个class文件最后的结果尚且是平的

 

盖可以分成三大部分

源代码就像是程序的神魄,

 

它好以.java文件编译成一个.class文件(字节码)

因此我们以运行JAVA文件之上(java命令)

夫历程就是叫做编译

 

这些源代码都出破例的语法

胡而编译?

例如main函数

外得要使用一定的语法来编排

您想管其成什么则完成由你来支配

并且class文件是千篇一律栽及平台无关之文本

编写程序就是咱面前说之源代码

PS:为什么说JAVA跨平台

1.因编译后底class文件只能于jvm所诠释

这就是说就交运行字节码了

唯独我们计算机连无认得(不可知运行)这些文件

 

也就是说我之所以Windows系统编译好的class文件,拿来Android(前提假设发环境)上运行吧是一模一样的

立即就是用拿我们编辑好的文书(源代码)变成计算机可以运作的机器码(二进制码)

3.运作程序

1.编写程序

我们还清楚有程序只有在内存中才会运作

实在我们的JAVA语言有一个生坏之表征就是跨平台

咱编辑好之代码都为保存成为一个.java的文本

(在面前加上 public  等要字来修饰)

上面说到将源代码编译成字节码。

最后运行程序。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图