您的位置:首页 > 其它

小知识点7

2016-03-19 20:13 218 查看
HttpServletResponse的一些说明
--getWriter()和getOutputStream()的区别
---getWriter() 用于向客户机回送字符数据
---getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)

OutputStream os=response.getOutputStream();
os.write("hello,world".getBytes());


如果我们是回送字符数据,则使用 PrintWriter对象 ,效率高
如果我们是回送字节数据(binary date) ,则只能使用 OutputStream
注意这两个流不能同时使用.比如:

OutputStream os=response.getOutputStream();
os.write("hello,world".getBytes());
PrintWriter out=response.getWriter();
out.println("abc");


就会报错:

java.lang.IllegalStateException: getOutputStream() has already been called for this response


sendRedirect()可以实现请求重定向(可以带数据给下一个页面)。

那么什么是请求重定向呢,一个web资源收到客户端请求之后,通知客户端去访问另一个web资源,这称之为请求重定向。

参数的传递

方式sendRedirect()和session()
需求: 当用户登录成功后,把该用户名字显示在登录成功页面;
①使用sendRedirect()来传递字符参数

缺点是只能传送字符串,不能传对象!
解决思路:

response.sendRedirect("/UsersManager/MainFrame?uname="+username+"&pwd="+password);


基本格式:
response.sendRedirect("servlet的地址?参数名=参数值&参数名=参数值...");
在接受数据的Servlet中:
String 参数=request.getParameter("参数名");
②使用session()来传递字符参数和对象
A.传递字符串
放入session request.getSession.setAttribute("loginUser",username);
取出session 在JSP中通过session取出 request.getSession.getAttribute("loginUser");
B.传递对象
User user= new User();
user.setName("xiaoli");
user.setPassWord("123");
放入session request.getSession.setAttribute("userObj",userObj);
取出session User user=(User)request.getSession.getAttribute("userObj");
---------------------

要使用反射,首先获得类对应的Class对象,这是使用反射的入口!

反射破坏了类的封装性,因为通过反射可以调用类的私有方法

public class TestPrivate{
public static void main(String[] args) throws Exception{
Private p = new Private();
Class<?> classType = p.getClass();
Method method = classType.getDeclaredMethod("sayHello",
new Class[] { String.class });
method.setAccessible(true);//压制Java的访问控制检查
String str = (String)method.invoke(p, new Object[]{"zhangsan"});
System.out.println(str);
}
}


public class TestPrivate2{
public static void main(String[] args) throws Exception{
Private2 p = new Private2();
Class<?> classType = p.getClass();
Field field = classType.getDeclaredField("name");
field.setAccessible(true);//压制Java对访问修饰符的检查
field.set(p, "lisi");
System.out.println(p.getName());
}
}


1. 要想使用反射,首先需要获得待处理类或对象所对应的 Class 对象。
2. 获取某个类或某个对象所对应的 Class 对象的常用的 3 种方式:
a) 使用 Class 类的静态方法 forName: Class.forName(“java.lang.String”);
b) 使用类的.class 语法: String.class;
c) 使用对象的 getClass()方法: String s = “aa”; Class<?> clazz = s.getClass();
3. 若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
a) 先获得 Class 对象,然后通过该 Class 对象的 newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
b) 先获得 Class 对象,然后通过该对象获得对应的 Constructor 对象,再通过该 Constructor
对象的 newInstance()方法生成:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(new Object[]{});
4. 若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
Object obj = cons.newInstance(new Object[]{“hello”, 3});
5. Integer.TYPE 返回的是 int,而 Integer.class 返回的是 Integer 类所对应的 Class 对象。

public class InvokeTester {
public int add(int num1,int num2) {
return num1 + num2;
}

public String echo(String name) {
return "hello:" + name;
}

public static void main(String[] args) throws Exception{
//传统的调用方式
//InvokeTester test = new InvokeTester();
//System.out.println(test.add(1, 2));
//System.out.println(test.echo("tom"));
//如果想通过反射操纵一个类,首先要获得Class对象。
Class clazz = InvokeTester.class;
//生成类的一个实例
Object invokeTester = clazz.newInstance();
//想调用某个方法,必须获得这个方法对应的Method对象
//第一个参数是方法的名字,第二个参数是方法参数对应的Class数组
Method addMethod = clazz.getMethod("add", new Class[]{int.class, int.class});
//Method对象的invoke方法实现调用,哪个对象的方法,实参以Object数组的形式出现
Object result = addMethod.invoke(invokeTester, new Object[]{1, 2});
System.out.println(result);
System.out.println("----------------");
Method echoMethod = clazz.getMethod("echo", new Class[]{String.class});
Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
System.out.println((String)result2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: