iOS_WebView_Request_LAMP

H:/1008/00_mac环境下PHP+MySQL+Apache.txt
服务器安装笔记
Apache+PHP+MySQL
说明:
sudo 表示使用管理员权限执行命令,以保护系统文件上会被破坏,使用sudo需要密码
一. vi的快捷键,vi有两种状态,一个是查看状态,一个是编辑状态
esc	退出编辑状态
i	在当前位置插入 insert
I	在一行的开始位置插入
x	删除当前字符
:wq	保存并退出
:q!	直接退出 不保存
/ 	查找


1. Apache 在苹果上的Web服务器,TomCat提供Web服务的
   	单纯浏览的话,配置Apache即可
	1) 启动Apache
	sudo apachectl -k start
	2) 检测Apache运行状态
	打开Safari输入http://localhost,如果看到It works!说明Apache已经启动
	3) Apache默认文档目录是/Library/WebServer/Documents/
	通常上在此目录设置文件

	4) 建立个人网站目录
	a) 在Finder中建立一个Sites的文件夹
	b)
	cd /etc/apache2/users 进入Apache的用户文件夹
	创建一个文件,文件名:用户名.conf
	whoami 可以查看当前的用户名
	sudo vi apple.conf 新建配置文件

	teacher:users apple$ sudo vi apple.conf
	在文件中输入以下内容,其中 /Users/apple/Sites/ 是此前建立Sites文件夹的完整位置
<directory users="" apple="" sites="">
        Options Indexes MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
</directory>
	添加内容之后,在vi中按esc进入查看模式,输入:wq保存并退出

	重新启动Apache
	sudo apachectl -k restart
	测试用户文件夹
	http://localhost/~apple/就可以访问用户文件夹
	访问用户文件夹之前,需要在Sites文件夹中建立一个html文件
	在其中输入



<h1>Hello World!</h1>



2. php
Mac系统默认已经安装php,只是没有激活,要使用php需要修改apache的配置文件
cd /etc/apache2
sudo vi httpd.conf

输入 / 查找php
找到LoadModule php5_module libexec/apache2/libphp5.so
按I到行首
按esc退出编辑状态
按x删除当前字符
:wq 保存并退出

重启apache 
sudo apachectl -k restart
<?php phpinfo(); ?>

3. 配置mysql的快捷方式,不然每次全路径进mysql很麻烦
cd /etc
ls -l bashrc
sudo chmod +w bashrc 修改管理员可以写模式
sudo vi bashrc
在文件末尾加入以下两行
alias mysql='/usr/local/mysql/bin/mysql'
alias mysqladmin='/usr/local/mysql/bin/mysqladmin'

设置管理员密码
mysqladmin -u root password "123"

剩余部分,可参见html文档和sql文件

	
	

