既然是初学,你管他什么原理呢,只要知道在什么场景下用什么方法即可。
第1、2、3种方式之间没什么关系都是跳转的不同实现方式。第1、2种方式的区别就是 转发和重定向的区别,网上有详细的介绍不赘述。
第3种方式就是用最原始的方法将内容输出给客户端,jsp中的内容就是以这种方式输出到客户端的,为了将java和html代码分离开才用jsp来编写页面代码,你也可以不用jsp,直接通过这种方式将html代码以字符串的形式输出给客户端。
第1、2、3种方式之间没什么关系都是跳转的不同实现方式。第1、2种方式的区别就是 转发和重定向的区别,网上有详细的介绍不赘述。
第3种方式就是用最原始的方法将内容输出给客户端,jsp中的内容就是以这种方式输出到客户端的,为了将java和html代码分离开才用jsp来编写页面代码,你也可以不用jsp,直接通过这种方式将html代码以字符串的形式输出给客户端。
你给我说的第三个是response.getWriter().write()与out.print()的区别
我问的是response.getWriter().write()和request.getRequestDispacther().forword()的区别
A.回答这个问题之前应该需要回答一下什么是request和response
Servlet框架是由两个java包组成:javax.servlet和javax.servlet.http;
javax.servlet包:包中定义了所有的servlet类都必须实现的接口和类(与Http协议无关的一般性servlet类);
此包里面的ServetRequest是定义一个对象封装客户向Servlet的请求信息
ServletResponse 定义一个对象辅助Servlet讲请求的信息发送给客户端
javax.servlet.http包:包中定义了采用Http协议通信的HttpServlet类(增加了与Http协议有关的功能);
此包的HttpServletRequest/Resonse 扩展自ServletRequet/Response接口。
request均是客户端行为,response均是服务端行为response.getWriter().write()
可以看一下源码
response.getWriter() 返回的是PrintWriter
/**
* Returns a <code>PrintWriter</code> object that
* can send character text to the client.
* The <code>PrintWriter</code> uses the character
* encoding returned by {@link #getCharacterEncoding}.
* If the response's character encoding has not been
* specified as described in <code>getCharacterEncoding</code>
* (i.e., the method just returns the default value
* <code>ISO-8859-1</code>), <code>getWriter</code>
* updates it to <code>ISO-8859-1</code>.
* <p>Calling flush() on the <code>PrintWriter</code>
* commits the response.
* <p>Either this method or {@link #getOutputStream} may be called
* to write the body, not both.
*
*
* @return a <code>PrintWriter</code> object that
* can return character data to the client
*
* @exception UnsupportedEncodingException
* if the character encoding returned
* by <code>getCharacterEncoding</code> cannot be used
*
* @exception IllegalStateException
* if the <code>getOutputStream</code>
* method has already been called for this
* response object
*
* @exception IOException
* if an input or output exception occurred
*
* @see #getOutputStream
* @see #setCharacterEncoding
*
*/ public PrintWriter getWriter() throws IOException;object that can send character text to the client.
至于response.sendDirect()和request.getRequestDispacther().forword().这个就没必要说了,
如果想想更深的了解下。可以看下源码的注释吧
A.原理这东西只有看源码了。
response.getWriter().print(result);
看下response.getWriter()获取一个PrintWriter继承自Writer
看下write的实现
/**
* Writes a portion of a string.
* @param s A String
* @param off Offset from which to start writing characters
* @param len Number of characters to write
*/
public void write(String s, int off, int len) {
try {
synchronized (lock) {
ensureOpen();
out.write(s, off, len);
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}ensureOpen(); 确保流已经打开了
/**
* Writes a portion of a string.
*
* @param str
* A String
*
* @param off
* Offset from which to start writing characters
*
* @param len
* Number of characters to write
*
* @throws IndexOutOfBoundsException
* If <tt>off</tt> is negative, or <tt>len</tt> is negative,
* or <tt>off+len</tt> is negative or greater than the length
* of the given string
*
* @throws IOException
* If an I/O error occurs
*/
public void write(String str, int off, int len) throws IOException {
synchronized (lock) {
char cbuf[];
if (len <= writeBufferSize) {
if (writeBuffer == null) {
writeBuffer = new char[writeBufferSize];
}
cbuf = writeBuffer;
} else { // Don't permanently allocate very large buffers.
cbuf = new char[len];
}
str.getChars(off, (off + len), cbuf, 0);
write(cbuf, 0, len);
}
}
就是普通的输出流了。
A.流给前台写数据是服务器端行为。request.getRequestDispacther().forword() 是客户端的请求
再说write()是向浏览器发送数据啊
2.最原始的服务器可以说就是用socket直接通信,楼主应该花几分钟自己写个模拟的服务端/客户端程序,会发现你要写数据给另一端时,就是用的流来写;流这东西跟信纸一样,先往纸上写东西,才能投递给远处,当你把端口改成8080,就是个简易的tomcat了;
3.流和转发也没有直接关系,当你使用流时,就是要往另一端写数据通信(或收数据)了,而转发相当于调用另一个类,你这个类处理完了,把你接下来要做的事转给转发的类,由它自己决定接下来是干嘛,是保存文件,是用流写东西,随你定.
4.第四个问题到没试过,不过你要知道,Writer不是边写边传的,你要用flush还是close才能发出去,在这之前你一直是在服务器端写流的,就像信纸没写完是不会拿去投递的.
因此close和转发你先用那个,就会告知服务器你已经处理完,服务器会马上发送,就像return一样,下面语句失效了.
ps:4是猜想,等有时间回来试下,lz你可以自己试试印象更深.