<pre>
Dya1209学习的内容
1.解析字符串
package com.guoyasoft.Day1211;
import java.util.HashMap;
import java.util.Map;
public class stringTools {
//拿到一个字符串:"get http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456 HTTP1.1"
//1.什么都不用想,直接先写一个静态方法(方法名:testString(可以任意取))
public static void testString(){
//2.先打印一句话,打印内容随意些,主要是为了测试是否可以调通这个方法
System.out.println("测试互通");
//3.先把字符串放进一个str的String变量中
String str="get http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456 HTTP1.1";
//4.通过"split"分割器来分割字符串内容,这边写通过空格进行分割,分割成3块内容
//a.首先我们知道是通过空格来进行分割,即是输入str.split(" ")
//b.分割后的内容我们需要给他取个名字,即是数组名diyibu
//c.分割后的内容需要放进一个String数组类型里面(可以通过下表的方式获取)
String[] diyibu = str.split(" ");
//5.分割后的内容我们肯定需要使用啊,所以我们需要通过下表的方式来获取分割后的3个数组名
String fangFa = diyibu[0];//通过下标的方式取截取后的第一块的内容,起了一个变量名叫fangfa
String url = diyibu[1];//同上
String banBen = diyibu[2];//同上
//6.写一个打印语句,测试一下步骤3、4、5是否成功
System.out.println("方法:"+fangFa);
System.out.println("url:"+url);
System.out.println("版本:"+banBen);
//7.由于第二部分url里面的内容我们有些需要有些不需要,就需要用到截取了(比如:我们想要个ip,那我们肯定只需要127.0.0.1;
//所以我们需要把切割后的第二部分内容url再进行截取成一小个一小个我们想要的数据,并存储到一个变量中)
//a.通过indexof来定位想要的内容;b.通过substring来截取需要的内容
int index = url.indexOf("://");//截取://之前的内容,即是http
String protocal = url.substring(0,index);//把截取的内容放大protocal变量中;(0,xieYI)的意思是:从第1位开始截取,截取到://之前结束
System.out.println("协议:"+protocal);//打印一下,看下上面的操作有没有成功,后面所有的打印都是为了验证之前的思想是否成功,就不重复再写了
url = url.substring(index+3);//通过substring来截取掉之前已经成功截取出来的内容,+3即是截取掉"http://"这么一大块
System.out.println("第一次url截取后的内容:"+url);
//后面的截取,一直到"?"之前都是使用以上的方法即可,代码就不重复注释了
index=url.indexOf(":");
String ip=url.substring(0,index);
// request.setIp(ip);
System.out.println("ip="+ip);
url=url.substring(index+1);
System.out.println(url);
index=url.indexOf("/");
String port=url.substring(0,index);
// request.setPort(port);
url=url.substring(index+1);
System.out.println(url);
index=url.indexOf("/");
String prjName=url.substring(0,index);
// request.setPrjName(prjName);
System.out.println("prjName="+prjName);
url=url.substring(index+1);
System.out.println(url);
index=url.indexOf("?");
String resource=url.substring(0,index);
// request.setResource(resource);
System.out.println(resource);
String queryString=url.substring(index+1);
//8.由于后面需要截取的内容是"name=guoyasoft&password=123456",
// 通过这个字符串可以看到我们可以通过"&"进行分割,把分割后的内容变成key,value的形式存在
String[] parameters = queryString.split("&");
//9.由于分割后的内容我们发现"name=guoyasoft"和"password=123456"都是key,value形式存在的,
// 即是知道字段类型,和字段值,此时我们可以使用一个HashMap容器把数据放进容器里面
//a.既然我们已经知道需要使用HashMap容器了,那么先二话不说先new一个HashMap,即new一个HashMap<K, V>()的方法
//b.看到new即是需要在前面有个"=",且取一个变量名,这边取的是map
//c.然后我们需要定义一个Map键值对,且给key,value声明是String类型的,即是Map<String,String>,那么既然Map
//已经定义了key和Value都是String类型的,那么HashMap<K, V>()这个方法,也需要定义和它一样的,即是HashMap<String, String>()
//d.Map报错了,不要慌,鼠标放上去,看下报错信息,有个导入,这边要注意,我们需要选择的是Import'Map'(java.util),导包以后就不会报错了^_^
Map<String, String> map = new HashMap<String, String>();
//e.用一个for循环,把通过"&"分割后的数据循环显示出来即可以使用for(类型 名称:数组名){}
for(String s:parameters){
//10.在for循环中,我们可以通过"="分割的方式来,把key,value的值也分割下,然后通过map.put的方式放入map里面
String[] yiZu = s.split("=");
map.put(yiZu[0], yiZu[1]);//这边为什么要put呢,就是需要把数据放进map里面,且可以根据传入的Key读取到value
System.out.println(yiZu[0]+"="+yiZu[1]);
}
}
}
package com.guoyasoft.Day1211Test;
import net.sourceforge.htmlunit.corejs.javascript.ast.Yield;
import com.guoyasoft.Day1211.stringTools;
public class stringToolsTest {
//1.测试类里面,直接先写一个main方法
public static void main(String[] args) {
//2.调用stringTools类下面的testString方法,Run As一下,看是否可以打印出在stringTools类下写的打印语句
//Run As后的结果:测试互通
stringTools.testString();
//3.在stringTools类下写完第6步后,这边再Run As一下,看一下是否已经成功把数据切割成3份
//Run As的结果如下:
// 方法:get
// url:http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456
// 版本:HTTP1.1
//4.在stringTools类下写完第7步后,这边再Run As一下,看一下是否已经成功截取数据
//Run As的结果如下:
// 协议:http
// 第一次url截取后的内容:127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456
//5.在stringTools类下写完第10步后,这边再Run As一下,看一下数据是否已经成功放入
//Run As的结果如下:
// name=guoyasoft
// password=123456
}
}
2.创建一个Request类,来解析字符串,并进行封装
package com.guoyasoft.Day1211;
import java.util.Map;
public class Request {
//1.把刚才解析的数据,在这边定义一个私有属性
//(需要定义的内容有:fangFa、url、protocal、ip、port、prjName、resource、Map<String, String> map、banBen)
private String fangFa;
private String url;
private String protocal;
private String ip;
private String port;
private String prjName;
private String resource;
private Map<String, String> map;
private String banBen;
//2.通过鼠标右键选择"Socure-Generate Getters and Setters",选择select all,点击ok
//3.通过鼠标右键选择"Socure-Generate toString()...,点击ok
//4.在ParsString中有一个map数组,里面存放的内容都是根据key,value的方式来存放的。为了方便
//取这个key,定义一个getParmameter的方法,在方法里面放一个key,返回一个key,以后就可以直接通过
//map.get(key)的方法来取内容
//key就等于是通讯录中需要寻找的人,这个人的手机号就是value
public String getParmameter(String key){
return map.get(key);
}
public String getFangFa() {
return fangFa;
}
public void setFangFa(String fangFa) {
this.fangFa = fangFa;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getProtocal() {
return protocal;
}
public void setProtocal(String protocal) {
this.protocal = protocal;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getPrjName() {
return prjName;
}
public void setPrjName(String prjName) {
this.prjName = prjName;
}
public String getResource() {
return resource;
}
public void setResource(String resource) {
this.resource = resource;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public String getBanBen() {
return banBen;
}
public void setBanBen(String banBen) {
this.banBen = banBen;
}
}
3.在stringTools 类下,把原来public static void testString()更改为public static Request testString(String str) ,且加上request返回对象
Request:方法名——是一个有返回值的方法,返回的是Request类型的对象;之前的void是一个空的方法,是没有返回值的;
1)public static void testString()中的void改为Request,这时候发现testString()报错了,不要慌,看下报错信息(This method must return a result of type Request)——英文翻译过来就是大白话:此方法必须返回类型请求的结果。
image.png2)选择"Add return statement"(百度翻译:添加返回语句)
image.png3)我们需要调用Request类下的方法,那么就需要加上一个request返回结果,通过request.的方式快捷的去调用Request类下的方法
那么添加了request返回结果,但是我们没有去new 一个Request()的实例对象,这个返回结果依然没法用
所以我们需要在stringTools 类的public static Request testString(String str)方法内去new一个实例对象request,即是添加一行代码:Request request = new Request();
4.在stringTools 类下,加上所有需要调用的方法,即是加上以下代码:
1)request.setFangFa(fangFa);
2)request.setUrl(url);
3)request.setBanBen(banBen);
4)request.setProtocal(protocal);
5)request.setIp(ip);
6)request.setPort(port);
7)request.setPrjName(prjName);
8)request.setResource(resource);
9)request.setMap(map);
Day1210学习的内容
一、tomcat_简化版服务调用协议(不含网络)(未完成版)
1.Tomcat
package com.guoyasoft.Day1211;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class Tomcat {
public static void http(String url) throws Exception{
//想通过tomact这个类直接解析之前敲得二个java代码(即是stringTools和Request)
//1.先调取stringTools下的testString()方法,再把调取的方法封装到request对象中,得到以下这行代码
Request request = stringTools.testString(url);
Response response = new Response();
//随便调用一个request中的方法,打印一下,有之前执行stringToolsTest成功后的返回结果,则表示tomcat已经和早上的另外个java互通了
//2.通过request对象.出getFangFa(),给到变量resoucre(字符串类型的)
String resoucre = request.getResource();
System.out.println(resoucre);//打印一下resoucre,看看这个方法有没有调通,在TomcatTest类中运行main方法
//3.输入一个配置文件(InputStream:输入流;File:文件),假设这边需要一个web.properties文件
//a.在任意一个包下新建一个file文件,输入名称web.properties,就会生成一个web.properties配置文件了
//b.通过FileInputStream打开web.properties文件,放到is变量名中————解析配置文件
InputStream is = new FileInputStream("src/main/java/com/guoyasoft/Day1211/web.properties");
//4.新建Properties 类型对象pro
Properties pro = new Properties();
//5.通过load加载配置文件
pro.load(is);
//6.通过getProperty()方法取值,存到变量className里;()中的resource是上面解析出来的get
String className =pro.getProperty(resoucre);
//7.获得要执行的类的名字(带.class) ,且把类转出Class 的 对象c
Class c = Class.forName(className);
//8.新建实例,并转型成object 的实例obj
Object obj =c.newInstance();
//9.通过反射的方式,获得方法,执行方法并传参数,最后通过invoke激活
//下面的XXX.class是固定写法,Method报错时,应选择Import'method'(java.lang.reflect)
//reflect:反射
//Response.class报错:肯定是在Tomcat中没有去new 一个Response()的实例对象
Method method = c.getMethod("doGet",Request.class,Response.class);
//获取getMethod的方法 方法名 方法参数的类型的类 方法参数的类型的类
method.invoke(obj,new Object[]{request,response});
//执行方法并传参 对象 参数1 参数2
}
}
2.HTTPServlet
package com.guoyasoft.Day1211;
public class HTTPServlet {
public void doGet(Request request,Response response){
System.out.println(request.getFangFa());
}
}
3.Response
package com.guoyasoft.Day1211;
public class Response {
}
4.Login
package com.guoyasoft.Day1211;
public class Login extends HTTPServlet{
//Login继承HTTPServlet
}
5.web.properties
image.png6.TomcatTest
package com.guoyasoft.Day1211Test;
import com.guoyasoft.Day1211.Tomcat;
public class TomcatTest {
public static void main(String[] args) {
//添加一个try catch方便找到异常信息
try {
Tomcat.http("get http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456 HTTP1.1");
} catch (Exception e) {
e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因。
}
}
}
网友评论