H:/1008/01_网络_登录_NSURLRequest_MainViewController.m
//  MainViewController.m
//  网络基础-用户登录
//  Created by apple on 13-10-8.
/*	
	0,GET使用NSURLRequest请求
	  POST使用其子类NSURLMutableRequest请求
	1,下面用类方法,不用设置代理
		方式一,NSURLConnection类方法,异步发送请求
		方式二,NSURLConnection类方法,同步发送请求
	2,下面用对象的方法,要设置代理,并实现代理的各种方法,还要手动[conn start]
		NSURLConnection *conn = [NSURLConnection 
					    connectionWithRequest:request delegate:self];    
		[conn start];
*/
#import "MainViewController.h"
@interface MainViewController () <nsurlconnectiondatadelegate>
@property (weak, nonatomic) UITextField *nameTextField;
@property (weak, nonatomic) UITextField *passwordTextField;
// 从服务器接收的完整数据,用在Connection的代理方法,拼接数据用
@property (strong, nonatomic) NSMutableData *serverData;
@end
@implementation MainViewController
/*
 一. 网络请求的步骤
 
 1. 确定地址NSURL
 2. 建立请求NSURLRequest(GET)或者其子类NSURLMutableRequest(POST)
 3. 使用类方法,直接发送同步或异步请求,在block代码块中处理返回数据~
 3. 如果使用对象方法,并启动连接NSURLConnection
 4. 则要通过代理方法处理网络请求
    遵守协议:NSURLConnectionDataDelegate
 
 二. 网络代理方法
 1. 接收到服务器的响应,服务器要传数据,客户端做接收准备
 2. 接收服务器传输的数据,可能会多次执行,唯一要做的是拼接
 3. 接收数据完成,做后续处理,如果对返回的内容解析
 4. 服务器请求失败,原因很多(网络环境等等)
 5. 向服务器发送数据,此方法仅适用于POST,尤其上传文件,可跟踪进度条
 
 三. GET方法 URLRequest
    在NSURL中,指定参数(如果有,也可以不指定参数),例如:http://www.baidu.com
 
 四. POST方法
    定义一个可变的URLMutableRequest
 
    1) 等待超时的时长
        [request setTimeoutInterval:2.0f];
    2) 请求方式(默认是GET),与大小写无关
        [request setHTTPMethod:@"POST"];
    3)  数据体 data类型
        NSData *body = [string dataUsingEncoding:NSUTF8StringEncoding];
        [request setHTTPBody:body];
 
 五. 同步方法——必须要某个网络请求完成后,才能后续执行,例如网银登录
 
    看到方法参数中包含__autoreleasing字样,在定义的对象名前面加上“&”
    NSURLResponse *response = nil;
    NSError *error = nil;
 
    // 同步操作没有完成,后面的代码不会执行
    NSData *data = [NSURLConnection sendSynchronousRequest:request
						returningResponse:&response error:&error];
    1> 接收到数据,表示工作正常
    2> 没有接收到数据,但是error为nil,表示接收到空数据
       通常服务器没有对该请求做任何响应
    3> error不为空,表示请求出错
 
 六. 类方法,直接异步方法发送请求
 
     [NSURLConnection sendAsynchronousRequest:request
					queue:[NSOperationQueue mainQueue]
					completionHandler:^(NSURLResponse *reponse,
					NSData *data, NSError *error) {
 
        // 请求完成后的数据解析,处理
     }];
 
    异步方法不用等待网络请求结束
 七. NSURLRequest
 
    使用以下实例化方法,可以在实例化的同时,指定请求超时时长。
    1. url
    2. 缓存策略 默认是NSURLRequestUseProtocolCachePolicy
    3. 超时时长
    NSURLRequest *rq = [NSURLRequest requestWithURL:url
				cachePolicy:NSURLRequestUseProtocolCachePolicy
				timeoutInterval:2.0f];
  八. 缓存策略 
	NSURLRequest的cachePolicy属性可以设置缓存策略,
	这是一种内存缓存,非硬盘缓存使用缓存的目的是
	为了使用的应用程序能更快速的响应用户输入,使程序高效的运行。
	有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求
	cachePolicy支持的缓存策略包括:
	NSURLRequest UseProtocolCachePolicy 
		默认的缓存策略,要在协议的实现方法中指定缓存逻辑
	NSURLRequest ReloadIgnoringCacheData 
		忽略缓存从原始地址下载
	NSURLRequest ReturnCacheDataElseLoad 
		没有缓存时从原始地址下载
	NSURLRequest ReturnCacheDataDontLoad 
		只使用缓存,如果不存在缓存,请求失败,
		适用于没有建立网络连接离线模式
	NSURLRequest ReloadIgnoringLocalAndRemoteCacheData
		忽略本地和远程的缓存数据,直接从原始地址下载,
		与NSURLRequestReloadIgnoringCacheData类似
	NSURLRequest ReloadRevalidatingCacheData 
		验证本地数据与远程数据是否相同,如果不同则下载远程数据,
		否则使用本地数据
 */
- (void)viewDidLoad
{
    [super viewDidLoad];
	// 调用自定义方法,设置界面UI
    [self setupUI];
}
// 自定义方法,设置界面UI
- (void)setupUI
{
	// 数组存放的是4个控件,两个标签,两个输入框
    NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:4];
    for (NSInteger i = 0; i < 2; i++) {
        // 1. 两个Label
        UILabel *label = [[UILabel alloc]initWithFrame:
								CGRectMake(20, 20 + i * 40, 80, 40)];
        [self.view addSubview:label];
        [arrayM addObject:label];
    }
    // 2. 两个TextField
    for (NSInteger i = 0; i < 2; i++) {
        UITextField *textField = [[UITextField alloc]initWithFrame:
								CGRectMake(100, 24 + i * 40, 200, 32)];
        // 1) 边框样式
        [textField setBorderStyle:UITextBorderStyleRoundedRect];
        // 2) 文字的垂直对齐
        [textField setContentVerticalAlignment:
							UIControlContentVerticalAlignmentCenter];
        
        [self.view addSubview:textField];
        [arrayM addObject:textField];
    }
    // 3. 设置label
    [(UILabel *)arrayM[0]setText:@"用户名:"];
    [(UILabel *)arrayM[1]setText:@"密码:"];
    self.nameTextField = arrayM[2];
    self.passwordTextField = arrayM[3];
    // 设置密码输入
    [self.passwordTextField setSecureTextEntry:YES];
    // 4. 1个UIButton
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setFrame:CGRectMake(100, 106, 200, 40)];
    [button setTitle:@"登录" forState:UIControlStateNormal];
    [self.view addSubview:button];
	// 为登录按钮监听点击事件
    [button addTarget:self action:@selector(login)
							forControlEvents:UIControlEventTouchUpInside];
}

