内部跳转 request重复处理业务
重定向: 302
浏览器知道请求一个位置 响应头为location
V14传递中文
post请求
当页面form表单中包含用户隐私信息或有附件上传时,应当使用POST形式提交。 POST会将表单数据包含在请求的消息正文中。 如果表单中没有附件,则正文中包含的表单数据就是一个字符串,而格式就是原GET形式 提交时抽象路径中"?"右侧的内容。 实现: 1:完成HttpServletRequest中的解析消息正文的方法 当页面(reg.html或login.html)中form的提交方式改为POST时,表单数据被包含在正文里,并且 请求的消息头中会出现Content-Type和Content-Length用于告知服务端正文内容。 因此我们可以根据它们来解析正文。 2:将解析参数的操作从parseURI中单独提取出来定义在parseParameter()方法中重用。 parseURI和解析正文方法parseContent都可以调用parseParameter()来重用拆分操作。
* JAVA 反射机制 * 反射是JAVA的动态机制,它允许我们在程序【运行期间】在确定如对象的实例化,方法的调用, * 属性的操作等。 * 反射可以提高代码的灵活性,可扩展性,但是也带来了较慢的运行效率和更对的系统开销。 * 因此反射不应当被过度依赖。 * 如今JAVA中的众多框架都依靠反射机制。
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
/*
Class类
该类的每一个实例是用于表示JVM中已经加载的一个类,所以Class的实例也称为
是其表示的类的【类对象】。
JVM内部每个被加载的类都有且只有一个Class的实例与之绑定。
通过类对象我们可以获取到其表示的类的所有信息(类名,方法,属性等)
使用反射机制操作一个类时的第一步就是获取该类的类对象从而展开调用操作。
获取一个类的类对象方式:
1:类名.class
Class cls = String.class;//获取String的类对象
Class cls = int.class;//获取int的类对象
注:基本类型的类对象仅能通过上述方式获取。
2:Class.forName(String className)
通过指定一个类的完全限定名来获取该类的类对象。
完全限定名格式:包名.类名
Class cls = Class.forName("java.lang.String");//获取String的类对象
3:类加载器ClassLoader
*/
//获取String的类对象
// Class cls = String.class;
// Class cls = ArrayList.class;
/*
java.lang.String
java.util.ArrayList
java.util.HashMap
java.io.FileInputStream
*/
// Class cls = Class.forName("java.lang.String");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个类名:");
String className = scanner.nextLine();
Class cls = Class.forName(className);
//通过字符串的类对象得知字符串这个类的一切信息
String name = cls.getName();//获取类对象所表示的类的名字
System.out.println(name);//完全限定名
name = cls.getSimpleName();//仅获取类名
System.out.println(name);
//获取包名
String pname = cls.getPackage().getName();
System.out.println(pname);
/*
java.lang.reflect.Method
方法对象,与类对象都是反射对象,只不过它的每一个实例仅表示一个方法。
通过方法对象可获获取其表示的方法的一切信息(方法名,返回值类型,参数列表,访问修饰符)
*/
//Class提供的getMethods()方法可以获取其表示的类的所有公开方法(包含从超类继承的方法)
Method[] methods = cls.getMethods();
System.out.println(name+"类共有:"+methods.length+"个公开方法");
for(Method method : methods){//新循环
String methodName = method.getName();
System.out.println(methodName);
}
}
}
package reflect;
import java.util.Scanner;
/**
* 反射机制实例化对象 cls.newInstance()
*/
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
//之前实例化对象
Person person = new Person();
System.out.println(person);
/*
1:加载要实例化对象的类的类对象
2:利用类对象的newInstance()方法实例化
*/
// Class cls = Class.forName("reflect.Person");
/*
java.util.Date
java.util.ArrayList
java.util.HashMap
reflect.Person
reflect.Student
*/
//为什么mvc框架 后写的controller也能new我
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个类名:");
String className = scanner.nextLine();
Class cls = Class.forName(className);
//Class的newInstance()方法使用的是其表示的类的【无参的,公开的构造器实例化】
Object obj = cls.newInstance();//不用person接受 用object向上造型接受
System.out.println(obj);
}
}
package reflect;
/**
* JDK5之后推出的一个特性:变长参数 arg数组
*/
public class ArgsDemo {
public static void main(String[] args) {
dosome(1,"one");
dosome(1,"one","two");
dosome(1,"one","two","three");
dosome(1,"one","two","three","two","three","two","three","two","three","two","three","two","three","two","three","two","three","two","three","two","three");
}
/*
需要注意,变长参数只能是一个方法的最后一个参数。一个方法只能有一个变长参
编译器最终会将变长参数改为数组
*/
public static void dosome(int a,String... arg){
System.out.println(arg.length);
}
}
package reflect;
import java.util.Scanner;
/**
* 反射机制实例化对象 cls.newInstance()
*/
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
//之前实例化对象
Person person = new Person();
System.out.println(person);
/*
1:加载要实例化对象的类的类对象
2:利用类对象的newInstance()方法实例化
*/
// Class cls = Class.forName("reflect.Person");
/*
java.util.Date
java.util.ArrayList
java.util.HashMap
reflect.Person
reflect.Student
*/
//为什么mvc框架 后写的controller也能new我
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个类名:");
String className = scanner.nextLine();
Class cls = Class.forName(className);
//Class的newInstance()方法使用的是其表示的类的【无参的,公开的构造器实例化】
Object obj = cls.newInstance();//不用person接受 用object向上造型接受
System.out.println(obj);
}
}
package reflect;
/**
* 使用反射机制调用方法
* cls.getMethod(“方法名”)
* cls.getMethods(“方法名”)
* method.invoke(obj);
*/
import java.lang.reflect.Method;
import java.util.Scanner;
public class ReflectDemo4 {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.sayHello();
// 获取类对象 Class cls = Class.forName("reflect.Person");
// 实例化对象 Object obj = cls.newInstance();//Person p = new Person();
// 获取方法 Method method = cls.getMethod("sayHello");//sayHello()
// 执行方法 method.invoke(obj);//p.sayHello(); invoke执行 传哪个对象的方法
Scanner scanner = new Scanner(System.in);
System.out.println("请输入类名:");
String className = scanner.nextLine();
System.out.println("请输入方法名:");
String methodName = scanner.nextLine();
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method method = cls.getMethod(methodName);
method.invoke(obj);
}
}