#pragma mark - 登录按钮,使用Connection类方法,异步或同步发送Post请求,无需代理
- (void)login
{
    NSString *userName = self.nameTextField.text;
    NSString *pwd = self.passwordTextField.text;
    // 同步登录 POST请求
    // 1. 确定地址NSURL
    NSString *urlString = [NSString
		   stringWithFormat:@"http://192.168.3.252/~apple/itcast/login.php"];
    NSURL *url = [NSURL URLWithString:urlString];
    // 2. 建立请求 MutableURLRequest(POST)
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 0) 网络访问超时时间
    [request setTimeoutInterval:2.0f];
    // 1) 请求方式
    [request setHTTPMethod:@"POST"];
    // 2) 数据体,POST请求中创建数据体时,如果有中文,不需要转换
    // 因为dataUsingEncoding已经实现了转码
    NSString *bodyStr = [NSString
				stringWithFormat:@"username=%@&password=%@", userName, pwd];
    // 将NSString转换为NSData
    NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:body];
    // 最后,方式一,NSURLConnection类方法,异步发送请求
    [NSURLConnection sendAsynchronousRequest:request
					queue:[NSOperationQueue mainQueue] 
					completionHandler:^(NSURLResponse *reponse, 
					NSData *data, NSError *error) {        
        if (data != nil) {
			// 通过data生成string,必须用alloc方法
            NSString *str = [[NSString alloc]initWithData:data
								encoding:NSUTF8StringEncoding];
            NSLog(@"服务器返回的内容是:%@", str);
        } else if (data == nil && error == nil) {
            NSLog(@"接收到空数据");
        } else {
            NSLog(@"%@", error.localizedDescription);
        }
    }];
    NSLog(@"come here");
    // 最后,方式二,NSURLConnection类方法,同步发送请求
    // 提示:凡是看到方法参数中包含__autoreleasing字样
    // 都需要传入该对象的地址,也就是在定义的对象名前面加上“&”就可以了
    NSURLResponse *response = nil;
    NSError *error = nil;
    // 同步操作没有完成,后面的代码不会执行
    NSData *data = [NSURLConnection sendSynchronousRequest:request
							returningResponse:&response error:&error];
    // 1> 接收到数据,表示工作正常
    // 2> 没有接收到数据,但是error为nil,表示接收到空数据
    //    通常服务器没有对该请求做任何响应
    // 3> error不为空,表示请求出错
    if (data != nil) {
		// 通过data生成string,必须用alloc方法
        NSString *str = [[NSString alloc]initWithData:data
							encoding:NSUTF8StringEncoding];
        NSLog(@"服务器返回的内容是:%@", str);
    } else if (data == nil && error == nil) {
        NSLog(@"接收到空数据");
    } else {
        NSLog(@"%@", error.localizedDescription);
    }
}
#pragma mark - 私有方法,尽量不要在方法中直接使用属性
#pragma mark POST登录,使用Connection对象的方法,要设置代理
- (void)loginWithPostWithName:(NSString *)userName pwd:(NSString *)pwd
{
    // 1. 确定地址NSURL
    NSString *urlString = [NSString stringWithFormat:
							@"http://192.168.3.252/~apple/itcast/login.php"];
    NSURL *url = [NSURL URLWithString:urlString];
    // 2. 建立请求 NSMutableURLRequest(POST)
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 1) 请求方式
    [request setHTTPMethod:@"POST"];
    // 2) 数据体,POST请求中创建数据体时,如果有中文,不需要转换
    // 因为dataUsingEncoding已经实现了转码
    NSString *bodyStr = [NSString stringWithFormat:
						@"username=%@&password=%@", userName, pwd];
    // 将NSString转换为NSData
    NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:body];
    // 3. 使用Connection对象的方法,要设置代理,和手动start连接
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
															delegate:self];
    // 启动连接,异步连接请求
    [conn start];
    // 服务器通知准备,准备中转数据
    self.serverData = [NSMutableData data];
}
#pragma mark Get登录,使用Connection的对象方法,要设置代理,和手动start连接
- (void)loginWithGetWithName:(NSString *)userName pwd:(NSString *)pwd
{
    // 1. 确定地址NSURL
    NSString *urlString = [NSString stringWithFormat:
			@"http://ip/~apple/itcast/login.php?username=%@&password=%@",
			userName, pwd];
    // 提示:
    // 1) url中如果包含中文字符,需要转换成带百分号的格式
    // 2) 在iOS开发中,如果没有意外,统统使用UTF8的格式
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:
												NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlString];
    // 2. 建立请求NSURLRequest(GET)
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 3. 使用Connection对象的方法,要设置代理,和手动start连接
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
															delegate:self];
    // 启动连接,异步连接请求
    [conn start];
    // 服务器通知准备,准备中转数据
    self.serverData = [NSMutableData data];
}

// NSURLConnection的代理方法,如果是conn对象start,要实现代理里面的方法
#pragma mark 1. 接收到服务器的响应,服务器即将传数据,客户端做接收准备
- (void)connection:(NSURLConnection *)connection
					didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"response --> %@", response);
}
#pragma mark 2. 接收服务器传输的数据,可能会多次执行,只需要拼接即可
- (void)connection:(NSURLConnection *)connection
					didReceiveData:(NSData *)data
{
    // 对每次传输的数据进行拼接,需要中转数据(属性)
    [self.serverData appendData:data];
}
#pragma mark 3. 接收数据完成,做后续处理
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 对方法2拼接的数据Á,做后续处理即可
    NSString *str = [[NSString alloc]initWithData:self.serverData
									encoding:NSUTF8StringEncoding];
    // 对服务器返回的字符串进行处理
    // 1) 从str中找出“用户名”所在的位置>0
    NSRange range = [str rangeOfString:@"用户名"];
    NSLog(@"%@", NSStringFromRange(range));
    NSString *msg = nil;
    if (range.location > 0) {
        // 2) 取用户名后面的字符串,一直到末尾
        NSString *name = [str substringFromIndex:(range.location +
												  range.length)];
        NSLog(@"%@", name);
        
        msg = [NSString stringWithFormat:@"欢迎欢迎:%@", name];
    } else {
        msg = @"用户名或密码错误,请重试!";
    }
    // 3) 欢迎归来
    // 提示用户登录成功
    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示"
					message:msg delegate:nil cancelButtonTitle:@"确定" 
					otherButtonTitles:nil, nil];
    [alertView show];
    // 处理完服务器返回的数据之后,要清空数据
    self.serverData = nil;
}
#pragma mark 4. 服务器请求失败,原因很多(网络环境等等)
- (void)connection:(NSURLConnection *)connection
				didFailWithError:(NSError *)error
{
    NSLog(@"网络请求错误:%@", error.localizedDescription);
}
#pragma mark 5. 向服务器发送数据,此方法仅适用于POST,尤其上传文件
- (void)connection:(NSURLConnection *)connection
			didSendBodyData:(NSInteger)bytesWritten 
			totalBytesWritten:(NSInteger)totalBytesWritten
			totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    NSLog(@"发送数据给服务器,适合进度条更新");
}
@end

</nsurlconnectiondatadelegate>

H:/1008/02_UIWebView_MainViewController.m
//  MainViewController.m
//  UIWebView-演练
//  Created by apple on 13-10-8.
#import "MainViewController.h"
@interface MainViewController ()
@property (weak, nonatomic) UIWebView *webView;
@end
@implementation MainViewController
/*
 WebView加载本地文件可以使用加载数据的方式
    1. NSData 本地文件对应的数据
    2. MIMEType
    3. 编码格式字符串
    4. 相对地址,一般加载本地文件不使用,可以在指定的baseURL中查找相关文件
 
 如果要用UIWebView显示对应的文件,必须知道准确的MIMEType
 但是,不是所有格式的文件都可以通过本地数据的方式加载,即便是知道MIMEType
 
 UIWebView加载内容的三种方式:
 
 1. 加载本地数据文件
    需要制定文件的MIMEType
    编码格式使用@"UTF-8"
 
 2. 加载html字符串
    可以加载全部或者部分hmtl字符串
 
 3. 加载NSURLRequest
    前面两步与NSURLConnection一致
 
 使用HTML5开发应用
 优势:
 1. 跨平台
 2. 审批通过之后,就终身不需要审批,只需要在后台自己随时维护即可
 
 弱势:
 1. 没有办法利用硬件资源,加速剂、手势
 2. 性能不好
 
 部分显示html的功能,可以方便制作新闻客户端阅读部分的UI
 */
- (void)viewDidLoad
{
    [super viewDidLoad];
	// 调用自定义方法,设置UI界面
    [self setupUI];
	// 得到url方式之一:pathForResource+fileURLWithPath
    NSString *path = [[NSBundle mainBundle]pathForResource:@"关于.docx" 
															ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
	// 得到url方式之二:URLForResource
    NSURL *url = [[NSBundle mainBundle]URLForResource:@"iOS6Cookbook.pdf"
														withExtension:nil];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
	// webView loadRequest 即可加载资源
    [self.webView loadRequest:request];
}
// 自定义方法,设置UI界面
- (void)setupUI
{
	// webView 全屏
    UIWebView *webView = [[UIWebView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:webView];
    // 设置webView 检测所有数据类型
    [webView setDataDetectorTypes:UIDataDetectorTypeAll];
    self.webView = webView;
}
#pragma mark - webView 加载html字符串
- (void)loadHTMLString
{
    // HTML5
    // 直接加载HTML字符串,完整的html
    NSString *str = @"<html><head><title>Hello</title></head><body><h1>Hello</h1><ul><li>123</li><li>321</li><li>1234567</li></ul></body></html>";
    // 部分html
    NSString *str1 = @"<h1>Hello</h1><ul><li>123</li><li>321</li><li>1234567</li></ul>";
    [self.webView loadHTMLString:str1 baseURL:nil];
}
#pragma mark - webView loadData: MIMEType:加载pdf文件
- (void)loadPDF
{
    NSString *path = [[NSBundle mainBundle]pathForResource:@"iOS6Cookbook.pdf" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
	// 调用自定义方法 获取指定URL的MIMEType类型
    NSLog(@"%@", [self mimeType:url]);
    // 以二进制数据的形式加载沙箱中的文件,dataWithContentsOfFile
    NSData *data = [NSData dataWithContentsOfFile:path];
    [self.webView loadData:data MIMEType:@"application/pdf"
						textEncodingName:@"UTF-8" baseURL:nil];
}
// 自定义方法 获取指定URL的MIMEType类型
- (NSString *)mimeType:(NSURL *)url
{
    // 1. NSURLRequest
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 2. NSURLConnection
    // 从NSURLResponse可以获取到服务器返回的MIMEType
    // 使用同步方法获取response里面的MIMEType
    NSURLResponse *response = nil;
    [NSURLConnection sendSynchronousRequest:request
						returningResponse:&response error:nil];
    return response.MIMEType;
}
#pragma mark - 加载本地文本文件
- (void)loadText
{
    NSString *path = [[NSBundle mainBundle]pathForResource:@"关于.txt"
														ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
	// 调用自定义方法 获取指定URL的MIMEType类型
    NSLog(@"%@", [self mimeType:url]);
    NSData *data = [NSData dataWithContentsOfFile:path];
    [self.webView loadData:data MIMEType:@"text/plain"
					textEncodingName:@"UTF-8" baseURL:nil];    
}
#pragma mark - 加载本地html文件
- (void)loadHTML
{
    NSString *path = [[NSBundle mainBundle]pathForResource:@"demo.html"
															ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
	// 调用自定义方法 获取指定URL的MIMEType类型
    NSLog(@"%@", [self mimeType:url]);
    // 以二进制数据的形式加载沙箱中的文件
    NSData *data = [NSData dataWithContentsOfFile:path];
    [self.webView loadData:data MIMEType:@"text/html"
					textEncodingName:@"UTF-8" baseURL:nil];
}
@end

H:/1008/03_UIWebView浏览器_MainViewController.m
//  MainViewController.m
//  UIWebView-综合
//  Created by apple on 13-10-8.
#import "MainViewController.h"
@interface MainViewController () <UITextFieldDelegate>
@property (weak, nonatomic) UIWebView *webView;
@end
@implementation MainViewController
/*
 1. 在地址栏中输入要访问的地址,按下回车,webView加载地址栏中的内容
 2. 在地址栏输入file://开头的地址,加载沙箱中的文件 file://关于.txt	
 */
- (void)viewDidLoad
{
    [super viewDidLoad];
	// 调用自定义方法,设置界面UI
    [self setupUI];
}
// 自定义方法,设置界面UI
- (void)setupUI
{
    // 1. 顶部toolbar,宽320,高44
    UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:
								CGRectMake(0, 0, 320, 44)];
    [self.view addSubview:toolBar];
    // 1) TextField可以以UIBarButtonItem的自定义视图的方式加入toolbar
    UITextField *textField = [[UITextField alloc]initWithFrame:
									CGRectMake(10, 6, 200, 32)];
    // 设置边框
    [textField setBorderStyle:UITextBorderStyleRoundedRect];
    // 设置垂直对齐
    [textField setContentVerticalAlignment:
								UIControlContentVerticalAlignmentCenter];
    // 设置清除按钮,当编辑的时候,显示清除按钮
    [textField setClearButtonMode:UITextFieldViewModeWhileEditing];
	// 设置textField的代理
    [textField setDelegate:self];
	// TextField可以以UIBarButtonItem的自定义视图的方式加入toolbar
    UIBarButtonItem *addressItem = [[UIBarButtonItem alloc]
										initWithCustomView:textField];
    // 2) 三个按钮,前进 后退 刷新,并绑定点击事件
    UIBarButtonItem *btn_item_back = [[UIBarButtonItem alloc]
				initWithBarButtonSystemItem:UIBarButtonSystemItemRewind
				target:self action:@selector(goBack)];
    UIBarButtonItem *btn_item_forward = [[UIBarButtonItem alloc]
				initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward
				target:self action:@selector(goForward)];
    UIBarButtonItem *btn_item_F5 = [[UIBarButtonItem alloc]
				initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh 
				target:self action:@selector(refresh)];
    // 将UIBarButtonItem加入toolBar
    [toolBar setItems:@[addressItem, btn_item_back, btn_item_forward, btn_item_F5]];
    // 2. 实例化UIWebView,并用成员变量记住
    UIWebView *webView = [[UIWebView alloc]initWithFrame:
							CGRectMake(0, 44, 320, 416)];
    [self.view addSubview:webView];
    self.webView = webView;
}
// 三个按钮之后退,点击事件
- (void)goBack
{
    [self.webView goBack];
}
// 三个按钮之前进,点击事件
- (void)goForward
{
    [self.webView goForward];
}
// 三个按钮之刷新,点击事件
- (void)refresh
{
	// webView刷新
    [self.webView reload];	
}
// 三个按钮之 使用JS代码 提交表单
- (void)submit_by_js
{
	// webView 可使用JS代码 提交表单
    [self.webView stringByEvaluatingJavaScriptFromString:
						@"document.forms[0].submit(); "];
}

#pragma mark - UITextField代理方法,textFieldShouldReturn,按回车键之后的操作
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    // 1. 按回车键之后的操作 先关闭键盘
    [textField resignFirstResponder];
    // 2. 再让webView加载地址栏中的内容,如果地址栏有内容才加载
    // 关于字符串的比较,消耗性能较大,故判断字符串是否有内容 可使用长度
    // 这样性能更好,此方法适用于所有编程语言
    if (textField.text.length > 0) {
		// 调用自定义方法,根据string类型的url加载资源
        [self loadContentWithURLString:textField.text];
    }
    return YES;
}
// 自定义方法,根据string类型的url加载资源
- (void)loadContentWithURLString:(NSString *)urlString
{
    BOOL hasError = YES;
    // 针对urlString进行判断
    // 1. 如果是http://开头的,说明是web地址,直接生成请求
    if ([urlString hasPrefix:@"http://"]) {        
		// 调用自定义方法,加载url资源,参数是NSURL
        [self loadURL:[NSURL URLWithString:urlString]];
        hasError = NO;
    } else if ([urlString hasPrefix:@"file://"]) {
        // 2. 如果是file://xxx.txt开头的,说明要加载沙箱中的文件
        // 1) 从urlString中取出文件名
        NSRange range = [urlString rangeOfString:@"file://"];
        NSString *fileName = [urlString substringFromIndex:range.length];
        NSLog(@"%@", fileName);
        // 2) 生成沙箱的url
        NSURL *url = [[NSBundle mainBundle]URLForResource:fileName 
												withExtension:nil];
        // 如果url==nil,说明本地没有文件
        if (url != nil) {
            hasError = NO;
        }
        // 3) 调用自定义方法,加载url资源,参数是NSURL
        [self loadURL:url];
    } 
    // 3. 如果输入地址错误,提示用户
    if (hasError) {
        UIAlertView *alerView = [[UIAlertView alloc]
						initWithTitle:@"提示" message:@"地址错误" 
						delegate:nil cancelButtonTitle:@"确定"
						otherButtonTitles:nil, nil];
        [alerView show];
    }
}
// 自定义方法,加载url资源,参数是NSURL
- (void)loadURL:(NSURL *)url
{
    // 2. 建立Request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 3. 加载Request
    [self.webView loadRequest:request];
}
@end

你可能感兴趣的:(ios,request,lamp,webView)